システムでハードウェア プリフェッチャーを無効にしました (core2duo とコア i7 システムの両方)。リンクをたどって無効にします。ハードウェアのプリフェッチをプログラムで無効にするにはどうすればよいですか?
また、プログラムのコンパイル中に -O0 オプションを使用して gcc 最適化を無効にしました。H/W プリフェッチを無効にした後、(キャッシュ内の連続するセットにマップされる配列インデックスにアクセスすることによって) キャッシュから連続するセットにアクセスしていますが、H/W プリフェッチが有効になっている場合でも、以前と同じ結果が得られます。
私の理解によると、ストライド パターンを確認した後、H/W プリフェッチャーが有効になり、上位キャッシュ/メイン メモリから 2 つの連続するキャッシュ ライン (128 バイト) をプリフェッチし、下位キャッシュにロードされます。したがって、キャッシュ ラインにアクセスすると、ミスが発生します。キャッシュラインの場合、それはより高いキャッシュからロードされ、次のキャッシュラインも H/W prefetcher によりプリロードされます。したがって、最初のキャッシュ ラインは上位レベルのキャッシュからロードされるため、アクセス時間は長くなりますが、次のキャッシュ ラインのアクセス時間は、H/W プリフェッチャーが既にロードしているためにすでに L1 キャッシュにあるため、短くなります。
ここで、H/W プリフェッチャーが無効になっている場合、ストライド パターンが検出されても、H/W プリフェッチャーは、隣接する前のキャッシュ ラインへのアクセス中に、上位のキャッシュから次のキャッシュ ラインを事前にロードしません。行にミスがあり、次のレベルのキャッシュからロードされるため、このキャッシュ行のアクセス時間が長くなることが予想されます。
しかし、実際には、H/W プリフェッチャーを無効にした後でも、連続するキャッシュ ラインのアクセス時間が長くなりません。これは、マシンで H/W プリフェッチャーがまったく無効になっていないことを意味します。
私は正しいですか?
また、デフォルトで無効になっている L2 ストリーミング プリフェッチャー (隣接キャッシュ ライン) プリフェッチャーもあります (MSR のビット 19)。
H/W プリフェッチャーが無効になっているかどうかを確認するには? H/W プリフェッチャーが無効になっているかどうかを確認する方法はありますか?
これが私のコードです
#include <sys/time.h>
#include<stdlib.h>
#include<stdio.h>
#include<math.h>
#include <unistd.h>
#include <stdlib.h>
#include <time.h>
int main()
{
int cacheArray[10000],temp;
int i, block = 12;
unsigned long t1,t2,total;
struct timespec tim1,tim2;
for(i=0;i<5;i++)
{
clock_gettime(CLOCK_REALTIME, &tim1);
temp = cacheArray[block*16];
clock_gettime(CLOCK_REALTIME, &tim2);
t1=tim1.tv_sec*1000000000+(tim1.tv_nsec);
t2=tim2.tv_sec*1000000000+(tim2.tv_nsec);
total = t2 - t1;
printf("Accessing %d th block took %lu nanosec \n", block, total);
block =block + 1;
clock_gettime(CLOCK_REALTIME, &tim1);
temp = cacheArray[block*16];
clock_gettime(CLOCK_REALTIME, &tim2);
t1=tim1.tv_sec*1000000000+(tim1.tv_nsec);
t2=tim2.tv_sec*1000000000+(tim2.tv_nsec);
total = t2 - t1;
printf("Accessing %d th block took %lu nanosec \n", block, total);
block = block + 20;
}
}
ここに私のサンプル出力があります:
Accessing 12 th block took 137 nanosec
Accessing 13 th block took 54 nanosec
Accessing 33 th block took 39 nanosec
Accessing 34 th block took 37 nanosec
Accessing 54 th block took 687 nanosec
Accessing 55 th block took 93 nanosec
Accessing 75 th block took 108 nanosec
Accessing 76 th block took 107 nanosec
Accessing 96 th block took 109 nanosec
Accessing 97 th block took 106 nanosec
連続するキャッシュ ライン/ブロックのアクセス タイムは同じか、それより長いと予想されます。H/W プリフェッチャーが無効になっているにもかかわらず、次のキャッシュ ブロック/ラインがキャッシュにロードされる理由は、理論的には、次のキャッシュ ラインがアクセスされていないときに事前にキャッシュにロードされてはならないということです。
提案やリンクは大歓迎です。前もって感謝します 。