インテル® C++ コンパイラー 18.0 デベロッパー・ガイドおよびリファレンス
直後の入れ子構造のループのループ・ブロッキングを有効/無効にします。BLOCK_LOOP はループ・ブロッキングを有効にし、NOBLOCK_LOOP はループ・ブロッキングを無効にします。
#pragma block_loop[clause[,clause]...] |
#pragma noblock_loop |
clause |
次のいずれかです。
節は任意の順序で指定できます。節を省略すると、コンパイラーは、直後の入れ子構造のループのすべてのレベルに適用できる最適なブロッキング係数を選択します。 |
block_loop プラグマにより、入れ子構造のループ内で特定のループの最適化をより適切に制御できます。
ループ・ブロッキング手法を使用することで、block_loop プラグマは 反復回数が多いループを反復回数が少ないグループに分割します。反復回数が少ないグループの実行は、キャッシュ空間の使用効率とパフォーマンスが向上します。
level 節と factor 節を指定しない場合、ブロッキング係数はプロセッサーの種類とメモリー・アクセス・パターンを基に決定され、プラグマ直後の入れ子構造のループのすべてのレベルに適用されます。
noblock_loop プラグマを使用することで、入れ子構造のループのループ・ブロッキングを無効にし、パフォーマンスをチューニングできます。
BLOCK_LOOP プラグマの処理中、ループ伝播の依存は無視されます。
#pragma block_loop factor(256) level(1) /* ブロッキング係数 256 を直後の入れ子構造の */ #pragma block_loop factor(512) level(2) /* ループのトップレベルのループに適用し、 ブロッキング係数 512 を第 2 レベル (最初の入れ子構造のループ) に適用します */ #pragma block_loop factor(256) level(2) #pragma block_loop factor(512) level(1) /* レベルは任意の順序で指定できます */ #pragma block_loop factor(256) level(1:2) /* 隣接するループは範囲として指定できます */ #pragma block_loop factor(256) /* ブロッキング係数はループの入れ子構造 全体に適用されます */ #pragma block_loop /* ブロッキング係数は、プロセッサーの種類とメモリー・ アクセス・パターンを基に決定され、ディレクティブの直後の 入れ子構造のループのすべてのレベルに適用されます */ #pragma noblock_loop /* このディレクティブの直後の入れ子構造のループでは、 どのレベルにもブロッキング係数が適用されません */
次の例について考えてみます。
#pragma block_loop factor(256) level(1:2) for (j = 1 ; j<n ; j++){ f = 0 ; for (i =1 ;i<n i++){ f = f + a[i] * b [i] ; } c [j] = c[j] + f ; }
上記のコードは、ループ・ブロッキング後、次のようになります。
for ( jj=1 ; jj<n/256+1 ; jj+){ for ( ii = 1 ; ii<n/256+1 ;ii++){ for ( j = (jj-1)*256+1 ; j<min(jj*256, n) ;j++){ f = 0 ; for ( i = (ii-1)*256+1 ; i<min(ii*256,n) ;i++){ f = f + a[i] * b [i]; } c[j] = c[j] + f ; } } }