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

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

12.4.1. get_compute_id() 関数を使用した複製カーネルのカスタマイズ

それぞれの違いがわずかで、共通するコードを多く持つ複数の計算ユニットを作成するには、num_compute_units (X,Y,Z) 属性を使用しているカーネルでget_compute_id() 組み込み関数を呼び出します。
重要: get_compute_id() 関数は、autorunおよびmax_global_work_dim(0) カーネル属性を使用するカーネルにのみ使用することができます。

計算IDの取得は、カーネルをソースコードに複写し、各カーネルのコピーに特定のコードを追加することに代わる有用な方法です。カーネルがnum_compute_units(X,Y,Z) 属性を使用し、get_compute_id() 関数を呼び出すと、 インテル® FPGA SDK for OpenCL™オフライン・コンパイラーは固有の計算IDを各計算ユニットに割り当てます。その後get_compute_id() 関数は、それらの固有の計算IDを取得します。計算IDを使用することで、関連付けられている計算ユニットの動作を指定し、同じカーネルのソースコードから派生した他の計算ユニットと異なる動作をさせることが可能です。例えば、get_compute_id() の戻り値を使用しチャネルの配列にインデックスを付け、各計算ユニットが読み書きするチャネルを指定することができます。

num_compute_units属性は最大3つの引数を受け取ります (num_compute_units(X,Y,Z))。get_compute_id() 関数とともにこの属性を使用すると、1次元、2次元および3次元のロジック配列の計算ユニットを作成することが可能になります。計算ユニットの1D配列の使用例には、線形パイプラインのカーネル (カーネルのデイジーチェーンとも呼ばれる) があります。計算ユニットの2D配列の使用例は、カーネルのシストリック・アレイです。

図 23. 4x4配列の計算ユニットの概略図次のコード例は、num_compute_units(4,4)を単一ワークアイテム・カーネルで指定しており、これは4x4=16の計算ユニットで構成される4x4配列になります。
__attribute__((max_global_work_dim(0)))
__attribute__((autorun))
__attribute__((num_compute_units(4,4)))
__kernel void PE() {

   row = get_compute_id(0);
   col = get_compute_id(1);

   …
}

3D配列の計算ユニットにおいては、論理計算ユニット配列の計算ユニットのX、Y、Z座標を、get_compute_id(0)get_compute_id(1)get_compute_id(2)をそれぞれ使用することで取得できます。この場合のAPIは、ワークアイテムの組み込み関数API (get_global_id()get_local_id()get_group_id()) と非常に類似しています。

グローバルID、ローカルID、およびグループIDは、ホストがカーネルを呼び出す方法によってランタイムで変化します。ただし、計算IDはコンパイル時に認識されるため、オフライン・コンパイラーは各計算ユニットに最適化されたハードウェアを生成できます。