インテル® C++ コンパイラー 18.0 デベロッパー・ガイドおよびリファレンス

distribute_point

指定された位置でループ分配を行うようにコンパイラーに指示します。

構文

#pragma distribute_point

引数

なし

説明

この distribute_point プラグマは、大きなループを小さなループに分割するようにコンパイラーに指示します。レジスターの使用率が高いためにベクトル化のような最適化を実行できない場合に役立ちます。

このプラグマには次の規則が適用されます。

ループ外で distribute_point プラグマを使用する例

#define NUM 1024 
void loop_distribution_pragma1(
       double a[NUM], double b[NUM], double c[NUM],
       double x[NUM], double y[NUM], double z[NUM] ) {
  int i;

  // ループの分配または分割前
  #pragma distribute_point
  for (i=0; i< NUM; i++) {
    a[i] = a[i] + i;
    b[i] = b[i] + i;
    c[i] = c[i] + i;
    x[i] = x[i] + i;
    y[i] = y[i] + i;
    z[i] = z[i] + i;
  } 
}

ループ内で distribute_point プラグマを使用する例

#define NUM 1024 
void loop_distribution_pragma2(
       double a[NUM], double b[NUM], double c[NUM],
       double x[NUM], double y[NUM], double z[NUM] ) {
  int i;

  // ループの分配または分割後
  for (i=0; i< NUM; i++) {
    a[i] = a[i] +i;
    b[i] = b[i] +i;
    c[i] = c[i] +i;
    #pragma distribute_point
    x[i] = x[i] +i;
    y[i] = y[i] +i;
    z[i] = z[i] +i;
  } 
}

ループ内とループ外で distribute_point プラグマを使用する例

void dist1(int a[], int b[], int c[], int d[]) {
  #pragma distribute_point 
    // 分配する場所はコンパイラーにより自動的に 
    // 決定され、データ依存性が監視される
  for (int i=1; i<1000; i++) {
    b[i] = a[i] + 1;
    c[i] = a[i] + b[i];
    d[i] = c[i] + 1;
  } 
}
 
void dist2(int a[], int b[], int c[], int d[]) {
  for (int i=1; i<1000; i++) {
    b[i] = a[i] + 1;

    #pragma distribute_point 
      // ここから分配を開始する
      // ループ伝播の依存はすべて無視される
      c[i] = a[i] + b[i];
      d[i] = c[i] + 1;
  } 
}