【问题标题】:OpenCL abstraction and actual hardwareOpenCL 抽象和实际硬件
【发布时间】:2013-01-23 14:06:21
【问题描述】:

我正在尝试对 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。

谁能解释这些数字的关系,尤其是与硬件的关系?

【问题讨论】:

    标签: opencl gpgpu


    【解决方案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。

    【讨论】:

    • 最近的 AMD GPU 已从 VLIW4 切换到类似 SIMD 架构的“RISC”。
    猜你喜欢
    • 2017-03-29
    • 1970-01-01
    • 2012-07-03
    • 2020-09-21
    • 1970-01-01
    • 2014-07-14
    • 1970-01-01
    • 1970-01-01
    • 2014-10-13
    相关资源
    最近更新 更多