xcl_max_work_group_size - 2021.1 Japanese

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

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

説明

4K サイズよりも大型のカーネルを指定する必要がある場合は、REQD_WORK_GROUP_SIZE ではなくこの属性を使用してください。

この属性は、Vitis コア開発キットで reqd_work_group_size 属性によりサポートされるデフォルトの最大ワーク グループ サイズを拡大します。XCL_MAX_WORK_GROUP_SIZE 属性を使用すると、Vitis コア開発キットで 4096 より大型のワーク サイズをサポートできます。

注記: 実際のワーク グループ サイズの制限は、プラットフォームに選択したザイリンクス デバイスによって異なります。

構文

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

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

説明:

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

次は、最適化されていない加算器のカーネル ソース コード例です。このデザインでは、ワーク サイズを行列のサイズ (64x64 など) に設定している以外は、属性は指定されていません。つまり、ワーク グループ全体を実行すると、入力行列 a および b が完全に加算され、結果が出力されます。3 つはすべてグローバル整数ポインターであり、行列の各値は 4 バイトで、オフチップの DDR グローバル メモリに格納されます。

#define RANK 64
__kernel __attribute__ ((reqd_work_group_size(RANK, RANK, 1)))
void madd(__global int* a, __global int* b, __global int* output) {
int index = get_local_id(1)*get_local_size(0) + get_local_id(0);
output[index] = a[index] + b[index];
}

このローカル ワーク サイズ (64, 64, 1) は、グローバル ワーク サイズと同じです。この設定により、合計ワーク サイズ 4096 が作成されます。

注記: これは、標準の OpenCL 属性 REQD_WORK_GROUP_SIZE を使用した場合に Vitis コア開発キットでサポートされる最大ワーク サイズです。ザイリンクス 属性の xcl_max_work_group_size を使用すると、Vitis コア開発キットで 4096 より大型のワーク サイズをサポートできます。

64x64 より大型の行列では、ワーク サイズを定義するのに 1 次元のみを使用する必要があります。つまり、128x128 行列はワーク サイズ (128, 1, 1) のカーネルで演算できます (各実行でデータの行全体または列全体を演算)。