インテル® C++ コンパイラー 18.0 デベロッパー・ガイドおよびリファレンス
指定された位置でループ分配を行うようにコンパイラーに指示します。
#pragma distribute_point |
なし
この distribute_point プラグマは、大きなループを小さなループに分割するようにコンパイラーに指示します。レジスターの使用率が高いためにベクトル化のような最適化を実行できない場合に役立ちます。
このプラグマには次の規則が適用されます。
プラグマがループの内部に配置されると、コンパイラーはそのポイントでループを分配します。ループ伝播の依存はすべて無視されます。
ループの内部で、プラグマは if 文の内部には配置できません。
プラグマがループの外部に配置されると、コンパイラーはその内部ヒューリスティックに基づいてループを分配します。コンパイラーはループを分配する場所を決定し、データ依存性を監視します。プラグマがループの内部に配置された場合、コンパイラーはプラグマの複数のインスタンスをサポートします。
ループ外で 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;
}
}
|