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

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

5.5.4. OpenCLのパイプ実装における制約

OpenCL™アプリケーションへのパイプの実装においては、一定のデザイン上の制約があります。

デフォルト動作

デフォルトでは、パイプはノンブロッキング動作を行います。カーネルのパイプにブロッキング動作をさせる場合は、読み取りパイプおよび書き込みパイプを宣言する際に、ブロッキング属性 (__attribute__((blocking))) を指定してください。

エミュレーションのサポート

インテル® FPGA SDK for OpenCL™ Emulatorは、パイプを含むカーネルのエミュレーションをサポートしています。エミュレーターのサポート範囲は、FPGAハードウェアに実装されるOpenCLパイプサポートのサブセットと一致します。

パイプAPIのサポート

現在SDKのパイプの実装は、OpenCL Specification version 2.0の組み込みパイプ関数のすべてをサポートしているわけではありません。パイプAPIにおけるサポートの有無については、OpenCL 2.0 Cプログラミング言語のパイプにおける制約の一覧を参照ください。

シングル・コール・サイト

パイプの読み取りおよび書き込み動作は決定論的に機能しないため、カーネルにはパイプIDごとに1つの呼び出しサイトしか割り当ることができません。例えば、 インテル® FPGA SDK for OpenCL™オフライン・コンパイラーは次のコード例をコンパイルすることができません。

read_pipe(pipe1, &in_data1);
read_pipe(pipe2, &in_data2);
read_pipe(pipe1, &in_data3);

pipe1への2回目のread_pipe呼び出しは、pipe1への2つ目の呼び出しサイトを作成するため、コンパイルは失敗します。

特定のパイプから複数のデータを収集するには、以下に示すようにパイプを複数のパイプに分割します。

read_pipe(pipe1, &in_data1);
read_pipe(pipe2, &in_data2);
read_pipe(pipe3, &in_data3);

1つのパイプIDに対し1つの呼び出しサイトしか割り当てることができないため、パイプを含むループを展開することはできません。次のコードを参照ください。

#pragma unroll 4
for (int i = 0; i < 4; i++)
{
    read_pipe (pipe1, &in_data1);
}

オフライン・コンパイラーは、コンパイル中に次の警告メッセージを発行します。

Compiler Warning: Unroll is required but the loop cannot be unrolled.

フィードバック・パイプとフィードフォワード・パイプ

カーネルのパイプは、read_onlyまたはwrite_onlyのどちらかです。同じパイプを読み書きするカーネルのパフォーマンスは低下します。

カーネルのベクトル化に対するサポート

パイプを使用するカーネルをベクトル化することはできません。つまり、カーネルコードにnum_simd_work_itemsのカーネル属性を含めることはできません。パイプを使用するカーネルをベクトル化すると、複数のパイプマスターが作成され、調停が必要になります。これはOpenCLパイプの仕様ではサポートされていません。

read_pipeとwrite_pipe呼び出しにおける命令レベルの並列性

read_pipewrite_pipe呼び出し間にデータの依存性がない場合、オフライン・コンパイラーはこれらの命令を並行して実行しようと試みます。その結果、オフライン・コンパイラーは、このread_pipewrite_pipe呼び出しを、OpenCLのカーネルコードで表現されているシーケンスに従わない順序で実行する可能性があります。

次のコードのシーケンスを例に示します。

in_data1 = read_pipe(pipe1);
in_data2 = read_pipe(pipe2);
in_data3 = read_pipe(pipe3);

read_pipe呼び出し間にデータの依存性がないため、オフライン・コンパイラーは任意の順序でそれらを実行することができます。