微軟是禍首? 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引擎、聲音處理類庫等等。在這種情況下,開發者只優化自己的代碼幾乎不會有什么提高。
如果您是游戲程序員或者中間件開發人員,我們非常希望得到你們的觀點。您在編程的時候考慮到為所有處理器架構做優化了么?有沒有嘗試過編譯器的選項?為什么?<


