驱动程序:优化还是作弊?

整机外设

  目前图形处理器(GPU)的性能越来越强,相应的测试软件也越来越复杂。尽管这些软件仅仅是一个测量显卡性能的手段,测试软件也与驱动程序(以下简称驱动)一直相安无事。但自Futuremark年初发布了3DMark03以来,便引发了一场关于驱动的争论。今年2月,nVIDIA公司认为,3DMark03测试程序缺少对真实游戏的模拟,其中的飞行测试并不能完全代表现在的主流游戏。3月,FutureMark官方宣布以“涉嫌作弊”为由,封掉了某些雷管驱动程序3DMark03测试成绩,其中包含了雷管42.67、42.68和42.69驱动程序。5月,ATi与nVIDIA“DOOM Ⅲ大战”的硝烟还未散尽,Futuremark新推出的补丁则颇具针对性。安装3.3.0补丁后,nVIDIA显卡的测试成绩下降了24.1%,而ATi的下降了3%左右,“驱动事件”达到了高潮,在业界闹得沸沸扬扬。

  这正是我们今天所要探讨的话题:改进驱动程序,是优化(性能)还是(在测试中)作弊?

  NVIDIA──减少后置缓冲清除指令

  NVIDIA的驱动一直在DIYer中有良好的口碑,每一次的驱动更新也让发烧友兴奋不已,NVIDIA的GPU也正是凭借驱动程序而如虎添翼。没想到,这次让NVIDIA惹火上身的也正是它的驱动。

  1.忽略后置缓冲清除指令

  当3DMark03测试画面被载入时,NVIDIA的雷管驱动程序将运行针对3DMark03设计的忽略后置缓冲(back buffer)清除指令。绝大多数可支持OpenGL的3D显卡都会提供两组图形画面信息,一组显示,另一组备用。这两组图形画面信息通常被看作前置缓冲(front buffer)和后置缓冲。要显示流畅的3D动画,就得借助双重缓冲处理,这项功能让显示卡用前置缓冲存放正在显示的画面,而同时下一格画面已经在后置缓冲中待命。然后GPU会将两个缓冲互换,后置缓冲的画面会显示出来,且同时再在前置缓冲中画好下一格待命,如此形成一种互补和连续的工作方式,迅速对画面的快速改变做出反应。

  而NVIDIA受质疑的雷管驱动针对3DMark03的改进,可以自行减少GPU的工作量从而提升在测试中的性能。Futuremark公司发布的3.3.0补丁将让3DMark03测试画面以另一种方式载入,这样NVIDIA的雷管驱动程序将不能对3DMark03进行侦测,从而使缓冲清除指令可以正确执行,致使NVIDIA显卡的成绩大大下降。

  2.在着色渲染中减少执行后置缓冲清除指令

  在3DMark03的第二个游戏测试场景中,NVIDIA的雷管驱动能够检测到顶点着色引擎渲染,然后驱动将根据情况决定什么时候使用后置缓冲清除指令,什么时候不使用。如果在场景中不使用后置缓冲清除指令的话,在外层星空中图像将显得模糊。

  如果显卡支持1.4版本的顶点着色引擎的话,在处理过程中仅需要一个周期进行景深设置,一个周期完成一个光源生成,每帧要渲染大约15万个多边形。而如果程序运行中没有探测到有支持1.4版本顶点着色引擎的显卡存在,它就会转而使用Vertex Shader1.1,这样就在生成光源方面就要麻烦得多,要用三个周期,每一帧渲染多边形的数量就多达到25万个左右。

  因此,NVIDIA通过修改驱动程序、减少执行后置缓冲清除指令来提升老一代显卡的测试成绩。但这样却可能降低顶点着色缓存的命中率。如果缓存没有得到及时清空,那么在某些场景中就会出现错误的画面。一些使用3DMark03特别版本的工程师在一个“免费的凸轮”模式下发现雷管FX驱动产生的大量渲染错误(如图),很可能就是这个原因造成的(所幸的是,这个问题已经得到了解决)。

  ATi──优化着色引擎

  相对而言,ATi的催化剂驱动也存在“作弊”的嫌疑,只不过幅度小一些而已,。ATi的催化剂驱动程序的优化程度并没有NVIDIA的复杂。ATi的催化剂驱动主要针对3DMark03第四个游戏测试场景中的DirectX 9.0方面进行优化。

  1.优化顶点着色引擎指令集

  在DirectX 9.0中的顶点着色引擎(Vertex Shader)2.0引入了流程控制,增加了条件跳转、循环和子程序,这就大大加强了该引擎可编程性和效率。

  DirectX 9限制顶点着色引擎程序最大可以由64k条指令组成,不过这是包含了循环次数之后得到的数值。所有的Vertex Shader 2.0所能够支持的最大着色程序长度都是256,64k不过是程序运行后,所能够循环执行的最大指令数。

  由于R300/R350已经从硬件上支持顶点着色引擎了,ATi则通过使用变量技巧来编写复杂的操作,例如,两个矢量的叉积仅仅使用两条指令就可以实现。

  2.优化像素着色引擎指令集

  除了将顶点着色器的版本提升到2.0外,DirectX 9.0还把像素(Pixel Shader)也提升到了2.0。ATi的R300/R350也完全支持了Pixel Shader2.0。虽然像素着色引擎的分工与顶点着色引擎有所不同,但优化原理还是一样的。

  根据DirectX 9.0规范要求,在一个渲染流程中,每个像素可以采样最多16个纹理。由于R300/R350每条流水线仅拥有一个纹理单元,所以只能够通过循环方式多次利用纹理单元实现这一要求:第一个纹理在一个时钟周期被取样后,结果储存在采样阶段寄存器中,接下来是下一个时钟周期读取第二个纹理,这个过程被重复16次。

  至于ATi针对3DMark03是否改用更有效的纹理组合,在这里我们还不太清楚。值得注意的是,日前ATi已经承认了针对3DMark03第四个游戏测试场景中的DirectX 9.0进行优化。

  优化还是作弊?

  从目前的相关测试来看,改进驱动程序可以大幅度提高测试中的得分,那么这种作法是否可取呢?诚然,通过修改驱动程序可以提高性能,而这样做的也不仅仅只是NVIDIA、ATi这两家厂商。到底谁是谁非,我们在这里不好下结论,但笔者认为,修改驱动程序的最根本原则是要保证为用户在所有的程序中提供最佳的视觉体验,包括高帧率、画面质量以及稳定性。GPU厂商应该在显卡驱动优化方面取一个性能和画质的最佳平衡点,相信这正是大家所希望看到的。

  不过,我们除了正确看待GPU厂商驱动优化之外,还要对目前的测试软件持保留态度:所有测试软件所测试出来的成绩应该仅仅作为了解硬件性能的参考之一,而不是唯一参考。在实际应用中,更应参考显示卡在目前主流游戏中的实际表现。毕竟目前测试软件带有一定的前瞻性,并不能代表实际的3D游戏(如在3DMark03中大都采用了基于DX 8.1的Pixel Shader 1.4,但在目前支持DX 8的游戏中并没有采用Pixel Shader 1.4而是采用DX 8.0版中的Pixel Shader 1.1),仅仅代表了游戏、显卡未来的发展趋势。

  后记:

  就在这篇文章截稿的时候,我们收到了Futuremark和NVIDIA发布的声明文件,对“驱动事件”有了一个了结。

  Futuremark的声明:

  针对Futuremark在5月23日发布的白皮书,Futuremark和NVIDIA六个月来第一次对有关NVIDIA GPU和3DMark 03基准测试软件进行了深入的讨论。

  Futuremark现在对NVIDIA的优化策略有了更进一步的了解。有鉴于此,Futuremark现在正式宣布NVIDIA的驱动程序设计是为应用程序特别优化而非作弊。

  ……

  3DMark03是一个非优化的DirectX测试软件并据此提供性能比较。它没有包含厂商的特别优化,因为所有改变3DMark03工作量的修改都是被禁止的,我们被迫不断地更新我们的产品,以消除不同驱动程序的优化效果,从而使得3DMark03可以继续产生可比较的测试结果。

  NVIDIA的声明:

  NVIDIA与开发者紧密合作使得游戏能够为GeForce FX进行优化。这些优化(包含Shader优化)是共同开发过程的结果。这些方法同样也会应用于3DMark03上。

  NVIDIA与Futuremark的联合声明:

  NVIDIA和Futuremark都希望在业界建立一个有关基准测试应该如何开发以及如何使用的清晰的规则。我们相信共同的规则将会在将来避免这种不幸的情况再次发生。

  编辑札记:

  没有标准,就始终存在分歧;没有标准,就始终存在争论。在目前没有惟一的业界测试标准的情况下,驱动成了一把双刃剑。此外,我们也应该探讨一下驱动的真正意义。驱动应该在保证稳定的前提下提升性能,解决以前版本中存在的问题,而不应是一味地追求测试的分数。不仅仅是显卡驱动,主板驱动、BIOS设计都应该遵循这个原则;另一方面,基准测试软件的开发也应该考虑这些问题。

  优化性能决不能以牺牲品质为代价,优化只有为品质服务才能得到用户的认可。编者希望厂商把更稳定、更优化的驱动带给大家,而不是拔苗助长。