コンパイラーにより、メモリーからデータプリフェッチを発行するか (prefetch)、またはデータ・プリフェッチ機能を無効 (noprefetch) にします。
#pragma prefetch #pragma prefetch [var1 [: hint1 [: distance1]] [, var2 [: hint2 [: distance2]]]...] #pragma noprefetch [var1 [, var2]...] |
var |
オプションのメモリー参照 (プリフェッチされるデータ) |
hint |
プリフェッチの型を指定するコンパイラーへのオプションのヒント。設定可能な値は、xmmintrin.h ヘッダーで定義される定数です。
この引数を使用するには、var も指定してください。 |
distance |
オプションの引数 (1 以上の値)。対応するロード命令やストア命令の前に、プリフェッチの発行に先立ってループの反復数を示します。この引数を使用するには、var と hint も指定してください。 |
prefetch プラグマは、インテル® Itanium® プロセッサーでのみサポートされています。prefetch プラグマは、コンパイラーにメモリーのデータプリフェッチを生成するヒントを与えます。これは、コンパイラーが使用するヒューリスティックに影響します。データをプリフェッチすると、メモリー・レイテンシーの影響を最小限に抑えられます。
引数を使用せずに #pragma prefetch を指定すると、直後のループにアクセスされたすべての配列がプリフェッチされます。
ループの前に #pragma prefetch を置いて、ループ内で式 A(j) を使用する場合、コンパイラーはループ内の A(j+d) にプリフェッチを挿入します。ここで、d はデータをプリフェッチするための残りの反復回数で、コンパイラーによって決定されます。
prefetch プラグマは、コンパイラーの全般の最適化レベルが -O1 (Linux* オペレーティング・システム) または /O1 (Windows* オペレーティング・システム) よりも高い場合に、直後のループに影響します。-O2 および /O2 は、デフォルトの最適化レベルである点に注意してください。
prefetch プラグマは、インテル® Itanium® プロセッサーでのみサポートされています。 このプラグマは、コンパイラーにメモリーのデータプリフェッチを生成しないようヒントを与えます。これは、コンパイラーが使用するヒューリスティックに影響します。
例 1: noprefetch および prefetch プラグマの使用
次の例は、noprefetch および prefetch プラグマの使用方法を示します。
#pragma noprefetch b
#pragma prefetch a
for(i=0; i<m; i++)
{
a[i]=b[i]+1;
}
例 2: 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;
}
例 3: noprefetch、prefetch、memref_control プラグマの使用
次の例は、IA-64 アーキテクチャーでのみ有効で、prefetch、noprefetch、および memref_control プラグマを一緒に使用する方法を示します。
#define SIZE 10000
int prefetch(int *a, int *b)
{
int i, sum = 0;
#pragma memref_control a:l2
#pragma noprefetch a
#pragma prefetch b
for (i = 0; i<SIZE; i++)
sum += a[i] * b[i];
return sum;
}
#include <stdio.h>
int main()
{
int i, arr1[SIZE], arr2[SIZE];
for (i = 0; i<SIZE; i++) {
arr1[i] = i;
arr2[i] = i;
}
printf("Demonstrating the use of prefetch, noprefetch,\n"
"and memref_control pragma together.\n");
prefetch(arr1, arr2);
return 0;
}