prefetch/noprefetch

 

コンパイラーにより、メモリーからデータプリフェッチを発行するか (prefetch)、またはデータ・プリフェッチ機能を無効 (noprefetch) にします。

構文

#pragma prefetch

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

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

引数

var

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

hint

プリフェッチの型を指定するコンパイラーへのオプションのヒント。設定可能な値は、xmmintrin.h ヘッダーで定義される定数です。

  • _MM_HINT_T0 - 再利用される整数データの場合

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

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

  • _MM_HINT_NTA - 再利用されないデータの場合

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

distance

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

説明

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 アーキテクチャーでのみ有効で、prefetchnoprefetch、および 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;

}

関連情報