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

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

5.5.5.4. パイプ読み出しの実装

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

インテルでは、read_pipe関数の簡易版のみをサポートしています。read_pipe呼び出しは、デフォルトではノンブロッキングです。

パイプ読み出しを実装するには、次のread_pipe関数シグネチャーを含めます。
int read_pipe (read_only_pipe <type> pipe_id, <type> *data);

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

pipe_idはパイプが接続するバッファーを識別します。これは対応するパイプ書き込み動作 (write_pipe) のpipe_idと一致する必要があります。

dataはパイプ読み出し動作がパイプから読み取るデータです。これはデータ位置へのポインターになります。read_pipe呼び出しは、データポインターのソースアドレス空間によっては、グローバルまたはローカルメモリーのロードにつながる可能性があることに注意してください。

<type> はデータのパケットサイズを定義します。

以下は、read_pipe API呼び出しの実装を表すコード例です。
/*Declares the read_only_pipe that contains packets
of type long.*/
/*Declares that read_pipe calls within the kernel will exhibit
blocking behavior*/
__kernel void kernel_read_pipe(__global long *dst,
                               read_only pipe long __attribute__((blocking)) p)
{
    for (int i = 0; i < N; i++)
    {
        /*Reads from a long from the pipe and stores it
        into global memory at the specified location*/
        read_pipe(p, &dst[i]);
    }
}

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

注意:
パイプが空 (FIFOバッファーが空) の場合、read_pipe API呼び出しでブロッキングの読み出しパイプを介したデータ受信はできません。これを行うとカーネルがストールします。