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

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

5.5.3. パイプにおける複数のワークアイテムの順序付け

OpenCL™ Secificationは、ワークアイテムの順序付けを定義していません。 インテル® FPGA SDK for OpenCL™ は、パイプの読み取りおよび書き込み動作の一貫性を維持するため、ワークアイテムの順序を強制します。

複数のワークアイテムによるパイプへのアクセスは、いくつかのシナリオでは有効です。例えばパイプのデータワードが独立している場合や、パイプが制御ロジックに向け実装されている場合に効果があります。複数のワークアイテムがパイプにアクセスにする際に最も注意しなければならないのは、カーネルがデータをパイプへ書き込み、パイプからデータを読み出す順序です。OpenCLパイプは可能な限り、ワークアイテムのパイプへの読み書き動作を決定論的な順序で処理します。そのため、読み出し動作と書き込み動作はカーネル呼び出し間において一貫します。

複数のワークアイテムの決定論的な順序付けにおける要件

決定論的な順序付けの保証にあたり、SDKはパイプ呼び出しがワークアイテムに対し不変であることを次の点に基づき確認します。

  • カーネルを通るすべてのパスがパイプ呼び出しを実行しているか
  • 上の要件が満たされない場合、パイプ呼び出しに到達する分岐条件はいずれも、ワークアイテムに依存しない方法で実行されているか

SDKは、複数のワークアイテムのパイプへのアクセスにおいて決定論的な順序を保証できない場合、パイプが非決定論的な実行をともない適切な順序に定義されない可能性があることを警告します。SDKは通常、パイプ呼び出しをともなうループの実行に、ワークアイテムに依存するコードが存在する場合に、決定的な順序付けを行うことができません。

__kernel void
ordering (__global int * check, global int * data,
          write_only pipe int __attribute__((blocking)) req)
{
    int condition = check[get_global_id(0)];

    if (condition)
    {
        for (int i = 0; i < N; i++)
        {
            process(data);
            write_pipe (req, &data[i]);
        }
    }
	else
    {
        process(data);
    }
}