PAGE_NOCACHEフラグをセットしたVirtualAlloc()を使用して予約・コミットしたメモリにインラインアセンブラでMMX命令のmovqやSSE命令のmovapsなどで読み込み・書きこみ処理を行ったのですが、読み書きのどちらもメモリアクセス時にキャッシングしているようなのです。どうすればVirtualAlloc()でキャッシング禁止したページ領域を確保することはできるのでしょうか?
またVirtualAlloc()に関わらず、キャッシングしないで読み込みメモリアクセスする方法はあるのでしょうか?
情報が少なすぎですね。
基本的に、キャッシュと言っても、
HDD〜メインメモリのキャッシュと、
メインメモリ〜CPUのキャッシュがあるのですが、
どちらのキャッシュを禁止したいのでしょうか?
VirtualAllocは基本的に
メインメモリ〜HDD間のメモリキャッシュになると思うのですが・・・。
それに、何を根拠にキャッシュにヒットしたと思ったのかにもよりますけど・・・。
ブタゴリラさん、res感謝します。
>VirtualAllocは基本的に
>メインメモリ〜HDD間のメモリキャッシュになると思うのですが・・・。
そうですか。メインメモリ〜CPUのキャッシングを禁止できるのかと思ってました。
>それに、何を根拠にキャッシュにヒットしたと思ったのかにもよりますけど・・・。
単に、メモリの連続したアドレスのデータ(1MBほど)をCPUのレジスタに読み込む速度を測定したり、CPUのレジスタからメモリの連続したアドレスにデータ(1MBほど)を書きこんだりして書きこみ速度を測定したりして、リード・ライト速度がPAGE_NOCACHEフラグをセットした場合とセットしない場合で変わらなかったので、CPU内部のキャッシュを使用しているのだと思いました。
私がしたいことは単純で、メモリの連続したアドレスのデータ(1MB以上)をCPUのレジスタに読み込む速度をできるだけ上げたいということです。そのためにはCPU内部のL1,L2キャッシュなどをできるだけ汚さずにレジスタにデータを読み込みんだ方が良いと思うのです。(現に、レジスタからメモリへの書きこみについては、CPU内部のL1,L2キャッシュをできるだけ汚さずに書きこみができるMMX命令のmovntqやSSE命令のmovntpsをインラインアセンブラで使用すれば、書きこみ速度が2倍ほどになります。)
VirtualAlloc()を使えば、もしかするとメモリからCPUレジスタに読み込むときに
L1,L2キャッシュを汚さないようにできるのかもと期待していたのですが。。。
できないようなので残念です。