Intel® FPGA SDK for OpenCL™: ベスト・プラクティス・ガイド

ID 683521
日付 12/08/2017
Public
ドキュメント目次

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値を減らすには、次のタスクを実行します。

  1. ループ実行された依存関係を持つ配列をローカルメモリーにコピーします。この例では、配列A[i]はローカルメモリーの配列B [i]になります。
  2. 配列B [i]に対してループで実行される依存関係を持つループを実行します。
  3. 配列をグローバルメモリーにコピーし直します。
配列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.