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

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

3.1.3. チャネルまたはパイプのバッファー推論の最適化

バッファーされたチャネルまたはパイプの手動による追加に加えて、 Intel® FPGA SDK for OpenCL™オフライン・コンパイラーは可能な限りバッファーサイズを調整してカーネルのスループットを向上させます。

コンパイル時に、オフライン・コンパイラーは、相互作用するチャネルまたはパイプ間のスケジューリングの不一致を計算します。これらの不一致は、読み出しと書き込みの動作の不均衡を引き起こす可能性があります。オフライン・コンパイラーは、不均衡を修正するためにバッファー推論最適化を自動的に実行します。

次の例を検討してみましょう。

表 7.  チャネルとパイプのバッファー推論の最適化
チャンネル付きカーネル パイプ付きカーネル
__kernel void producer ( __global const uint * restrict src, const uint iterations) { for(int i = 0; i < iteration; i++) { write_channel_intel(c0,src[2*i]); write_channel_intel(c1,src[2*i+1]); } } __kernel void consumer ( __global uint * restrict dst, const uint iterations) { for(int i = 0; i < iterations; i++) { dst[2*i] = read_channel_intel(c0); dst[2*i+1] = read_channel_intel(c1); } }
__kernel void producer ( __global const uint * restrict src, const uint iterations, write_only pipe uint __attribute__((blocking)) c0, write_only pipe uint __attribute__((blocking)) c1) { for(int i = 0; i < iteration; i++) { write_pipe(c0,&src[2*i]); write_pipe(c1,&src[2*i+1]); } } __kernel void consumer ( __global uint * restrict dst, const uint iterations, read_only pipe uint __attribute__((blocking)) c0, read_only pipe uint __attribute__((blocking)) c1) { for(int i = 0; i < iterations; i++) { read_pipe(c0,&dst[2*i]); read_pipe(c1,&dst[2*i+1]); } }

オフライン・コンパイラーは、カーネル間のチャネルまたはパイプがサイクルを形成できない場合、バッファー推論の最適化を実行します。カーネル間のcyclは、カーネルから、書き込みチャネルまたは書き込みパイプ呼び出しを経由して元のカーネルに戻るパスです。この例では、カーネルproducerのライトチャネルまたはライトパイプコールが10サイクル離れてスケジュールされ、リードチャネルまたはリードパイプコールが15サイクル離れてスケジュールされているとします。C1への読み出し動作が発生する前に、5つの余分な書き込み動作が発生するかもしれないのであり、読み出しが一時的に不一致が存在するとC1に書き込み動作を。この不均衡を修正するために、オフライン・コンパイラーは、ストールを避けるためにc1に5サイクルのバッファーサイズを割り当てます。追加のバッファー容量は、 producerカーネルのc1書き込み動作とconsumerカーネルのc1読み出し動作を切り離します。