趁着5700系列显卡还没上市之前,我先给大家写点架构科普文,附带RDNA的新架构讲解,免得到时候测卡/测CPU没时间弄,我打算每天写一点,先写显卡的,然后CPU。
今天毕竟我还在上班,所以先讲个简单的部分,CommandProcessor(命令处理器),这东西大部分吧友或者是一般媒体都不是很熟悉。
先看看图:

蓝色大框就是Command Processor,他的功能是直接接受驱动程序发来的命令,然后控制下方各种实际的处理单元(例如图片下方所示的,图形流水线,CU阵列等等的)来执行与之对应的任务,其他的他还会更新任务的常量,控制GPU这个状态机的一些全局的状态寄存器,使GPU有一个适合完成当前任务的环境。
具体的来看。在Command Processor中除开里面HWS,你可以看到有很多个Ring结尾的东西,那些其实就是一个一个的任务队列,由驱动发送过来的不同类型任务就放在这里,等待发送给下面的处理单元。
其中GFX Ring是最主要最不可缺少的一部分,也是功能最全的一部分。它可以对图形流水线,CU和DMA访存进行控制。在AMD的GCN架构出现之前,所有的图形,计算,内存传输任务都由他来负责发送和调度。它就是你们在AMD的各种架构图里面所看到的那个Command Processor。在GCN之前的年代,因为只有这一个队列,所以所有的任务都是不能真正并行起来的,必须一个一个完成,这对图形任务没有什么,毕竟一般玩大型3D游戏也不会开多个来玩。但是对于计算任务来说就不一样了,很多时候计算任务的规模都比较小,吃不满GPU,所以如果可能的话,多个计算任务一起跑就能提高整个GPU的利用率了。
所以AMD在GCN架构研发的时候,引入了一个新的部件,AMD称之为Asynchronous Compute Engine(ACE)。实际对应上面的图就是那四个Compute Ring。这几个Ring只对应计算任务,所以它也只能控制CU和DMA访存而已。有了ACE之后,不止计算任务可以多个同时进行,甚至和图形任务也可以一起进行了。为了配合这一点DX12,Vulkan,Mantle都强调了多任务并行,鼓励程序员多使用Compute Shader来提升GPU中CU计算单元利用率,这也是AMD在各类新API的多任务优化中取得优势的关键原因。因为ACE有这么多优点,所以英伟达也追随AMD的脚步,从GK110中加入了类似的部件,不过和AMD不同,英伟达的类似部件只能应用在CUDA计算上面,而别的类似于Compute Shader,OpenCL是无法工作的,所以在DX12中N卡往往还会因为多任务的调度开销损失性能(封闭标准就是惨)。
然后是Media Ring,这部分控制着GPU中的编码解码硬件,在之前的GCN中主要使用VCE和UVD分别进行编码解码,这次RDNA中应该是使用了VCN(VideoCore Next)来完成这里就提一下,多的不说了。
再然后是DMA Ring,这个只负责各种非本地与本地内存之间的读写任务。DMA引擎主要就是把显存中的内容拷贝到别处,或者从别处拷贝到显存,比如纹理加载,比如显卡交火时,两张卡的通信。
最后是Display Ring,它就是控制显示控制器的工作。说到显示控制器,RDNA架构应该也换成了DCN(Display Core Next),支持了更高的显示器链接方式和更新的链接技术。这里也不细说了,后面在别的章节讲。
几个Ring说完,然后说说HWS(HardwareScheduler),作用就是字面意思-硬件调度器。这东西主要负责把从CPU接受到的任务按各自的优先级分配到上面提到的各个队列里面,并且在AMD独家支持的硬件GPU虚拟化环境中,GPU收到的任务来自各个不同的虚拟机,HWS还需要让追踪各个任务,保证它们与各自的虚拟机相对应。在这次RDNA架构的改进中,关于Command Processor的地方,就是关于HWS的,它现在的优先级控制支持Priority Tunneling(优先通道),完全放弃其他任务,把所有资源都给到这个优先级的任务上。AMD表示这个可以给VR游戏带来更顺滑的体验,毕竟别的任务抢占资源,肯定会多少带来一些帧率上的起伏。
部件介绍大概就这样了,接着说说它是怎么控制GPU工作起来的,举个简单的例子说说它的流程:
比如我们要计算一个什么东西,那么驱动程序给HWS发命令,然后HSW把一个DMA任务放到其中一个ACE的命令队列中,然后它控制DMA引擎到内存搬运需要执行的Kernel程序和数据到显存中,然后同样再给HWS命令,调用CU去执行显存中的那一段Kernel程序,然后CU执行完毕,然后同样的方式控制DMA引擎,再把计算好的数据搬回内存。一共三个任务配合起来就完成了一次计算。
别的类型的大概也是这个样子,只是图形之类的比较复杂,可能需要几百几千条任务才能完成一帧画面的生成。所以DX12之类的新API都着重于减少驱动与GPU之间调用的开销,或者提倡使用简单的Compute Shader来并行完成。
到此这次的科普就说完了,下回来讲讲前端。
附:关于HWS以前很多人这里存在着严重的误解,他们把这玩意儿和英伟达SM内部的(Software schedule)软件调度对应了起来,这其实是两个风马牛不相及的东西,HWS控制着整个GPU的运转,而SM内的软件调度只是控制寄存器和SIMD的状态,让他们执行多条指令时不会发生数据上的相关性冲突。
今天毕竟我还在上班,所以先讲个简单的部分,CommandProcessor(命令处理器),这东西大部分吧友或者是一般媒体都不是很熟悉。
先看看图:

蓝色大框就是Command Processor,他的功能是直接接受驱动程序发来的命令,然后控制下方各种实际的处理单元(例如图片下方所示的,图形流水线,CU阵列等等的)来执行与之对应的任务,其他的他还会更新任务的常量,控制GPU这个状态机的一些全局的状态寄存器,使GPU有一个适合完成当前任务的环境。
具体的来看。在Command Processor中除开里面HWS,你可以看到有很多个Ring结尾的东西,那些其实就是一个一个的任务队列,由驱动发送过来的不同类型任务就放在这里,等待发送给下面的处理单元。
其中GFX Ring是最主要最不可缺少的一部分,也是功能最全的一部分。它可以对图形流水线,CU和DMA访存进行控制。在AMD的GCN架构出现之前,所有的图形,计算,内存传输任务都由他来负责发送和调度。它就是你们在AMD的各种架构图里面所看到的那个Command Processor。在GCN之前的年代,因为只有这一个队列,所以所有的任务都是不能真正并行起来的,必须一个一个完成,这对图形任务没有什么,毕竟一般玩大型3D游戏也不会开多个来玩。但是对于计算任务来说就不一样了,很多时候计算任务的规模都比较小,吃不满GPU,所以如果可能的话,多个计算任务一起跑就能提高整个GPU的利用率了。
所以AMD在GCN架构研发的时候,引入了一个新的部件,AMD称之为Asynchronous Compute Engine(ACE)。实际对应上面的图就是那四个Compute Ring。这几个Ring只对应计算任务,所以它也只能控制CU和DMA访存而已。有了ACE之后,不止计算任务可以多个同时进行,甚至和图形任务也可以一起进行了。为了配合这一点DX12,Vulkan,Mantle都强调了多任务并行,鼓励程序员多使用Compute Shader来提升GPU中CU计算单元利用率,这也是AMD在各类新API的多任务优化中取得优势的关键原因。因为ACE有这么多优点,所以英伟达也追随AMD的脚步,从GK110中加入了类似的部件,不过和AMD不同,英伟达的类似部件只能应用在CUDA计算上面,而别的类似于Compute Shader,OpenCL是无法工作的,所以在DX12中N卡往往还会因为多任务的调度开销损失性能(封闭标准就是惨)。
然后是Media Ring,这部分控制着GPU中的编码解码硬件,在之前的GCN中主要使用VCE和UVD分别进行编码解码,这次RDNA中应该是使用了VCN(VideoCore Next)来完成这里就提一下,多的不说了。
再然后是DMA Ring,这个只负责各种非本地与本地内存之间的读写任务。DMA引擎主要就是把显存中的内容拷贝到别处,或者从别处拷贝到显存,比如纹理加载,比如显卡交火时,两张卡的通信。
最后是Display Ring,它就是控制显示控制器的工作。说到显示控制器,RDNA架构应该也换成了DCN(Display Core Next),支持了更高的显示器链接方式和更新的链接技术。这里也不细说了,后面在别的章节讲。
几个Ring说完,然后说说HWS(HardwareScheduler),作用就是字面意思-硬件调度器。这东西主要负责把从CPU接受到的任务按各自的优先级分配到上面提到的各个队列里面,并且在AMD独家支持的硬件GPU虚拟化环境中,GPU收到的任务来自各个不同的虚拟机,HWS还需要让追踪各个任务,保证它们与各自的虚拟机相对应。在这次RDNA架构的改进中,关于Command Processor的地方,就是关于HWS的,它现在的优先级控制支持Priority Tunneling(优先通道),完全放弃其他任务,把所有资源都给到这个优先级的任务上。AMD表示这个可以给VR游戏带来更顺滑的体验,毕竟别的任务抢占资源,肯定会多少带来一些帧率上的起伏。
部件介绍大概就这样了,接着说说它是怎么控制GPU工作起来的,举个简单的例子说说它的流程:
比如我们要计算一个什么东西,那么驱动程序给HWS发命令,然后HSW把一个DMA任务放到其中一个ACE的命令队列中,然后它控制DMA引擎到内存搬运需要执行的Kernel程序和数据到显存中,然后同样再给HWS命令,调用CU去执行显存中的那一段Kernel程序,然后CU执行完毕,然后同样的方式控制DMA引擎,再把计算好的数据搬回内存。一共三个任务配合起来就完成了一次计算。
别的类型的大概也是这个样子,只是图形之类的比较复杂,可能需要几百几千条任务才能完成一帧画面的生成。所以DX12之类的新API都着重于减少驱动与GPU之间调用的开销,或者提倡使用简单的Compute Shader来并行完成。
到此这次的科普就说完了,下回来讲讲前端。
附:关于HWS以前很多人这里存在着严重的误解,他们把这玩意儿和英伟达SM内部的(Software schedule)软件调度对应了起来,这其实是两个风马牛不相及的东西,HWS控制着整个GPU的运转,而SM内的软件调度只是控制寄存器和SIMD的状态,让他们执行多条指令时不会发生数据上的相关性冲突。
