インテルのみ表示可能 — GUID: ewa1416320296962
Ixiasoft
5.1.4. ループで運ばれた依存関係のローカルメモリーへの転送
削除できないループキャリー依存関係の場合は、グローバルメモリーからローカルメモリーへのループキャリー依存関係を持つ配列を移動してIIを改善します。
次の式を検討してみましょう。
1 #define N 128 2 3 __kernel void unoptimized( __global int* restrict A ) 4 { 5 for (unsigned i = 0; i < N; i++) 6 A[N-i] = A[i]; 7 }
=================================================================================== Kernel: unoptimized =================================================================================== The kernel is compiled for single work-item execution. Loop Report: + Loop "Block1" (file unoptimized4.cl line 5) Pipelined with successive iterations launched every 324 cycles due to: Memory dependency on Load Operation from: (file unoptimized4.cl line 6) Store Operation (file unoptimized4.cl line 6) Largest Critical Path Contributors: 49%: Load Operation (file unoptimized4.cl line 6) 49%: Store Operation (file unoptimized4.cl line 6)
グローバル・メモリー・アクセスには長いレイテンシーがあります。この例では、配列A [i]に対するループ搬送依存性は長いレイテンシーを引き起こす。このレイテンシーは、最適化レポートのIIが324に反映されています。ループで運ばれた依存関係をグローバルメモリーからローカルメモリーに転送してII値を減らすには、次のタスクを実行します。
- ループ実行された依存関係を持つ配列をローカルメモリーにコピーします。この例では、配列A[i]はローカルメモリーの配列B [i]になります。
- 配列B [i]に対してループで実行される依存関係を持つループを実行します。
- 配列をグローバルメモリーにコピーし直します。
配列A [i]をローカルメモリに転送すると、配列B [i]になります。ループに依存する依存関係は、 B [i]になります。ローカルメモリーはグローバルメモリーよりもはるかに低いレイテンシーを持つため、II値が向上します。
以下は、再構成されたカーネル最適化です。
1 #define N 128 2 3 __kernel void optimized( __global int* restrict A ) 4 { 5 int B[N]; 6 7 for (unsigned i = 0; i < N; i++) 8 B[i] = A[i]; 9 10 for (unsigned i = 0; i < N; i++) 11 B[N-i] = B[i]; 12 13 for (unsigned i = 0; i < N; i++) 14 A[i] = B[i]; 15 }
下記のような最適化レポートは、324から2へのIIの減少の成功を示しています。
=================================================================================== Kernel: optimized =================================================================================== The kernel is compiled for single work-item execution. Loop Report: + Loop "Block1" (file optimized4.cl line 7) Pipelined well. Successive iterations are launched every cycle. + Loop "Block2" (file optimized4.cl line 10) Pipelined with successive iterations launched every 2 cycles due to: Memory dependency on Load Operation from: (file optimized4.cl line 11) Store Operation (file optimized4.cl line 11) Largest Critical Path Contributors: 65%: Load Operation (file optimized4.cl line 11) 34%: Store Operation (file optimized4.cl line 11) + Loop "Block3" (file optimized4.cl line 13) Pipelined well. Successive iterations are launched every cycle.