prefetch/noprefetch

データ・プリフェッチが生成される/されないように指定して、コンパイラーが使用するヒューリスティックに影響を与えます。

構文

このプラグマペアの一般的な構文は次のとおりです。

#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 プロセッサーでのみサポートされています。このプラグマは、データ・プリフェッチがメモリー参照で生成されないように指定します。これは、コンパイラーが使用するヒューリスティックに影響を与えます。

例 1

次の例は、noprefetch および prefetch プラグマの使用方法を示します。

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

#pragma noprefetch b

#pragma prefetch a

for(i=0; i<m; i++)

{

  a[i]=b[i]+1;

}

例 2

次の例は、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;

}

例 3

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

}

関連情報

memref_control プラグマ