データ・プリフェッチが生成される/されないように指定して、コンパイラーが使用するヒューリスティックに影響を与えます。
このプラグマペアの一般的な構文は次のとおりです。
#pragma prefetch
#pragma prefetch a,b
#pragma noprefetch
引数 |
説明 |
|---|---|
|
a |
プリフェッチするデータ。 |
|
b |
プリフェッチするデータ。 |
prefetch プラグマは、インテル(R) Itanium(R) プロセッサーでのみサポートされています。このプラグマは、データ・プリフェッチがメモリー参照で生成されるように指定します。これは、コンパイラーが使用するヒューリスティックに影響を与えます。
ループの前に prefetch A を置いて、ループ内で式 A(j) を使用する場合、コンパイラーはループ内の A(j+d) にプリフェッチを挿入します。d はデータをプリフェッチするための残りの反復回数で、コンパイラーによって決定されます。
prefetch プラグマは、-O3 (Linux*) または /O3 (Windows*) オプションがオンの場合にのみサポートされます。-O1、-O2 (Linux) または /O1、/O2 (Windows) が指定された場合にもサポートされます。-O2 および /O2 は、デフォルトの最適化レベルである点に注意してください。
prefetch プラグマは、インテル Itanium プロセッサーでのみサポートされています。このプラグマは、データ・プリフェッチがメモリー参照で生成されないように指定します。これは、コンパイラーが使用するヒューリスティックに影響を与えます。
次の例は、noprefetch および prefetch プラグマの使用方法を示します。
例 1: noprefetch および prefetch プラグマの使用 |
|---|
|
#pragma noprefetch b #pragma prefetch a for(i=0; i<m; i++) { a[i]=b[i]+1; } |
次の例は、noprefetch および prefetch プラグマの別の使用方法を示します。
例 2: 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; } |
次の例は、IA-64 アーキテクチャーでのみ有効で、prefetch、noprefetch、および memref_control プラグマを一緒に使用する方法を説明します。
例 3: noprefetch、prefetch、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; } |