3

メモリをテストするために、C で小さなマイクロ ベンチマークを作成しようとしています。

私のマシン (Intel i5) のキャッシュ サイズは 8MB だと思います。

100% のキャッシュ ミス率を確保しながらメモリをテストするためのロジックを誰かが提案できますか?

array1 = malloc(DCACHE_SIZE);
array2 = malloc(DCACHE_SIZE);
while(condition)
    memcpy(&array1[index], &array2[index], sizeof(char));
    index++;

現在、memcpy を使用して、私のプログラムは 1 秒間に 420,782,149 回 memcpy を呼び出しています。

キャッシュを回避するにはどうすればよいですか?

4

4 に答える 4

1

上記のようにキャッシュを無効にするのは非常に複雑ですが、キャッシュを完全に回避するデータ操作方法を使用できます。

最良の方法は、キャッシュ不可のメモリ領域を定義することです。これにより、すべての読み取り/書き込みがすぐにメモリに移動し、キャッシュへの書き込みがスキップされますが、これもより高度なレベルでプログラムを微調整する必要があります。

私が考えることができる最も簡単な解決策は、キャッシュをスキップするストリーミング/非テンポラル命令を直接使用することです - コンパイラがそれらを認識する場合は _mm_stream_si64 / _mm_stream_si32 組み込み関数を試すか、インラインアセンブリセクションで直接 movnt* assmebly 命令ファミリを使用します - そうすべきですプロセッサにほぼ同じ効果があります。単一バイトよりも大きな要素を操作するため、コードを少し再配置する必要がある場合があることに注意してください

于 2013-08-10T10:29:29.287 に答える