我正在尝试更好地直观了解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。
任何人都可以解释这些数字是如何联系的,特别是硬件吗?
答案 0 :(得分:1)
在这个GPU中,每个“计算单元”都是执行一个或多个工作组的核心。
特定内核(使用clGetKernelWorkgroupInfo获取)的每个工作组的最大大小为256。如果内核需要更多资源(寄存器,本地内存),它可能会更少。
在每个核心中,16个工作项在给定时间处于物理活动状态,并执行映射在5个算术单元(ALU)上的相同“大指令”(参见VLIW5),每个核心提供5 * 16个ALU或480个6个核心的“流处理器”。
工作项实际上是以64块为单位执行的(AMD术语中的“波前”);所有64个工作项执行相同的VLIW5指令,并在物理上执行4次16次。这就是为什么你得到一个64的首选工作组大小。
最近的AMD GPU已切换到VLIW4模型,其中每条指令仅映射到4个ALU。