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

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

5.4.3. チャネルに対する複数のワークアイテムの順序付け

OpenCL™ Specificationは、ワークアイテムの順序を定義していません。 インテル® FPGA SDK for OpenCL™ では、チャネルの読み書き動作の合理化を容易にするため、ワークアイテムの順序を強制します。

複数のワークアイテムのチャネルへのアクセスは、いくつかのシナリオにおいて有効です。例えば、チャネルのデータワードが独立している場合や、チャネルがコントロール・ロジックに向けて実装されている場合などです。複数のワークアイテムがチャネルにアクセスする際の主な注意事項は、カーネルがチャネルにデータを書き込み、チャネルからデータを読み取る順序です。SDKのチャネル拡張は、チャネルへのワークアイテムの読み書き動作を可能な限り決定論的な順序で処理します。これにより、読み取りおよび書き込み動作はカーネル呼び出し間で一貫します。

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

決定論的な順序付けの保証にあたり、SDKは以下の特性に基づき、チャネルのアクセスがワークアイテムに対し不変であることを確認します。

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

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

__kernel void ordering (__global int * restrict check,
                        __global int * restrict data) {
  int condition = check[get_global_id(0)];

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