负荷分配不当 AMD锐龙处理器游戏表现不如英特尔

来源:网络 时间:2017-03-21 14:14:16

负荷分配不当 AMD锐龙处理器游戏表现不如英特尔

腾讯数码讯(文心)据Ars Technica网站报道,业内人士对于AMD采用Zen内核架构的Ryzen处理器的反应可谓参差不齐。它售价不足500美元(约合人民币3450元),却集成有8个内核、支持16个线程,意味着它在运行多种负载方面的表现都不含糊,例如编译软件、对内核数量要求较高的视频压缩等计算密集型任务。AMD的定价使得Ryzen确实非常有吸引力。

但游戏性能让用户对Ryzen颇为不满。AMD承诺大幅提升每周期能执行的指令数量(以下简称“IPC”),业内普遍认为,Ryzen在这方面与英特尔Broadwell内核相当。虽然Broadwell是数年前的技术,采用它的芯片最早在2014年9月发售,这样的比较仍然是恰当的。英特尔集成有大量内核的处理器——集成有6、8或10个内核的高端台式机处理器和面向多路服务器的各种至强处理器,仍然采用Broadwell内核。

实际上,没有人预期Ryzen能成为游戏性能最高的处理器。我们已经知道,Broadwell也不是游戏性能最高的处理器,Skylake和Kaby Lake在多款游戏中的表现超过Broadwell,即使Skylake和Kaby Lake处理器至多只集成有4个内核、支持8线程。对于许多或大多数游戏,高IPC和高时钟频率对于高性能至关重要,而这正是Kaby Lake的特性。

虽然如此,互联网上的评测文章、帖子和推文,给人的感觉是:许多人希望或期望Ryzen在某种程度上全面胜过英特尔。一种普遍看法是,Ryzen在某种意义上来说是一款糟糕的游戏处理器。但这一观点通常伴随着一种说法,某些“优化”措施将提升这款处理器性能,AMD用户只需再等上数个月,Ryzen的威力将能全部发挥出来。

这两种观点都大有瑕疵。

Ryzen其实是一款出色的游戏处理器

Ryzen的游戏性能不如英特尔处理器是事实。如果用户只关心游戏性能,英特尔Kaby Lake i7-7700K是市场上最好的处理器,其价格与最廉价的Ryzen型号相当。甚至高端的Ryzen 1800X也不是7700K对手。

但7700K是目前市场上速度最快的游戏处理器。不过,“不像7700K那样快”,并不意味着一款处理器“不适合”玩游戏,这只意味着其运行速度不如有史以来最快的游戏处理器。

在大多数情况下,处理器之间的差别只是理论上的。在几乎所有情况下,Ryzen和Kaby Lake之间的差别是,一款处理器提供的帧率略低于另外一款。如果性能测试表明英特尔处理器在运行游戏时帧率总是高于60fps,而AMD处理器运行游戏的帧率总是低于60fps,一个合理的结论就是,英特尔处理器能提供流畅的游戏体验,而AMD处理器则不能。

但通常而言,情况并非如此。即使差距相当大,例如《古墓丽影:崛起》(Rise of the Tomb Raider),在Kaby Lake i7-7700K和Broadwell-E i7-6900K(8核/16线程)上运行时帧率都能达到135fps,而在1800X上运行帧率则可以达到110fps,这样的帧率对于玩游戏来说还是相当不错的。Tech Report发现了更极端的差距,那就是在OpenGL模式下运行《毁灭战士》(Doom)时,7700K帧率达到170fps,而1800X仅为123fps。Tech Report没有对6900K进行测试,但6950K(10核/20线程)帧率达到156fps。1800X能提供的帧率确实略低,但可玩性仍然是相当高的。换用更新的Vulkan API而非OpenGL后,它们在帧率之间的差距就不复存在了,7700K和1800X的平均帧率都达到了165fps。6950X稍微逊色一些,帧率为161fps。

这是我们认为1800X是Broadwell-E 6900X“优秀备胎”的原因——它以不到一半的价格提供了与后者相当的性能。即使对于游戏而言,1800X也是有力的竞争者:Ryzen“足够出色,用户可能乐意在运行一些软件时承受略低的性能,以在运行其他软件时享受性能的大幅提升”。

目前,1800X非常适合玩游戏,那么未来呢?随着游戏对处理能力要求不断提升,可能有一天7700K正好处于“可接受的帧率”临界点上,而1800X则无法提供“可接受的帧率”,这会使1800X成为一款不划算的处理器吗?

对未来进行预测是一门不确切的科学,要确定未来的游戏什么样是不可能的。在承认Ryzen有一些使它显得不同寻常特性的同时,我们可以做一些合理的推测。

最常见的观点是:目前的软件没有针对Ryzen进行优化,不过这种观点是不正确的。不是软件没有针对Ryzen进行优化,而是它采用的软件优化模式与实际软件不符。游戏确实没有针对Ryzen进行优化,不过它们也没有针对Broadwell、Skylake或Kaby Lake进行优化。它们只是进行了一般的优化,以提升在所有平台上的运行速度。

缺省设置影响性能

当让媒体对Ryzen处理器进行测试和评测时,AMD提供了一些令人颇感意外的说明:其一,Windows电源设置选项应当设置为“高性能”模式,这一设置使处理器处于火力全开的P0状态。在P0状态,处理器时钟频率最高。在“平衡”模式中,处理器只有在负荷高的情况下才处于P0状态。在负荷较轻的情况下,处理器处于P1、P2等状态,这些状态下处理器时钟频率会降低,因此能耗也会大幅度下降。

但这一技术也存在缺点:在P1(或速度更低的状态)和P0之间切换,会带来一些性能开销。与在P0状态中和完全由处理器内部完成小幅度时钟频率调节不同的是,各种P状态之间的切换要求操作系统介入,需要以毫秒计的时间。另外,如果Windows阻塞一个内核,使之处于休眠状态,把它唤醒、恢复运行也需要时间。这些操作的影响甚至在性能测试中也能显现出来,只是原因尚不清楚。

这是让人感到意外的,因为人们预计,合理的处理器性能测试软件,应当使处理器始终处于P0状态。但游戏并不均衡地使用多个内核和多个线程,它会让部分内核处于空闲状态,Windows会使这些内核进入休眠状态,在以后需要时再唤醒它们。

AMD表示,测试者应当关闭主板的“高精度事件定时器”(以下简称“HPET”),称它会削弱系统性能。HPET是Windows能用来设置内部警报和事件的数个定时器之一。HPET导致性能开销并非没有先例,过去,糟糕的实现被认为能造成性能问题,尤其对于音频应用。

Ryzen的高速缓存层次结构也有些与众不同。Ryzen和即将发布的Naples服务器处理器的基础构件是AMD称之为“Core Complex”(简称为“CCX”)的模块,CCX集成有4个内核,每个内核集成有2MB的Level 3缓存。缓存在CCX内部是可以共享的,每个内核能访问其他内核缓存中的数据,但访问时间并不一致,内核访问自己缓存的速度要快于访问另外3个内核的缓存。

一个Ryzen处理器集成有2个CCX和Infinity Fabric。一个CCX模块中的内核能访问其他CCX中的Level 3缓存,但比访问同一CCX模块中的缓存速度慢:一个CCX模块中的Level 3缓存带宽为逾170GB/s。AMD曾表示Infinity Fabric带宽仅为22GB/s。因此,跨CCX访问缓存的时间开销更大。对于主存中的数据,这一差距是不存在的。内存控制器不属于任一CCX,而属于北桥,也与Infinity Fabric相连。

在某种程度上,Ryzen运行方式与带有前端总线的传统SMP系统相似,只是Infinity Fabric代替了总线。在这类系统中,处理器通过总线与其他处理器和内存控制器通信。如果一个处理器访问的内存数据能由其他处理器通过缓存提供,其他处理器会直接发送数据。否则,内存读取操作必须由内存控制器处理。两个处理器对内存控制器有相同的访问权限。

通常情况下,一个线程被允许一直在同一个内核上运行时,系统性能最高,这种情况下缓存存储有线程所需数据的可能性最大。否则,Windows应当优先使线程在同一CCX的内核上运行,最后才会把线程切换到另外的CCX上。我们知道,在选择运行线程的内核时,Windows会考虑超线程和内存位置,目前尚不清楚Windows是否考虑缓存安排。Ryzen应当会考虑缓存安排,因为在CCX间迁移线程是有开销的。

电源管理问题也可能会影响性能。Level 3缓存的运行速度与CCX中最快的内核相当,如果CCX运行速度因所有内核处于空闲状态而放慢,其他CCX中线程访问其缓存的速度甚至会低于正常水平。在“高性能”模式下,即使处于空闲状态的CCX缓存也始终全速运行。

Ryzen还是AMD首款提供细粒度同步多线程(SMT,与英特尔超线程技术相似)的处理器。虽然AMD上一代架构Bulldozer,可以在逻辑内核之间共享资源,每个逻辑内核有自己完整的整数单元,至少对于整数负载来说,它们可以被近似认为是“完整”的物理内核。在Ryzen中——如同在英特尔处理器中那样,资源共享的程度要大得多。这也会影响到缓存使用——同一物理内核上的两个线程共享Level 1和Level 2缓存,以及能提供最优性能的线程数量。

在同一内核上运行两个计算密集型线程,它们会竞争相同的共享执行资源,影响彼此的性能。线程通常应当分布在不同内核上。这要求操作系统对逻辑和物理内核间的资源共享有更好理解。

Ars Technica表示,综合考虑上述因素,意味着系统可能不能以最优方式利用Ryzen处理器。

关闭HPET的效果似乎是微不足道的。德国网站ComputerBase发现,关闭HPET能使系统性能提升0.5%,与“高性能”模式相比,“平衡”模式降低幅度为0(使每个内核始终处于P0状态的游戏)-15%(不能使每个内核始终处于P0状态的游戏)。

新系统建议关闭HPET让人略感意外,通过驱动程序或固件更新包解决这些小问题是可行的。对Ryzen的测试清楚地表明一点:系统固件刚发布不久。事实上,它发布时间确实很短,主板厂商都在抱怨Ryzen上市销售过急,没有进行正常水准的测试工作。

电源管理问题略有些棘手,它也似乎是Windows 7和Windows 10表现差距大的原因。Windows 7喜欢交替阻塞线程,在每个内核上保留一个没有阻塞的线程;Windows 10则采取“恰当的措施”,同时阻塞一个空闲内核上的两个线程,而非只阻塞一个。这意味着Windows 10有助于延长系统电池续航时间,但也意味着唤醒一个内核时增加系统开销的可能性更高。

对于英特尔处理器来说,休眠和唤醒内核也不是免费的。在P状态间切换时英特尔芯片同样需要操作系统干预,因此导致的“电源管理”问题并非是Ryzen特有的。

除非微软修改Windows设计,使之不积极地让内核转入休眠状态,这仍然会是个小问题。AMD曾表示,4月份发布的更新包将“优化‘平衡’模式下的电源管理策略参数,提升正常使用状态下台式机的性能”。想必这意味着不再快速阻塞处理器。

人们希望无论什么样的改变都不会影响移动芯片和服务器版Ryzen的节能表现。移动芯片受到更大的能耗限制,服务器处理器的总体能耗可能大于台式机处理器,但每个内核的能耗要小得多。在台式机系统上正确的设置,在其他类型计算设备上就可能是错误的。

至于调度程序,AMD表示,它研究了Windows 10调度程序行为,发现它运行正常,因此Windows似乎没有在CCX间不必要地迁移线程,并恰当地利用了同步多线程技术。

这一难题的另一个元素是游戏本身。AMD表示,它已经发现“部分能提升游戏对‘Zen’内核/缓存拓扑结构理解的修改”,不过它不会披露相关细节。操作系统可能运行正常,但它不会审视每个线程的负载,因此它仍然可能犯错。

例如,如果两个线程在相同的共享数据集上运行,它们应当分配到同一个CCX,避免它们通过相对较慢的连接传输数据。Windows不容易发现共享的数据,不会发现两个线程花过长时间等待内存数据。如果存在足够多的计算密集型线程,Windows必须在两个CCX上调度线程,两个线程可能被分开,一个CCX上有一个线程。但是,应用开发者可以采取措施,把两个线程分配到一个CCX或另外一个CCX上,确保它们始终位于Infinity Fabric连接的同一端。

更为复杂的是,根据应用类型,正确的策略可能多种多样。需求更多带宽的软件可能最好将部分线程分配在一个CCX上,部分线程分配在另一个CCX上,使得两套线程能利用Level 3缓存的全部带宽。但是,对延迟高度敏感的软件,可能最好将所有线程分配在一个CCX上,对另外一个CCX“视而不见”。采取正确的措施,将要求对软件、缓存使用方式、线程和内存进行仔细的检查。

同理,虽然Windows无疑理解SMT,在调度线程时不会使忙碌的线程在同一个物理内核上运行,但游戏的表现在某种程度上则参差不齐。虽然许多游戏在开启和关闭SMT情况下的表现几乎没有差别,数款游戏在开启SMT的情况下表现有所提升,少数几款游戏的表现则有相当大程度的恶化。出现这种情况的一个可能原因是,游戏能检验硬件,“看到”16个内核,并创建16个计算密集型线程。这会迫使线程竞争资源。对游戏进行更新,使它能知道SMT处于开启状态,并因此少创建一些线程,可能能够解决这个问题。

即使游戏开发者根据AMD的建议针对Ryzen设计对游戏进行优化,也不要预期游戏性能会有大幅度提升。虽然未来驱动程序可能会有小的改进,但根据以往的经验判断,Ryzen未来运行游戏的表现将与目前基本相当。

ComputerBase过去的数据提供了一些线索。它以非常低的分辨率对游戏进行测试,使处理器的负载达到最大,使对显卡的影响最小化。

2012年,当时刚发布的FX 8350处理器(采用AMD的Piledriver内核),性能相当于英特尔Sandy Bridge i5-2500K的85%,与两款处理器搭档的是GTX 680显卡。2015年,通过利用速度快得多的显卡——集成有6GB显存的GTX Titan,两者的性能差距有所收窄,但幅度非常小:8350性能相当于i5-2500K的87%。

对于没有更新或更新幅度很小的游戏,这并不让人感到太意外。这些游戏绝不会针对Ryzen进行“优化”,虽然显卡驱动程序或AMD 神秘的“内核/缓存拓扑结构”建议可能略微提升性能,它们不足以大幅降低游戏对计算能力的需求。严重依赖1或2个计算密集型线程的游戏,绝不可能很好地支持Ryzen的8个内核和16个线程。把负载分配到这些内核上,要求重写部分游戏代码,以充分利用Ryzen的能力。开发者对已经发布的一款游戏“大动干戈”很罕见。

对于未来的游戏,或极少数发布后得到大幅升级的游戏,Ryzen的未来似乎更光明。但对于AMD来说令人遗憾的是,Broadwell-E,甚至是英特尔尚未发布的Skylake-E,前景也很光明。

Ars Technica与数家游戏开发商就优化游戏和Ryzen的未来进行了沟通。一些话题很清楚:高性能游戏基本上是利用C++语言开发的,微软Visual C++是应用最广泛的开发工具。开发者似乎对手工利用汇编语言开发针对具体处理器的代码缺乏兴趣。

这也带来了一些后果。与任何优秀的C++编译器一样,Visual C++会努力优化它生成的代码。例如英特尔处理器能一次译码4条指令:3条“简单”指令和第四条“复杂”指令,译码后的部分指令能“融合”在一起,这意味着它们能在一个运算单元上执行,而非必须使用多个运算单元。

如果编译器生成两条紧挨的“复杂”指令,它们都将竞争复杂译码器,其中一个就必须进入等待状态。如果编译器生成连续的复杂-简单-简单-简单、复杂-简单-简单-简单指令序列,所有译码器可以得到同时利用。同样,如果译码器尝试优先生成能融合的指令,这会释放更多运算单元——它们可以被用来执行更多指令。

过去,Visual C++的优化选项包括针对具体微架构优化代码的能力。这意味着,除遵循最优指令译码的一般规则外,偏好某些特定指令序列。例如,当为奔腾4处理器编译代码时,编译器可能会尝试避开“分支”指令——原因在于奔腾4较长的管道、预测错误后颇高的开销,而使用“条件转移”指令——它根据第三个寄存器的结果,把一个值由一个寄存器赋予另外一个寄存器,不要求使用分支操作。

但是,当前版本的Visual C++编译器不提供针对特定架构生成代码的能力。其他编译器——例如gcc,还保留着这一能力。但Visual C++旨在生成通用代码。鉴于过去10年英特尔和AMD处理器相似的约束条件,这是合理的,但也产生了一个后果:如果Ryzen在指令调度方面有任何特定要求,这些要求可能都无法满足。开发者相信他们的编译器是明智的,他们不会以手工方式利用汇编语言开发游戏引擎,以充分发挥编译器无法利用的处理器性能。

这会对性能产生重大影响:AMD K8处理器中分支预测器的不足,要求不同寻常的解决方案,以达到最高性能。如果Ryzen存在相似的问题,无法生成针对Ryzen优化的代码,会影响到系统性能。

但开发者在更高层次上考虑他们针对的处理器的能力。由Oxide Games和Stardock Entertainment开发的《奇点灰烬》(Ashes of the Singularity),被微软和AMD作为利用先进技术的游戏范例。这款游戏是DirectX 12的早期采用者,经常被用来展示DirectX 12使游戏引擎可以把负载更高效地分配到多个内核,从而降低处理器开销和提供最高性能的能力。

很自然,Oxide对Ryzen有兴趣。该公司开发人员向Ars Technica表示,通过把大型软件任务分拆成能并行处理的更小部分,Nitrous引擎能分布到多个内核上运行。对于给定的3D场景,系统集成的内核越多,每个任务的规模就越小。Nitrous引擎能自动把更大任务分拆成更小任务。

未来

Ars Technica称,未来,影响游戏性能的一大因素,可能是游戏引擎智能地将负荷分配在大量内核上的能力。Stardock首席执行官布拉德·瓦德尔(Brad Wardell)向Ars Technica表示,Nitrous游戏引擎开发者就面临选择:致力于提高在更少内核上运行的速度还是将负荷分解成能并行运行的模块。由于拥有更多内核,Ryzen有助于推动游戏引擎的开发走向后一个方向。其他游戏开发公司可能会跟风。

Oxide的蒂姆·基普(Tim Kipp)也向Ars Technica表示,在运行不能并行运行的引擎方面,内核多的系统表现更好,解决这些问题“对内核数量少的系统也有好处”。

Oxide喜欢能广泛提升系统性能的算法优化。大多数C++代码相对地独立于处理器特性,对一种系统有帮助的技术——例如对数据打包使之能更好地存储在缓存中,也对其他系统有帮助,当Oxide提出新技术时,新技术将面向更广泛的系统。

至于使软件在某种处理器上性能高于其他处理器的技术,想都别想。Oxide高管蒂姆·基普(Tim Kipp)向Ars Technica表示,他们努力避免手工编写汇编语言代码,因为维护成本太高。至于像SSE2和AVX这样的矢量指令——Nitrous广泛使用了这类指令,基普更愿意使用编译器内联函数。由于内联函数能自由地与普通C或C++代码混用,使用它们比使用汇编语言编写的代码要容易得多,又能提供汇编语言代码的大部分性能。

游戏引擎也提供了一些使用Ryzen特性的途径。瓦德尔和基普向Ars Technica表示,他们尚没有机会充分了解Nitrous在Ryzen上运行的性能,不过他们表示,Nitrous有自己的内存管理器和向内核分配负荷的调度程序。大体上,它们会避免跨CCX内存共享,有利于发挥Ryzen的优势。

《奇点灰烬》和EA DICE的《战地1》(Battlefield 1)等游戏,已经能高效地利用大量内核,把负载均衡地分配在多个内核上。其他游戏——例如《古墓丽影:崛起》,只能使1或2个内核高负荷地运行,不能高效地利用Ryzen和Broadwell-E提供的多个内核。

未来数年,Ars Technica预计高性能游戏不能充分利用多个内核的尴尬将成为历史。虽然它们只能利用2或4个线程,支持多线程的一个合理方法,是创建数个不同的、定义明确的任务,使每个任务在各自的线程中运行,例如,一个线程用于渲染画面,一个线程用于处理音效,一个线程用于处理人工智能……。但是,随着开发者需要考虑同时利用的线程增加到数十个,这种方法就无能为力了,像Nitrous中那样的系统——把画面渲染负载分配到所有内核的任务由游戏引擎本身完成,就至关重要了。游戏没有16个相互平衡、定义明确的任务需要完成。它需要分解负载,充分利用系统能提供的内核。

《模拟城市(2013)》(2013 SimCity)的基本限制之一是,核心的模拟引擎只能在一个线程上运行,图像和音效引擎则能利用多个线程。但是,由于模拟引擎只能在一个内核上运行,这款游戏很快遭遇性能障碍。

较新的游戏也没有能摆脱这一问题:《文明VI》在Kaby Lake系统上运行的性能远高于Broadwell-E或Ryzen。线程负载不均衡,部分内核很忙,部分则比较空闲。

把负载分配在多个线程上很困难,因为每个决策——人工智能攻击这个还是那个单元、游戏角色应该完成这件还是那件工作,都取决于它之前的所有决策,如果在各自线程上运行的两个游戏角色选择同时完成相同的任务,《模拟城市》就乱套了。虽然可以利用锁机制确保只有一个游戏角色完成任务,由此引发的开销可能抵消多进程带来的潜在好处。

在有些游戏中,一定程度上不遵守这一要求是可能的,但《文明VI》这类游戏,要求人工智能控制的角色具有确定性:在地图和单元相同的情况下,人工智能应当每次都做出相同的决策。这对于网游更是必不可少的:所有游戏玩家都需要人工智能游戏角色一视同仁,否则每个游戏玩家的游戏玩法将互不相同。

集成有大量内核的系统未来更光明。Ars Technica预计,在新游戏引擎设计、DirectX 12和Vulkan普及推动下,未来2年将出现能高效在4个内核、8个线程上运行、画面精美的游戏,这无疑对Ryzen有利。未来,Windows,甚至游戏本身,将会改版,以与Ryzen略不同寻常的缓存结构和谐的方式运行。但是,部分多线程症结将依旧存在,这对于AMD和英特尔处理器来说可能会继续是个问题。

来源:Ars Technica

继续阅读与本文标签相同的文章

分享至:

你可能感兴趣 换一换

分享到微信朋友圈 ×
打开微信,
使用“扫一扫”即可将网页分享至朋友圈。