インテルのみ表示可能 — GUID: yyy1489604310598
Ixiasoft
インテルのみ表示可能 — GUID: yyy1489604310598
Ixiasoft
5.2.2. ネスト化されたループの結合
ネスト化されたループを結合すると、コンポーネントのレイテンシーも低減されるため、カーネルの使用領域をさらに削減することも可能です。ただし場合によっては、ループを結合させることで重要なループを開始させるパスの間隔が長くなる場合があるため、ループの結合がカーネルすべてに適しているとは限りません。
NDRangeカーネルでは、loop_coalesceプラグマによりアノテートされていない場合でも、コンパイラーは自動的にループ結合を試みます。NDRangeカーネルでループを結合することにより、スループットが向上するとともに、カーネルの使用領域が低減します。loop_coalesceプラグマを使用すると、NDRangeカーネルにおけるループの自動結合を防ぐことができます。
#pragma loop_coalesce <loop_nesting_level>
<loop_nesting_level> パラメーターは、コンパイラーが結合を試みるネスト化されたループのレベル数をオプションで指定する整数です。<loop_nesting_level> パラメーターを指定しない場合、コンパイラーはネスト化されたループすべてを結合しようと試みます。
for (A) for (B) for (C) for (D) for (E)
- ループ (A) のループ・ネスト・レベルは1
- ループ (B) のループ・ネスト・レベルは2
- ループ (C) のループ・ネスト・レベルは3
- ループ (D) のループ・ネスト・レベルは4
- ループ (E) のループ・ネスト・レベルは3
- #pragma loop_coalesce 1をループ (A) に指定した場合、コンパイラーはこのネスト化されたループの結合を試みません。
- #pragma loop_coalesce 2をループ (A) に指定した場合、コンパイラーはループ (A) と (B) の結合を試みます。
- #pragma loop_coalesce 3を (A) に指定した場合、コンパイラーはループ (A)、(B)、(C)、(E)の結合を試みます。
- #pragma loop_coalesce 4をループ (A) に指定した場合、コンパイラーはループ (A) からループ (E) すべてのループの結合を試みます。
例
以下は、コンパイラーが2つのループを1つのループに結合する方法を簡単な例にて示しています。
#pragma loop_coalesce for (int i = 0; i < N; i++) for (int j = 0; j < M; j++) sum[i][j] += i+j;
int i = 0; int j = 0; while(i < N){ sum[i][j] += i+j; j++; if (j == M){ j = 0; i++; } }