clSetKernelArg
が指定したカーネル オブジェクトに対して最初に呼び出されると、XRT ではこのカーネルの後に続く実行に対称 CU のグループが識別されます。そのカーネル用に clEnqueueTask
が呼び出されると、そのグループの対称 CU をどれでも使用してタスクを処理できるようになります。
指定したカーネルの CU すべてが対称の場合は、1 つのカーネル オブジェクトだけでこれらのどの CU にでもアクセスできますが、非対称 CU がある場合は、ホスト アプリケーションが非同期 CU の各グループに対して一意のカーネル オブジェクトを作成する必要があります。この場合、clEnqueueTask
への呼び出しでタスクに使用するカーネル オブジェクトを指定する必要があり、そのカーネルに一致する CU が XRT で使用できるようになります。
特定の計算ユニット用のカーネル オブジェクトの作成
特定の計算ユニットに関連するカーネルを作成する場合、 clCreateKernel
コマンドを使用すると、カーネル オブジェクトがホスト プログラムで作成されるときに CU を指定できます。このコマンドの構文は、次のとおりです。
// Create kernel object only for a specific compute unit
cl_kernel kernelA = clCreateKernel(program,"<kernel_name>:{compute_unit_name}",&err);
// Create a kernel object for two specific compute units
cl_kernel kernelB = clCreateKernel(program, "<kernel_name>:{CU1,CU2}", &err);
重要:
複数のカーネル インスタンスの作成 で説明するように、CU 数はリンク中に
v++
コマンドで使用されるコンフィギュレーション ファイルの connectivity.nk
オプションで指定します。このため、カーネル オブジェクトを作成またはエンキューするには、ホスト プログラムで何を指定したとしても、リンク中に使用されるコンフィギュレーション ファイルで指定したオプションと同じにする必要があります。この場合、カーネルが作成される際、ザイリンクス ランタイムで指定した CU または CU のグループのカーネル ハンドル (kernelA
、kernelB
) が識別されます。これで、ホスト プログラム内の clEnqueueTask
を使用する際に、どのカーネル コンフィギュレーションまたは特定の CU インスタンスを使用するか制御できるようになります。これは、非対称 CU がある場合や、CU のロードおよび優先度管理を実行する場合に役立つことがあります。