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

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

5.5.5.3. パイプ書き込みの実装

write_pipe API呼び出しは、パイプを介したデータ送信を可能にします。

インテルでは、write_pipe関数の簡易版のみをサポートしています。デフォルトでwrite_pipe呼び出しはノンブロッキングです。受信するパケットを収容する容量がパイプにある場合にのみ、パイプ書き込み動作は成功します。

パイプ書き込みを実装するには、次のwrite_pipe関数シグネチャーを含めます。
int write_pipe (write_only pipe <type> pipe_id, const <type> *data);

以下に詳細を説明します。

pipe_idはパイプが接続するバッファーを識別します。これは、対応する読み出しパイプ (read_pipe) のpipe_idと一致する必要があります。

dataはパイプ書き込み動作がパイプに書き込むデータです。これは、パイプのパケットタイプへのポインターになります。パイプへの書き込みは、データポインターのソースアドレス空間によっては、グローバルまたはローカルメモリーのロードにつながる可能性があることに注意してください。

<type> はパイプのデータ幅を定義します。戻り値はパイプ書き込み動作が成功したかどうかを示します。成功した場合の戻り値は0となり、パイプの書き込みが失敗した場合の戻り値は-1です。

以下は、write_pipe API呼び出しの実装を表すコード例です。
/*Declares the writable nonblocking pipe, p, which contains packets of type int*/
__kernel void kernel_write_pipe (__global const long *src,
                                 write_only pipe int p)
{
    for (int i = 0; i < N; i++)
    {
        //Performs the actual writing
		//Emulates blocking behavior via the use of a while loop
		while (write_pipe(p, &src[i]) < 0) { }
    }
}

blocking属性を指定する場合、whileループは不要です。より良いハードウェアの実装を実現するためにインテルでは、カーネルのパイプ引数宣言にブロッキング属性 (__attribute__((blocking))) を指定することで、ブロッキングのwrite_pipe呼び出し機能を提供します。ブロッキングのwrite_pipe呼び出しは必ず成功を返します。

注意:
write_pipe API呼び出しを使用しブロッキングの書き込みパイプを介しデータを送信する際は、パイプがフル (FIFOバッファーがデータでフル) の場合はカーネルがストールすることに注意してください。 インテル® FPGA Dynamic Profiler for OpenCL™ を使用し、パイプのストールを確認してください。