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

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

3.1.2. チャネルおよびパイプの実行順序

カーネルプログラムの各チャネルまたはパイプ呼び出しは、FPGAパイプラインで実行される命令に変換されます。 チャネルコールまたはパイプ呼び出しの実行は、有効なWork-Itemがパイプラインを通じて実行される場合に発生します。 ただし、チャネルまたはパイプ呼び出しの間に制御またはデータ依存がない場合でも、それらの実行はカーネル・パイプラインで完全な命令レベルの並列性を達成できないことがあります。

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

表 6.  2つのリードチャネルまたはパイプ呼び出しを持つカーネル
2つのリードチャネルコールを持つカーネル 2つのパイプ呼び出しを読み込んだカーネル
__kernel void
consumer (__global uint*restrict dst) {
  for (int i = 0; i < 5; i++) {
    dst[2*i] = read_channel_intel(c0);
    dst[2*i+2] = read_channel_intel(c1);
  }
}
__kernel void
consumer (__global uint*restrict dst,
  read_only pipe uint 
    __attribute__((blocking)) c0,
  read_only pipe uint
    __attribute__((blocking)) c1)
{
  for (int i = 0; i < 5; i++) {
    read_pipe (c0, &dst[2*i]);
    read_pipe (c1, &dst[2*i+2]);
  }
}

左側のコード例は、2つの読み出しチャネル呼び出しを行います。右側のコード例は、2つの読み出しパイプ呼び出しを行います。ほとんどの場合、カーネルはこれらのチャネル呼び出しまたはパイプ呼び出しを並列に実行します。ただし、チャネルおよびパイプ・コールの実行が順不同で行われる可能性があります。アウト・オブ・シーケンス実行は、C1からの読み出し動作が発生し、C0からの読み出し動作の前に完了することができることを意味します。