微软是祸首? Intel游戏落败深入分析
在整个2005年,计算机业内最热闹的当数Intel和AMD两大巨头的争斗,从市场到法院,甚至还要摆擂比试。对于消费者来说,最关心的是性能和价格,各种测评横比层出不穷。
各种测评的结论只有一个,同档次的处理器中,Intel的产品性能不及AMD,价格比AMD还高。每次测评结果都让AMD的Fans们扬眉吐气,Intel的支持者当然也不会服气,争论此起彼伏。
所有的人都在想:Intel到底差在哪里?
我们做了一个简单的概括,其原因在于以下四点:
1、CPU的核心电路的设计
2、流水级数不同。例如:流水线级数Intel 0.09UM Precott核心级数是32,AMD 0.09UM Venice 核心的级数是24级,在处理数据的时候Intel的质量好于AMD ,在游戏的时候AMD处理效率更优。
3、AMD的专利技术(3D Now!Professianl)是处理3D的强项
4、AMD的Athlon 939系列的CPU都内植了内存双通道控制器,在读内存数据时的效率好于Intel,Intel CPU只能通过另外的芯片,主板北桥的内存双通道控制器。
有人认为AMD在处理器中集成内存控制器是根本原因,有人认为是流水线长度等架构问题导致了Intel的落后。可能所有的人都是从硬件上来探讨,忽略了计算机系统包括硬件和软件两大部分。
Doom 3中,1024 x 768分辨率下,AMD顽胜对手。
Doom 3中,在1280x1024分辨率下,AMD和Intel互有胜负。
QUAKE III中还是AMD相对领先Intel。
这款游戏虽然命名为2004,但采用的仍是上一代UT2003的图形引擎,也就是说UT2004仍然是一款基于DirectX8.1的游戏,而并非大家所猜想的DirectX9,这不能不说是一个遗憾!虽然如此,UT2004超强的图形表现还是进一步提高了对系统。
虚幻竞技场2004 (Unreal Tournament 2004) 是一个受欢迎的FPS游戏,我们的测试采用timedemo的方法。Unreal Tournament 2004中也是AMD以绝对优势领先对手。
《Far Cry》游戏的完美画面与《虚幻2》不相上下。受大众喜爱的引擎“ragdoll physics”完全达到效果。绝对的全屏抗锯、纵深场景的细致刻画、真实的物理效果、实时光影效果……游戏在画面上的表现可以说已经达到了CG品质,比起去年E3上技压群雄的《DOOM 3》也是毫不逊色。FarCry中还是向AMD一边倒的情况。
Battlefield 2在今年夏季发布,是当前最流行的军事战略游戏之一,对显卡的要求不是非常高。我们之所以挑选这款游戏除了因为流行外,还有另一个理由,就是和其它的射击游戏不同,Battlefield 2更多的是需要CPU资源,而不是显卡资源,更符合本篇文章的主题。
这位名叫Levichi的程序员在仔细阅读了一篇测评文章后,进行了深入的分析,通过对Battlefield 2进行了反编译,得出了两个结论:
1、 游戏是使用Visual Studio 2003 C++编译的
2 、编译采用了混合模式(blended mode),几乎没有任何优化。
在微软MSDN网站上,对混合模式是这样描述的:
When no /Gx option is specified, the compiler defaults to /GB, "blended" optimization mode. In both the 2002 and 2003 releases of Visual C++ .NET, /GB is equivalent to /G6, which is said to optimize code for the Intel Pentium Pro, Pentium II, and Pentium III.
当不使用/Gx选项时,编译器缺省使用/GB 混合模式。在Visual C++ .NET 2002和2003中,/GB等价于/G6,为Pentium Pro、Pentium II和Pentium III优化。
微软推荐程序员为Pentium 4和Athlon系统编程时使用/G7。MSDN网站是如此描述的:
The performance improvement achieved by compiling an application with /G7 varies, but when comparing to code generated by Visual C++ .NET 2002, it''s not unusual to see 5-10 percent reduction in execution time for typical programs, and even 10-15 percent for programs that contain a lot of floating-point code. The range of improvement can vary greatly, and in some cases users will see over 20 percent improvement when compiling with /G7 and running on the latest generation processors. Using /G7 does not mean that the compiler will produce code that only runs on the Intel Pentium 4 and AMD Athlon processors. Code compiled with /G7 will continue to run on older generations of these processors, although there might be some minor performance penalty. In addition, we''ve observed some cases where compiling with /G7 produces code that runs slower on the AMD Athlon.
编译中使用/G7选项带来的性能提高情况不同,但是相对于Visual C++ .NET 2002产生的代码,这个选项通常对于典型程序可以缩短5-10%的执行时间,对于含有大量浮点运算的代码,甚至可以缩短10-15%。使用/G7选项编译带来的性能提高幅度变化很大,在最新的处理器上运行,在某些情况下可能有超过20%的提升。
使用/G7选项并不意味着编译器产生的代码只能在Intel的Pentium 4和AMD的Athlon处理器上运行,仍然能够在以前的处理器上使用,只是性能会稍有损失。此外,我们注意到在某些情况下使用/G7选项产生的代码在AMD Athlon处理器上运行要慢一点。
但是微软的这段描述也不确切,AMD的Athlon可能指的是32位的K7系列,如Athlon XP和更早的产品。而现在的90nm制程的Athlon 64系列支持全部的SSE、SSE 2和SSE 3指令集。
在MSDN的文档中还暗示着,使用/G7选项产生的序列可能包含更多的指令,避免使用高延迟指令,在Pentium 4处理器上运行效率更高,就如同IMUL。
我们回到Levichi的邮件:
... it would be logical to at least compile the game code with /G6 and /arch:SSE switches. That however, is not the case. I have checked it and the code uses only FPU, which is known to work slower on Pentium 4s. Moreover it uses pretty inefficient integer code too. Even /G6 would help a lot by enabling the compiler to generate conditional moves instead of many conditional branches, which are known to penalize NetBurst architecture so much.
理论上讲,编译游戏时至少应该使用/G6和/arch:SSE选项,但事实并非如此。我检查了代码,只使用了Pentium 4上缓慢的浮点运算单元,此外还使用了效率低下的整数运算。/G6选项能够使编译器产生条件转移语句而不是条件分支,后者在NetBurst架构上会损失很多性能。
程序员这样做可能主要是因为偷懒和非常紧张的游戏开发日程。Levicki认为游戏开发人员不会花时间手工优化代码,只是随意使用或不使用某个选项,使用Visual C++而不是Intel的编译器,因此产生浮点运算代码而不是SSE代码。再回到Visual Studio C++,微软的在线文档说明,使用/ARCH:SSE和/ARCH:SSE2选项编译后能够自动发挥SSE/SSE2指令的优势。这并不意味这对AMD处理器会有什么不利影响,虽然理论上Pentium 4处理非闭环循环和Pentium 4特殊指令时比Athlon 64更有效,但在实际中很少有这样的情况。
而SSE/SSE2对AMD也有好处,甚至AMD的前首席技术长官Fred Weber也说过,单指令多数据(SIMD)是浮点运算的发展方向。
(注:单指令多数据技术是在一条指令内完成多对数据的运算,实质上是通过并行处理来提高处理器吞吐率。Intel在PentiumII的MMX技术中,就采用了SIMD,MMX是面向整数运算的,PentiumIII和更新处理器的SIMD技术是面向浮点数的。SSE就是Streaming SIMD Extensions的缩写,扩展SIMD指令流。)
通过与几位游戏游戏开发人员交流了解到,他们在编译的时候对一些可选项非常谨慎,因为对大型软件这些可选项可能会导致编译中断。不使用编译选项有制度方面的原因,也有程序员偷懒的因素。他们每周工作80多个小时,没人有功夫去尝试编译器的选项。
还有一个非常重要的因素,就是目前很多游戏都使用了第三方的类库和引擎,包括物理引擎、AI引擎、声音处理类库等等。在这种情况下,开发者只优化自己的代码几乎不会有什么提高。
如果您是游戏程序员或者中间件开发人员,我们非常希望得到你们的观点。您在编程的时候考虑到为所有处理器架构做优化了么?有没有尝试过编译器的选项?为什么?<