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

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

5.4.3.1. チャネルのワークアイテムのシリアル実行

ワークアイテムのシリアル実行とは、順序付けられた実行動作のことで、ワークアイテムのシーケンシャルIDが計算ユニットでの実行順序を決定します。

カーネルにチャネルを実装すると、 インテル® FPGA SDK for OpenCL™オフライン・コンパイラーは、カーネルの動作は計算ユニットに同時に最大1つのインフライトのワークグループを持っているのと同等であるということを適用します。コンパイラーもまた、カーネルがチャネルをシリアル実行することを保証します。よってカーネルは、IDの小さいワークアイテムから実行します。ワークアイテムは識別子 (x、y、z、group) を持ちます。このxyzはローカルの3D識別子であり、groupはワークグループの識別子です。

ワークアイテムID (x0、y0、z0、group0) は、次の条件のいずれかが当てはまる場合、ID (x1、y1、z1、group1) よりも小さいとみなされます。

  • group0 < group1の場合
  • group0 = group1z0 < z1の場合
  • group0 = group1z0 = z1y0 < y1の場合
  • group0 = group1z0 = z1y0 = y1x0 < x1の場合

インクリメンタルIDをともなうワークアイテムは、シーケンシャルに実行されます。例えば、ID (x0、y0、z0、group0) をともなうワークアイテムは、チャネル書き込み呼び出しをまず実行します。その後、ID (x1、y0、z0、group0) をともなうワークアイテムが呼び出しを実行します。この順序を定義することで、システムが外部モデルと検証可能になるよう保証しています。

複数のワークアイテムをともなうループのチャネル実行

次のように、複数のワークアイテムがあるループの本体にチャネルが存在する場合、各ループの反復は後続の反復の前に実行されます。これは、ワークグループの各ワークアイテムのループ反復0が、ワークグループの各ワークアイテムの反復1の前に実行されることを意味します。

__kernel void ordering (__global int * data, int X) {
  int n = 0;
  while (n < X)
  {	
    write_channel_intel (req, data[get_global_id(0)]);
    n++;
  }
}