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

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

5.4.5.3. ブロッキングのチャネル読み取りの実装

read_channel_intel API呼び出しは、チャネルを介したデータの受信を可能にします。
ブロッキングのチャネルの読み取りを実装するには、次のread_channel_intel関数シグネチャーを含めます。
<type> read_channel_intel(channel <type> channel_id);

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

channel_idは、チャネルが接続するバッファーを識別します。これは、対応する書き込みチャネル (write_channel_intel) のchannel_idと一致している必要があります。

<type> は、チャネルのデータ幅を定義します。チャネルデータを読み取るためにカーネルが割り当てる変数が、<type> から変換可能であることを確認してください。

read_channel_intel API呼び出しを実装するコード例を以下に表します。
//Defines chan, a kernel file-scope channel variable.
channel long chan;

/*Defines the kernel, which reads eight bytes (size of long) from the channel and writes it back to global memory.*/
__kernel void kernel_read_channel (__global long * dst); {
  for (int i = 0; i < N; i++) {
  //Reads the eight bytes from the channel.
  dst[i] = read_channel_intel(chan);
  }
}
注意:
チャネルが空の場合 (FIFOバッファーが空の場合)、read_channel_intel API呼び出しで、読み出しチャネルを介したデータの受信はできません。これを行うと、最低1つのデータ要素がFIFOバッファーで利用可能になるまでカーネルはストールします。

ノンブロッキングのチャネル読み取りの実装

ノンブロッキングの読み取りを行うと、データが必ずしも利用可能ではない場合でも、データが利用可能になるまで動作が待機することのないアプリケーションを容易にできるようになります。
ノンブロッキング読み取りシグネチャーはブロッキング読み取りと類似していますが、読み取り動作がチャネルからデータを正常に読み取ったかどうかを示すブールポインターvalidが指定するアドレスを生成します。

読み取りが正常に行われた場合 (validがtrueに設定される)、チャネルから読み取った値はread_channel_nb_intel関数により返されます。読み取りが失敗した場合 (validがfalseに設定される)、read_channel_nb_intel関数の戻り値は定義されません。

ブロッキングのチャネル読み取りを実装するには、次のread_channel_nb_intel関数シグネチャーを使用します。
<type> read_channel_nb_intel(channel <type> channel_id, bool * valid);
次のコードは、ノンブロッキングのチャネル読み取り拡張機能の使用方法を表しています。
channel long chan;

__kernel void kernel_read_channel (__global long * dst) {
  int i = 0;
  while (i < N) {
    bool valid0, valid1;
    long data0 = read_channel_nb_intel(chan, &valid0);
    long data1 = read_channel_nb_intel(chan, &valid1);
    if (valid0) {
       process(data0);
    }
    if (valid1) {
       process(data1); 
    } 
  }
}