reqd_work_group_size - 2020.2 Japanese

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

Document ID
UG1393
Release Date
2021-03-22
Version
2020.2 Japanese

説明

OpenCL API カーネルが OpenCL デバイスでの実行用に投稿されると、ND 範囲 (1、2、または 3 次元) と呼ばれるインデックス空間内で実行されます。これは、OpenCL API ではグローバル サイズと呼ばれます。ワーク グループ サイズは、カーネル計算ユニット (CU) の 1 回の起動で処理可能な ND 範囲の量を定義します。ワーク グループ サイズは、OpenCL API ではローカル サイズとも呼ばれます。OpenCL コンパイラでは、カーネルおよび選択されたデバイスのプロパティに基づいてワーク グループ サイズを決定できます。ワーク グループ サイズ (ローカル サイズ) が決定されたら、ND 範囲 (グローバル サイズ) が自動的にワーク グループに分割され、デバイス上で実行するためにワーク グループがスケジューリングされます。

OpenCL コンパイラでワーク グループ サイズを定義できますが、カーネルの FPGA インプリメンテーションでは、カーネルの REQD_WORK_GROUP_SIZE 属性でワーク グループ サイズを定義することをお勧めします。この属性は、カーネルのカスタム ロジックの生成中にパフォーマンスを最適化するのに推奨されます。

ヒント: FPGA インプリメンテーションの場合は、REQD_WORK_GROUP_SIZE 属性をカーネルのカスタム ロジックの生成中にパフォーマンスを最適化するために使用できるので、この属性を指定することをお勧めします。

OpenCL カーネル関数は、ND 範囲インデックス空間の各点に対して 1 回のみ実行されます。ND 範囲の各点に対するこの処理ユニットは、ワーク アイテムと呼ばれます。ワーク アイテムは、計算ユニットにスケジューリングされるワーク ユニットであるワーク グループにまとめられます。オプションの REQD_WORK_GROUP_SIZE 属性は、clEnqueueNDRangeKernellocal_work_size 引数として使用される必要のある計算ユニットのワーク グループ サイズを定義します。これにより、生成されたコードがこのカーネル用に適切に最適化されます。

構文

カーネル定義の前、またはそのカーネル用に指定されたプライマリ関数の前に配置します。

__attribute__((reqd_work_group_size(<X>, <Y>, <Z>)))

説明:

  • <X>、<Y>、<Z>: カーネルの ND 範囲を指定します。カーネルのワーク グループのサイズを指定する 3 次元行列の各次元を表します。

次の OpenCL C カーネル コードはベクトル加法デザインを記述したもので、2 つの配列のデータの和が 3 つ目の配列に挿入されます。ワーク グループに必要なサイズは 16x1x1 です。このカーネルは 16 回実行され、有効な結果が生成されます。

#include <clc.h>
// For VHLS OpenCL C kernels, the full work group is synthesized
__attribute__ ((reqd_work_group_size(16, 1, 1)))
__kernel void 
vadd(__global int* a,
__global int* b,
__global int* c)
{
int idx = get_global_id(0);
c[idx] = a[idx] + b[idx];
}