loop count プラグマはベクトル化、ループ変換、ソフトウェアのパイプライン化 (IA-64 アーキテクチャー) で使用されるヒューリスティックに影響します。プラグマで、for ループの最小、最大、平均の反復数を指定できます。また、よくある値のリストを指定することもできます。この動作は、コンパイラーが複数のバージョンを生成し、完全なアンロールを行うのに役立ちます。
このプラグマは、次のようなさまざまな構文をサポートしています。
構文 |
---|
#pragma loop count (n) #pragma loop count = n または #pragma loop count (n1[, n2]...) #pragma loop count = n1[, n2]... または #pragma loop count min(n), max(n), avg(n) #pragma loop count min=n, max=n, avg=n |
サポートされる引数は、次のとおりです。
引数 |
説明 |
---|---|
(n) or =n |
負ではない整数値。コンパイラーは次のループに対し n で指定された回数分の繰り返しを試みますが、反復回数は保証されません。 |
(n1[,n2]...) または = n1[,n2]... |
負ではない整数値。コンパイラーは次のループを n1 または n2 で指定された回数分か、または指定されていない回数分の繰り返しを試みます。この動作により、ループのアンロールにいくらか柔軟性が生まれます。反復数は保証されません。 |
min(n), max(n), avg(n) または min=n, max=n, avg=n |
負ではない整数値。重複がないように任意の順序で 1 つまたは複数の値を指定します。コンパイラーは指定された最大、最小、平均 (n1) 回数で次のループが繰り返されるようにします。min と max では指定された反復回数が保証されます。 |
1 つのループに複数のプラグマを指定できます。ただし、プラグマは、重複させないでください。
次の例は、IA-64 アーキテクチャー上で、プラグマでループを反復して、ソフトウェアのパイプライン化を有効にする方法を示します。
Using Loop Count (n) |
---|
void loop_count(int a[], int b[]) { #pragma loop count (10000) for (int i=0; i<1000; i++) a[i] = b[i] + 1.2; } |
次の例では、プラグマを使用して、最小回数を 3 回、最大回数を 10 回、平均回数を 5 回に指定してループを反復させる方法を示します。
Using Loop Count min, max, avg |
---|
#include <stdio.h> int i; int main() { #pragma loop count min(3), max(10), avg(5) for (i=1;i<=15;i++){ printf("i=%d\n",i); } |
distribute point プラグマは、指定された位置でループ分配を行うようコンパイラーに指示します。このプラグマの構文は次のとおりです。
構文 |
---|
#pragma distribute point |
ループ分配は、大きなループを小さなループに分配することがあります。この方法により、新しく小さめのループ (IA-64 アーキテクチャー) でソフトウェアのパイプライン化を有効にできます。
プラグマをループの内側に置く場合、分配は宣言子の後で行われ、あらゆるループ運搬の依存性が無視されます。
プラグマをループの前に置く場合、コンパイラーは分配する場所を決定し、データ依存性を監視します。ループの内側に置かれた場合は、コンパイラーはプラグマの複数のインスタンスをサポートします。
ループの内側にこれらのプラグマを置く場合、if 文の内側に置くことはできません。
distribute point の使用 |
---|
void dist1(int a[], int b[], int c[], int d[]) { #pragma distribute point // Compiler will automatically decide where to // distribute.Data dependency is observed. 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 // Distribution will start here, // ignoring all loop-carried dependency. c[i] = a[i] + b[i]; d[i] = c[i] + 1; } } |