AMD GPU 硬件架构
AMD 5870 显卡 (cypress) 架构
- 20 个 simd 引擎,每个 simd 引擎包含 16 个 simd
- 每个 simd 包含 16 个 stream core
- 每个 stream core 都是 5 路的乘法 -加法运算单元( VLIW processing)
- 每个 stream core 是一个 5 路的 VLIW 处理器,在一个 VLIW 指令中,可以最多发射 5 个标量操作。标量操作在每个 pe 上执行
- CU( 8xx 系列 cu 对应硬件的 simd)内的 stream core 执行相同的 VLIW 指令
- 在 CU(或者说 simd)内同时执行的 work item 放在一起称作一个 wave,它是 cu 中同时执行的线程数目。在 5870中 wave 大小是 64,也就是说一个 cu 内,最多有 64 个 work item 在同时执行
- 单精度运算可以达到 Teraflops
- 双精度运算可以达到 544Gb/s
我们现在看下 AMD GPU 硬件在 OpenCL 中的对应关系:
- 一个 workitme 对应一个 pe, pe 就是单个的 VLIW core ,也就是每个simd core 中的某个具体的VLIW 线程
- 一个 cu 对应多个 pe, cu 就是 simd 引擎
- 一个 simd 引擎的示意图,每个 simd 引擎由一系列的 stream core 组成
- 对每个 cu 来说,它使用的内存包括 onchip 的 LDS 以及相关寄存器。在 5870 中,每个 LDS 是 32K,共 32 个bank,每个 bank 1k,读写单位 4 byte
- 对每个 cu 来说,有 8K 的 L1 cache。( for 5870)
- 各个 cu 之间共享的 L2 cache,在 5870 中是 512K
- fast Path 只能执行 32 位或 32 位倍数的内存操作
- complete path 能够执行原子操作以及小于 32 位的内存操作
AMD GPU 的内存架构和 OpenCL 内存模型之间的对应关系:
- LDS 对应 local memeory,主要用来在一个 work group 内的 work times 之间共享数据。 steam core 访问 LDS 的速度要比 Global memory 快一个数量级
- private memory 对应每个 pe 的寄存器
- constant memory 主要是利用了 L1 cache
- 注意:对 AMD CPU, constant memory 的访问包括三种方式: Direct-Addressing Patterns ,这种模式要求不包括行
列式,它的值都是在 kernel 函数初始化的时候就决定了,比如传入一个固定的参数。 Same Index Patterns ,所有的 work
item 都访问相同的索引地址。 Globally scoped constant arrays ,行列式会被初始化,如果小于 16K,会使用 L1 cache,
从而加快访问速度。当所有的 work item 访问不同的索引地址时候,不能被 cache,这时要在 global memory 中读取。