0

私は、OpenCL の抽象化と実際のハードウェアとの間のマッピングのより良い直感を開発しようとしています。たとえば、2011 年後半の Macbook pro の構成を使用すると、次のようになります。

1)

Radeon 6770M GPU: http://www.amd.com/us/products/notebook/graphics/amd-radeon-6000m/amd-radeon-6700m-6600m/Pages/amd-radeon-6700m-6600m.aspx#2

「480 ストリーム プロセッサ」は重要な数字だと思います。

2)

一方、OpenCL API では次の数値が得られます。

DEVICE_NAME = ATI Radeon HD 6770M
DRIVER_VERSION = 1.0
DEVICE_VENDOR = AMD
DEVICE_VERSION = OpenCL 1.1 
DEVICE_MAX_COMPUTE_UNITS = 6
DEVICE_MAX_CLOCK_FREQUENCY = 675
DEVICE_GLOBAL_MEM_SIZE = 1073741824
DEVICE_LOCAL_MEM_SIZE = 32768
CL_DEVICE_ADDRESS_BITS = 32
CL_DEVICE_GLOBAL_MEM_CACHE_SIZE = 0
CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE = 0
CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE = 65536
CL_DEVICE_MAX_WORK_GROUP_SIZE = 1024
CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS = 3
CL_DEVICE_MAX_WORK_ITEM_SIZES = (1024, 1024, 1024)

そして、自明なカーネルのワークグループのサイズと倍数を照会します (float4 フォームの入力からグローバルメモリの出力へのパススルー)。

CL_KERNEL_PREFERRED_WORKGROUP_SIZE_MULTIPLE = 64
CL_KERNEL_WORK_GROUP_SIZE = 256

3)

OpenCL 仕様では、ワーク グループ全体がデバイスのコンピューティング ユニットで同時に実行できる必要があると規定されています。

4)

OpenCL は、デバイスの SIMD 幅も倍数で示します。上記の場合は 64 です。

どういうわけか、「6」と「480」と 2 のべき乗を関連付けることができません。計算ユニットの数が 6 で、SIMD 幅が 64 の場合、384 になります。

これらの数値が、特にハードウェアとどのように関係しているか説明できる人はいますか?

4

1 に答える 1

1

この GPU では、各「計算ユニット」は 1 つまたは複数のワークグループを実行するコアです。

各ワークグループの最大サイズは、特定のカーネルで 256 です (clGetKernelWorkgroupInfo で取得)。カーネルがより多くのリソース (レジスタ、ローカル メモリ) を必要とする場合は、これより少なくなる可能性があります。

各コアでは、16 個のワークアイテムが物理的にアクティブになり、5 つの演算ユニット (ALU) にマップされた同じ「大規模命令」 (VLIW5 を参照) を実行し、コアあたり 5*16 ALU または 480 個の「ストリーム プロセッサ」を提供します。 " 6 コアの場合。

作業項目は、実際には 64 のブロック (AMD 用語では「波面」) で実行されます。同じ VLIW5 命令を実行する 64 個のワークアイテムすべてが、16 回の 4 回のパスで物理的に実行されます。これが、優先ワークグループ サイズが 64 の倍数になる理由です。

最近の AMD GPU は、各命令が 4 つの ALU のみにマップされる VLIW4 モデルに切り替わりました。

于 2013-02-07T23:56:55.247 に答える