インテル® FPGA SDK for OpenCL™プロ・エディション: プログラミング・ガイド

ID 683846
日付 4/01/2019
Public
ドキュメント目次

5.5.2. パイプデータの動作

パイプに書き込まれたデータは、カーネルプログラムがFPGAデバイスにロードされている限りパイプに残ります。 つまり、パイプに書き込まれたデータは、複数のワークグループやNDRangeの呼び出しにわたり維持されます。ただし、FPGAの再プログラミングにつながるカーネルプログラムの複数の呼び出し、または異なる呼び出しにわたってデータが維持されることはありません。

次のコードを例に示します。

__kernel void producer (write_only pipe uint __attribute__((blocking)) c0)
{
    for (uint i = 0; i < 10; i++)
    {
        write_pipe (c0, &i);
    }
}

__kernel void consumer (__global uint * restrict dst,
                        read_only pipe uint __attribute__((blocking))
                        __attribute__((depth(10))) c0)
{
    for (int i = 0; i < 5; i++)
    {
        read_pipe (c0, &dst[i]);
    }
}

パイプへの読み取り操作では、最初 にパイプに書き込まれたデータがまず読み出されます。パイプデータは、パイプ内のFIFOの順序を維持します。

図 12. パイプにおけるデータFIFOの順序


カーネルproducerは、10個の要素 ([0, 9]) をパイプに書き込みます。カーネルconsumerはNDRangeの呼び出しごとに、パイプから5個の要素を読み出します。最初の呼び出しにおいてカーネルconsumerは、0から4の値をパイプから読み出します。データはNDRange呼び出しにわたり維持されるため、2回目のカーネルconsumer実行時には、5から9の値が読み出されます。

この例の場合、デッドロックの発生を防ぐため、カーネルproducerの1回の呼び出しに対しカーネルconsumerを2回呼び出す必要があります。consumerの呼び出しが2回未満になると、パイプ容量がフルになるためproducerがストールします。consumerの呼び出しが2回を超えると、パイプ内のデータが不足するためconsumerがストールします。