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

block_loop/noblock_loop

直後の入れ子構造のループのループ・ブロッキングを有効/無効にします。BLOCK_LOOP はループ・ブロッキングを有効にし、NOBLOCK_LOOP はループ・ブロッキングを無効にします。

構文

#pragma block_loop[clause[,clause]...]

#pragma noblock_loop

引数

clause

次のいずれかです。

factor(expr)

expr は、指定したループのブロッキング係数を示す正のスカラー定数整数式です。factor 節を省略すると、ブロッキング係数はプロセッサーの種類とメモリー・アクセス・パターンを基に決定され、プラグマ直後の入れ子構造のループの指定されたレベルに適用されます。

block_loop プラグマでは 1 つの factor 節を指定できます。

level(level_expr[, level_expr]... )

level_expr は、const1 または const1:const2 形式で指定します。const1 は、レベル m のループを表す正の整数定数 m<= 8 です (直後のループのレベルは 1 です)。const2 は、レベル n のループを表す正の整数定数 n<= 8 です (n > m)。const1:const2 は、レベル const1const2 の入れ子構造のループを表します。

節は任意の順序で指定できます。節を省略すると、コンパイラーは、直後の入れ子構造のループのすべてのレベルに適用できる最適なブロッキング係数を選択します。

説明

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 ; 
    } 
  } 
}