GNC Compute Unit

▲GCN CU的功能模块图
上图是GCN CU的功能模块图。可以看到,一个GCN CU包含了:
1 个向量计算单元模块(Vector Unit,里面有4 个16路SIMD计算子模块);
每个SIMD-16 模块拥有4*64KiB 向量寄存器;
1 个标量计算单元模块(Scalar Unit),用于执行整数指令、媒体指令和浮点原子操作(min、max、cmpxchg)。
标量计算单元模块拥有 4KiB 标量寄存器
每个GCN CU拥有64KiB LDS;
每个GCN CU拥有16 KiB 数据 Cache
每个GCN CU拥有1 个纹理拾取或者说内存存取模块(单周期执行16 个32-bit Load/Store 操作);
每个GCN CU拥有1个单周期执行4*32bit 线性滤波的纹理滤波单元;
图中的Branch&Message(分支与信息)单元可以用于执行分支指令和 Debug 等操作。
作为多线程处理器,AMD和NVIDIA的DX11 GPU都有一定的线程粒度,NVIDIA的线程粒度被称作 Warp,一个Warp是32 "线程";而AMD的线程粒度称作wavefront,粒度是 64 "线程"。
严格来说,所谓的线程其实是指处理数据的宽度,不过NVIDIA 偷换概念后,AMD也跟着上,都叫起“线程”了,而传统意义上的硬件线程本应该是Warp和wavefront这级别的才对。
在GCN CU上,一个周期能执行一个wavefront(硬件线程),或者说4个周期执行4 个wavefront。
因为线程调度器实际上是每次将4 个wavefront 派给CU,CU上的每个SIMD-16 单元执行其中一个,因为同一个wavefront 的指令都是一样的,只是所处理的数据地址是截然不同的。
所以SIMD-16 单元可以4 个周期完成一个Wavefront,这样由4 个SIMD-16 组成的CU 看上去就能单周期执行一个wavefront或者说4 个周期执行4 个Wavefront。
AMD Cypress架构的wavefront(简称C-wavefront) 和GCN 的wavefront 是不一样的,C-wavefront 粒度虽然也是64 “线程”,但是每个“线程”是由一个VLIW5 的指令包组成的,虽然跑图形的时候问题不大,但是跑通用计算的话,效率就会大打折扣,需要比GCN wavefront更高带宽的指令总线,增加了开发工具的复杂性,性能的可预测性也存在不定因素。
重新设计的GCN CU现在更像一个80年代流行的向量处理器环路——极为简化的向量、标量组合,具备最高效的标量开发模型,和NVIDIA Fermi的设计思路一样,可以让程序员觉得是在给一个标量处理器开发程序。
每个RADEON HD 7970的GCN CU 的线程管理器最高可以同时容纳32 个 wavefront,也就是说当计算单元是空闲的话,可以有32个待处理的硬件线程可以选着派给计算单元执行。相比之下,NVIDIA Fermi的每个SM(相当于CU)最高可以有48 个warp 供选择执行。
在多线程执行上,CU拥有更多的子(调度器)模块,可以同时执行4个硬件线程,而NVIDIA Fermi则只有两个子(调度器)模块,可以同时执行两个硬件线程,这样的设计并没有一定的优劣之分,每个Fermi SM或者 GCN CU SIMD16 都能获得平均24 个(GF100/GF110) 或者16 个(GF10X/GF11X 以及GCN)硬件线程分派,硬件线程数越多,计算资源的利用率自然越高。
Tahiti 一共拥有32 个CU,RADEON HD 7970 是足本的规模,而RADEON HD 7950则被烧成28 个 CU。