LOOP COUNT 宣言子はベクトル化、ループ変換、ソフトウェアのパイプライン化 (IA-64 アーキテクチャー) で使用されるヒューリスティックに影響します。宣言子で、DO ループの最小、最大、平均の反復数を指定できます。また、よくある値のリストを指定することもできます。この動作は、コンパイラーが複数のバージョンを生成し、完全なアンロールを行うのに役立ちます。
この宣言子は、次のようなさまざまな構文をサポートしています。
構文 |
---|
!DEC$ LOOP COUNT (n) !DEC$ LOOP COUNT = n または !DEC$ LOOP COUNT (n1[,n2]...) !DEC$ LOOP COUNT = n1[,n2]... または !DEC$ LOOP COUNT MAX(n), AVG(n) !DEC$ LOOP COUNT MAX=n, MIN=n, AVG=n |
サポートされる引数は、次のとおりです。
引数 |
説明 |
---|---|
(n) または =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 アーキテクチャー上で、宣言子でループを反復して、ソフトウェアのパイプライン化を有効にする方法を示します。
ループカウント (n) の使用 |
---|
subroutine loop_count(a, b, N) integer :: i, N, b(N), c(N) !DEC$ LOOP COUNT (1000) do i = 1, 1000 b(i) = a(i) + 1 enddo end subroutine loop_count |
次の例では、宣言子を使用して、最小回数を 3 回、最大回数を 10 回、平均回数を 5 回に指定してループを反復させる方法を示します。
ループカウント min、max、avg の使用 |
---|
!DEC$ LOOP COUNT MIN(3), MAX(10), AVG(5) DO i = 1, 15 PRINT i END DO |
DISTRIBUTE POINT 宣言子は、指定された位置でループ分配を行うようコンパイラーに指示します。この宣言子の構文は、次のとおりです。
構文 |
---|
!DEC$ DISTRIBUTE POINT |
ループ分配は、大きなループを小さなループに分配することがあります。この方法により、新しく小さめのループ (IA-64 アーキテクチャー) でソフトウェアのパイプライン化を有効にできます。
宣言子をループの内側に置く場合、分配は宣言子の後で行われ、あらゆるループ伝播の依存性が無視されます。
宣言子をループの前に置く場合、コンパイラーは分配する場所を決定し、データ依存性を監視します。ループの内側に置かれた場合は、コンパイラーは 宣言子の複数のインスタンスをサポートします。
distribute point の使用 |
---|
subroutine dist1(a, b, c, d, N) integer :: i, N, a(N), b(N), c(N), d(N) !DEC$ DISTRIBUTE POINT do i = 1, N b(i) = a(i) + 1 c(i) = a(i) + b(i) ! Compiler will decide where to distribute. ! Data dependency is observed. d(i) = c(i) + 1 enddo end subroutine dist1 subroutine dist2(a, b, c, d, N) integer :: i, N, a(N), b(N), c(N), d(N) do i = 1, N b(i) = a(i) + 1 !DEC$ DISTRIBUTE POINT ! Distribution will start here, ignoring all ! loop-carried dependency. c(i) = a(i) + b(i) d(i) = c(i) + 1 enddo end subroutine dist2 |