インテル® C++ コンパイラー XE 13.1 ユーザー・リファレンス・ガイド
コンパイラーにより、メモリーからデータ・プリフェッチを発行するか (prefetch)、またはデータ・プリフェッチ機能を無効 (noprefetch) にします。このプラグマは、インテル® MIC アーキテクチャーにのみ適用されます。
#pragma prefetch #pragma prefetch [var1 [: hint1 [: distance1]] [, var2 [: hint2 [: distance2]]]...] #pragma noprefetch [var1 [, var2]...] |
prefetch プラグマは、コンパイラーにメモリーのデータ・プリフェッチを生成するヒントを与えます。これは、コンパイラーが使用するヒューリスティックに影響します。データをプリフェッチすると、メモリー・レイテンシーの影響を最小限に抑えられます。
引数を使用せずに #pragma prefetch を指定すると、直後のループにアクセスされたすべての配列がプリフェッチされます。
ループの前に #pragma prefetch を置いて、ループ内で式 A(j) を使用する場合、コンパイラーはループ内の A(j+d) にプリフェッチを挿入します。ここで、d はデータをプリフェッチするための残りの反復回数で、コンパイラーによって決定されます。
これらの宣言子を使用するには、コンパイラー・オプション -opt-prefetch (コンパイラーの全般の最適化レベルが O2 以上の場合はデフォルトでオン) コンパイラー・オプションを指定する必要があります。
noprefetch プラグマは、コンパイラーにメモリーのデータ・プリフェッチを生成しないようヒントを与えます。これは、コンパイラーが使用するヒューリスティックに影響します。
例 1: prefetch プラグマの使用
次の例は、prefetch プラグマの使用方法を示します。
#pragma prefetch htab_p:1:30 #pragma prefetch htab_p:0:6 // Issue vprefetch1 for htab_p with a distance of 30 vectorized iterations ahead // Issue vprefetch0 for htab_p with a distance of 6 vectorized iterations ahead // If pragmas are not present, compiler chooses both distance values for (j=0; j<2*N; j++) { htab_p[i*m1 + j] = -1; }
例 2: noprefetch および prefetch プラグマの使用
次の例は、noprefetch および prefetch プラグマの使用方法を示します。
#pragma noprefetch b
#pragma prefetch a
for(i=0; i<m; i++)
{
a[i]=b[i]+1;
}
例 3: noprefetch および prefetch プラグマの使用
次の例は、noprefetch および prefetch プラグマの別の使用方法を示します。
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;
}