我正在尝试对 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。
任何人都可以解释这些数字如何相关,尤其是与硬件相关吗?