MCPLive > 杂志文章 > 解析AMD DirectX 12硬件的秘密武器

解析AMD DirectX 12硬件的秘密武器

2015-10-09林子涵《微型计算机》2015年9月下

与以往API不同,新的DirectX 12 API是一个全面为提升CPU与GPU运行效率而生的神兵利器,因此也需要厂商在CPU与GPU上均做出相应的优化才能充分发挥出DirectX 12的优势一单单依靠GPU或仅仅依靠CPU,用户都无法体验到DirectX 12的完整魅力。因此芯片厂商AMD特别与微软配合,对它的CPU、GPU产品都进行了相应的优化与支持,下面就让我们来了解一下它为DirectX 12做了哪些准备,有什么新技术。

从CPU到GPU的全面优化 解析AMD DirectX 12硬件的秘密武器
从CPU到GPU的全面优化 解析AMD DirectX 12硬件的秘密武器

DirectX 12在DirectX的发展史上可以被称之为革命性进步,之所以这样说,是因为在过去的DirectX发展史上,涉及到Direct3D架构的深层次改进并不算很多。比如早的DirectX 7实现了硬件的坐标转换,而随后的DirectX 8实现了顶点渲染引擎和像素渲染引擎的分离,DirectX 10则实现了统一渲染引擎。这几个版本都带来了DirectX和相关GPU的功能和硬件上的大跃进。虽然这些版本本身可能存在一定问题,使用时间并不长,但是这并不妨碍它们在技术发展历史中所具有的突破性、开创性历史地位。

AMD在DirectX 12时代拥有三种秘密武器,能够加强用户的使用体验。
AMD在DirectX 12时代拥有三种秘密武器,能够加强用户的使用体验。

在DirectX 12上,微软加入了底层优化的概念,放弃了之前如“黑盒”般不可控的抽象层,使得开发人员可以更多地接触硬件架构的底层细节,从而提高效率,释放性能。此外,在诸如动态纹理绑定、通用计算方面,DirectX 12都有一定程度的加强。总的来看,DirectX 12虽然没有对硬件提出特别的换代需求,但是其在软件层面尤其是渲染流程上的改进,堪称未来很长一段时间GPU发展的技术基础,它奠定了一个全新的GPU发展时代。

对多核心CPU来说,DirectX 12能够使得CPU效率得到大幅度提升。
对多核心CPU来说,DirectX 12能够使得CPU效率得到大幅度提升。

同时与以往API有所不同的是,DirectX 12还可通过基于底层开发,提升绘制调用性能的手段,来大幅提升处理器在运行游戏时的效率。因此芯片厂商AMD特别与微软配合,对它的CPU、GPU产品都进行了相应的优化与支持,并带来了异步着色器、多线程支持,以及更高效率的多GPU并行工作模式等三大利器。

AMD给出的DirectX 12应用在多核心处理器上的实际表现,可见整体效能非常出色,其中6颗核心在游戏中都得到了充分应用。
AMD给出的DirectX 12应用在多核心处理器上的实际表现,可见整体效能非常出色,其中6颗核心在游戏中都得到了充分应用。

DirectX 12多线程支持—提高多核心CPU性能

DirectX 12在多线程支持上可谓做出了决定性的改进。在之前的DirectX版本中,处理器所做的主要任务是为GPU准备命令列表,并将其存储至缓冲区。不过,这个过程由于存在一定的相关性,并且过程是不公开的,由处理器根据相关规则自动处理,因此很难有效多线程化。我们常常看到在一个游戏中,即使你使用了八核心处理器,但是依旧只有两个核心占据比较高的占有率,其余的核心都处于比较空闲的状态,造成了处理器性能的浪费。

在DirectX 12上,AMD配合微软改进了这样的情况。由于DirectX 12将CPU部分控制功能放开,使得程序员可以自行控制,因此在多线程优化上能够更为出色。根据AMD的测试数据来看,在AMD FX系列八核心处理器上,DirectX 12对CPU的工作负载能够比较均衡的分布在至少四个核心上。以游戏为例,八个处理器核心中的六个,可以得到比较有效的游戏负载,其余的一些诸如DirectX驱动、用户控制、DirectX Runtime等,也能有效的多线程化。根据AMD的测试,DirectX 12在八核心上,系统负载延迟能够降低至15ms以内,对应的就是高达66fps的稳定帧率表现。

在DirectX 11时代表现平平的FX-8350处理器,在DirectX 12下能爆发出极为强悍的潜能,性能获得大幅提升。
在DirectX 11时代表现平平的FX-8350处理器,在DirectX 12下能爆发出极为强悍的潜能,性能获得大幅提升。

更高的FPS帧速,更低的延迟,更好的画面质量,这是AMD总结的异步着色器的优势。
更高的FPS帧速,更低的延迟,更好的画面质量,这是AMD总结的异步着色器的优势。

AMD的GCN架构产品都有异步着色器,这是AMD一个非常具有先见之明的设计。
AMD的GCN架构产品都有异步着色器,这是AMD一个非常具有先见之明的设计。

另外,AMD还给出了3DMARK中有关API绘制调用测试的数据予以佐证。其中DirectX 11下,整个系统的调用无论是双核心还是八核心,都维持在比较低的水平,而在DirectX 12下,从双核心到四核心、六核心的绘制调用数量都有非常显著的增加,这样的状况直到八核心才变得不明显。AMD数据显示,在FX-8350八核心处理器上,多可以启用其中的六个CPU核心,平均每个CPU核心处理了超过290万个绘制命令,相比传统处理器大约百万级别的绘制命令,DirectX 12的效率非常惊人。

AMD认为,在DirectX 12释放了CPU端多线程的性能后,能够为游戏带来更高的FPS。CPU处理游戏代码更有效率、并行性更强,整体游戏性能也更为出色。不过需要说明的是,目前测试中显示出的如此巨大的性能优势,并不能直接反应到游戏中,因为绘制调用只是游戏和应用的一个方面,随后更重的负载会加在GPU以及其它部件上。DirectX 12对绘制调用在底层的优化,只对那些CPU性能约束比较严重的游戏有比较明显的效果,在一些优化得比较出色、GPU负载很高的测试和应用中,效果就没有那么明显了。

Async Shaders—异步着色器提高GPU效率

AMD在DirectX 12上作出的另一项有效改进,就是有关异步着色器的设计和使用了。一般来说,目前GPU中的计算都是通过着色器来完成。当然,着色器(Shader)这个名称是来源于GPU发展的早期,现在虽然还叫着色器,但是它的功能都复杂化了,除了能够完成图形计算的内容外,还可以进行诸如通用计算、物理计算、后期处理等内容。目前GPU着色器上运行的计算队列包括图形队列、计算队列和复制队列三种。在DirectX 12之前,GPU的着色器计算,都通过只含有单一类型计算命令的队列来完成。比如这一个队列都是传统的着色器计算、下一个队列则是后处理计算等。不同的队列之间不能交叉计算,比如不能一会儿计算这个,一会儿计算那个,必须等一个队列完成或者中断后,才能进行下一个队列。三种不同队列的任务切换和等待都相当耗费时间,这使得GPU很少有100%的工作负载,浪费了性能。

随后,人们对这种做法进行了改良。提出了优先级别等概念。新的方法增加了优先级、暂停等。这样的设计可以使得一些特别紧急、优先级特别高的任务能够优先完成,在一定程度上提高了效率,但并没有在GPU整体的效能上作出很好的改变。

而在面向DirectX 12、采用GCN架构的GPU上,AMD设计了一个名为ACE(异步计算引擎)的部件。ACE(异步计算引擎)的作用是协调着色器上所有的计算,使得它们可以根据需要异步进行。简而言之,之前的队列都必须是一类计算,并且一队一队进入GPU。但是,在有了ACE之后,ACE会将所有的任务预先排好序,开启三组并行计算任务,让诸如复制、计算、图形等内容,在GPU内并行计算完成。也就是说,GPU内可以同时并行三条不同的计算序列,这比之前只能接收单条计算序列而言,效率大幅度提升。因为在并行化后,GPU无谓的等待时间变得更少了,任务切换也变得不那么频繁,反正总是这三种计算任务,那么某些CU单元处理图形、某些CU单元处理复制、某些CU单元处理计算即可。一旦部分CU单元不够用或者负载不平衡,那么再切换CU单元的工作也完全来得及。

这个功能被AMD称作异步着色器,英文名为Async Shaders,这个新技术的出现,使得AMD的GPU在面对DirectX 12计算时更为游刃有余。目前业内的GPU中,只有AMD独家拥有类似队列排序、并行计算的功能,这是AMD在DirectX 12时代GPU设计上的一大创新。

底层改进效率—多卡并行更高效

AMD在DirectX 12上的技术创新还有一个,那就是多卡并行能力大幅度提升。我们知道,之前AMD在多卡并行上付出了很多努力,开发了CrossFire交火技术,其双卡效率非常出色,同时也对三卡、四卡交火提供了支持,但是后两者的整体效率受制于API,只能说表现尚可。

现在,DirectX 12开始原生支持多卡并行技术,在开放了底层优化后,多卡并行更容易,也能更有效率地在更多GPU上实现。DirectX 12使得游戏开发人员和驱动人员,能够精确地控制分配给每一个GPU的任务,也能够更精确地控制硬件,获取更高的利用率和性能。即便是APU与独立GPU这两种3D性能相差很大的产品,在DirectX 12上,只要开发人员和驱动优化得当,那么APU和独立GPU也能“联手行动”,获得性能增益,带来更出色的使用体验,这使得用户的投资能够很好的保值,不会浪费。

此外,对于多卡系统来说,DirectX 12还有一个特别惊人的功能,那就是显存不再复制,而是共同使用。在之前的多卡并行系统中,所有的并行GPU能使用的显存容量,只能是所有参与并行的GPU中显存小的那一个。举例来说,一张2GB的R9 280X和一张4GB的R9 280X搭建CrossFire系统的话,那么这个系统大的显存容量只有2GB。这是因为对每个GPU来说存在数据同步的需求,这使得它们必须在各自的显存中拥有对方更改的所有数据,这样才能保证下一次计算不会出错。但是这样一来,大量显存就会被无谓浪费掉,尤其在多卡的超清分辨率计算中,这样的问题尤为重要。

由于DirectX 12优化了GPU执行流程,因此更容易为CPU和GPU提供并行优化。
由于DirectX 12优化了GPU执行流程,因此更容易为CPU和GPU提供并行优化。

多卡并联性能也由于DirectX 12的存在,将得到很大的改善。
多卡并联性能也由于DirectX 12的存在,将得到很大的改善。

从工作流程图可见,拥有异步着色器的GPU在DirectX 12中效率要高很多,可以开启三组并行计算任务。
从工作流程图可见,拥有异步着色器的GPU在DirectX 12中效率要高很多,可以开启三组并行计算任务。

但是在DirectX 12上,显存的浪费问题可能得到很大的缓解。因为DirectX 12的工作特性,使得开发人员能够很好的将计算任务分配到不同的GPU上,每个GPU不再需要保存对方的信息在自己的显存中,因此显存从之前的复制转向了叠加。依旧是上述那个例子,在DirectX 12上下优化得当的话,一张2GB的R9 280X和一张4GB的R9 280X搭建CrossFire系统的话,那么这个系统大的显存容量就可能会达到6GB。而如果是两张4GB的显卡搭建多卡系统的话,那就可以完全使用8GB显存,大大拓宽了显存空间。

目前在Windows 10发布后,DirectX 12相关应用的发展速度开始提速,估计年内像《奇点灰烬》、《杀出重围:人类分裂》支持DirectX 12的游戏就会发布。同时《奇点灰烬》 DirectX 12 Demo、Elemental Demo等DirectX 12性能测试工具已经上线,那么AMD开发出的优化技术到底能带来多大的效果呢?请关注《微型计算机》近期制作的DirectX 12专项测试。

分享到:

用户评论

用户名:

密码: