カーネル ハンドルおよび計算ユニット - 2021.1 Japanese

Vitis 統合ソフトウェア プラットフォームの資料: アプリケーション アクセラレーション開発 (UG1393)

Document ID
UG1393
Release Date
2022-03-29
Version
2021.1 Japanese

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 のグループのカーネル ハンドル (kernelAkernelB) が識別されます。これで、ホスト プログラム内の clEnqueueTask を使用する際に、どのカーネル コンフィギュレーションまたは特定の CU インスタンスを使用するか制御できるようになります。これは、非対称 CU がある場合や、CU のロードおよび優先度管理を実行する場合に役立つことがあります。