インテル® C++ コンパイラー 18.0 デベロッパー・ガイドおよびリファレンス

prefetch/noprefetch

コンパイラーにより、メモリーからのデータ・プリフェッチ要求を発行または無効にします。このプラグマは、インテル® MIC アーキテクチャーおよびインテル® アドバンスト・ベクトル・エクステンション 512 (インテル® AVX-512) にのみ適用されます。

構文

#pragma prefetch

#pragma prefetch *:hint[:distance]

#pragma prefetch[var1[: hint1[:distance1]] [, var2[: hint2[:distance2]]]...]

#pragma noprefetch[var1 [,var2]...]

引数

var

オプションのメモリー参照 (プリフェッチされるデータ)

hint

プリフェッチの型を指定するコンパイラーへのオプションのヒント。値は以下のいずれかになります。

  • 1: 再利用される整数データの場合

  • 2: L2 キャッシュから再利用される整数データと浮動小数点データの場合

  • 3: L3 キャッシュから再利用されるデータの場合

  • 4: 再利用されないデータの場合

この引数を使用するには、var も指定してください。

distance

オプションの引数 (1 以上の値)。対応するロード命令やストア命令の前に、プリフェッチの発行に先立つループの反復数を示します。この引数を使用するには、varhint も指定してください。

説明

このプラグマは、コンパイラーにメモリーのデータ・プリフェッチを生成するヒントを与えます。これのヒントは、コンパイラーが使用するヒューリスティックに影響します。データをプリフェッチすると、メモリー・レイテンシーの影響を最小限に抑えられます。

引数を使用せずに prefetch プラグマを指定すると、直後のループにアクセスされたすべての配列がプリフェッチされます。

ループの前に #pragma prefetch を置いて、ループ内で式 A(j) を使用する場合、コンパイラーはループ内の A(j+d) にプリフェッチを挿入します。ここで、d はデータをプリフェッチするための残りの反復回数で、コンパイラーによって決定されます。

#pragma prefetch * を指定すると、hintdistance はループのすべての配列アクセスをプリフェッチします。

これらのプラグマを使用するには、[Q]opt-prefetch コンパイラー・オプションを指定する必要があります (コンパイラーの全般の最適化レベルが O2 以上の場合はデフォルトでオンになります)。

noprefetch プラグマは、コンパイラーにメモリーのデータ・プリフェッチを生成しないようヒントを与えます。これは、コンパイラーが使用するヒューリスティックに影響します。

prefetch プラグマの使用例

#pragma prefetch htab_p:1:30 
#pragma prefetch htab_p:0:6

// ベクトル化された反復で 30 回前に htab_p 向けに vprefetch1 を発行します
// ベクトル化された反復で 6 回前に htab_p 向けに vprefetch0 を発行します
// プラグマが指定されていない場合、コンパイラーが発行に先立つ反復数を決定します。

for (j=0; j<2*N; j++) { htab_p[i*m1 + j] = -1; }

noprefetch および prefetch プラグマの使用例 1

#pragma noprefetch b
#pragma prefetch a 
for(i=0; i<m; i++) { a[i]=b[i]+1; }

noprefetch および prefetch プラグマの使用例 2

for (i=i0; i!=i1; i+=is) {
 
float sum = b[i]; 
int ip = srow[i]; 
int c = col[ip];

#pragma noprefetch col 
#pragma prefetch value:1:80 
#pragma prefetch x:1:40

for(; ip<srow[i+1]; c=col[++ip])
  sum -= value[ip] * x[c];
  y[i] = sum; 
}