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”和两个的幂放在一起。如果计算单元的数量是 6,SIMD 宽度是 64,我会得到 384。

任何人都可以解释这些数字如何相关,尤其是与硬件相关吗?

4

1 回答 1

1

在这个 GPU 中,每个“计算单元”都是一个执行一个或多个工作组的核心。

对于您的特定内核,每个工作组的最大大小为 256(通过 clGetKernelWorkgroupInfo 获得)。如果您的内核需要更多资源(寄存器、本地内存),它可能会更少。

在每个内核中,有 16 个工作项在给定时间处于物理活动状态,并执行映射在 5 个算术单元 (ALU) 上的相同“大指令”(参见 VLIW5),每个内核提供 5*16 ALU 或 480 个“流处理器” " 为 6 核。

工作项实际上以 64 个块执行(AMD 术语中的“波前”);所有 64 个工作项都执行相同的 VLIW5 指令,并在 4 次 16 次中物理执行。这就是为什么您会获得 64 的首选工作组大小倍数。

最近的 AMD GPU 已切换到 VLIW4 模型,其中每条指令仅映射到 4 个 ALU。

于 2013-02-07T23:56:55.247 回答