安兔兔節(jié)操碎一地 Intel Atom高分真相
泡泡網(wǎng)CPU頻道7月13日 第三方調(diào)研公司ABI Research以安兔兔成績盛贊Intel Atom處理器性能超過高通、三星一事其實是5月中發(fā)生的,今天EETimes上篇博文又談到了這件事,認(rèn)為ABI只用安兔兔成績說事有些武斷,他又列舉了其他評測項目的成績來反駁,并認(rèn)為安兔兔從2.9.3版到3.x的評分機制變化導(dǎo)致Intel處理器得分大幅上升,所以才占到了優(yōu)勢。
沒想到這件事并沒有結(jié)束,既然雙方爭論的焦點是安兔兔軟件,Anandtech論壇上就有一位愛較真的網(wǎng)友(應(yīng)該是個程序員或者開發(fā)者)分析了安兔兔軟件,結(jié)果卻讓人很震驚,他認(rèn)為安兔兔有故意為Intel處理器優(yōu)化甚至使用對ARM不公平的方式了評分。
如果此事成真,那么安兔兔的節(jié)操就要灑滿一地了。
下面來看一下他的分析。
安兔兔是怎樣的一個程序
首先是解包安兔兔程序,APK程序?qū)嶋H上就是一個標(biāo)準(zhǔn)的ZIP壓縮文件,這一步?jīng)]什么難度。解包后在lib庫中發(fā)現(xiàn)了X86和ARM-v7a目錄,分別對應(yīng)Intel和ARM處理器。然后再解包libabenchmark.so文件,他用的是objump軟件。
下面就來理解一下安兔兔軟件的根基了,原文作者從解包出來的文件中發(fā)現(xiàn)安兔兔實際上就是nbench,因為二者的功能及函數(shù)之類的東西都是一樣的,我們可以說安兔兔的CPU整數(shù)和浮點測試都是基于nbench的,后者的源碼地址在http://www.tux.org/~mayer/linux/bmark.html。(原來安兔兔的測試部分不是自己開發(fā)的,也開源程序DIY的?。?/P>
現(xiàn)在繼續(xù)我們的目的,揭開為啥安兔兔3.x測試中Intel處理器跑分這么高的原因。之前EETimes一文質(zhì)疑的原因就是在于從2.9.3版升級到3.0之后,Atom處理器總分及內(nèi)存測試分別提升了122%、292%,而三星Galaxy S4只提升了53%、59%,這其中的區(qū)別耐人尋味。
Atom超高跑分第一個疑兇:編譯器
找出的第一個“疑兇”是編譯器,安兔兔針對X86使用的是ICC編譯器,這是一種公認(rèn)的高質(zhì)量矢量化編譯器,而矢量化恰恰是ARM處理器不擅長的,因為后者缺少整數(shù)NEON指令。
安兔兔針對ARM處理器使用的是GCC編譯器,而且也不支持ARM的NEON指令,因為存在著Tegra 2這樣早起的處理器不支持NEON指令的情況,但是現(xiàn)在來看這些不是理由,NDK中使用獨立代碼支持NEON指令不是難事,這也是Google的文檔中標(biāo)準(zhǔn)的開發(fā)范例。
令人奇怪的就是安兔兔不按照Google的開發(fā)范例支持原本應(yīng)該支持的功能,卻對不屬于NDK標(biāo)準(zhǔn)支持之內(nèi)的ICC編譯器青睞有加。
編譯器的問題只是一個開始,下面還有更精彩的,它們的作用甚至比編譯器更“出色”。
第二疑兇:代碼優(yōu)化
Nbench測試時會檢查CPU是怎樣執(zhí)行簡單的按位操作的,包括shift位移、and加、or或等,為了執(zhí)行這些,它會在內(nèi)存載入一系列bit,每次載入一個,具體的代碼如下:
再來看ARM和X86是如何具體執(zhí)行的。
ARM處理器執(zhí)行的代碼
X86執(zhí)行的代碼
X86上的代碼在做的是講整個32bit運行到0或者1,其中的f64c3和f64c6是關(guān)鍵。它用這兩個指令取代了ARM循環(huán)中的32次迭代。這個的作用就不需多說了,X86用這種方式獲得了十多倍的運行速度提升。
這種做法打破了整個測試過程。當(dāng)編譯器本來打算用一些被測試程序認(rèn)定為正確的操作來提升測試程序的性能時,它實際上并沒有執(zhí)行真正的測試程序功能。典型的例子就是如果結(jié)果沒有被讀取,它就省去了代碼,或者是在輸入數(shù)據(jù)被認(rèn)為是常量時,它可以將原本需要的運行時間縮減到只需編譯時間即可。
在這種情況下Intel肯定會宣稱這是他們正當(dāng)?shù)膬?yōu)化而已,但是原文作者不贊同,認(rèn)為這種優(yōu)化很難被當(dāng)做正常的代碼,用處也很有限,因為沒誰會用這樣的代碼來執(zhí)行。這種伎倆更應(yīng)該被認(rèn)為是一種作弊,因為當(dāng)運行長度不是非常大的時候它甚至?xí)?/P>
更重要的是,這種優(yōu)化是在最近的一次版本升級中才出現(xiàn)在ICC中的,作者不認(rèn)為他們是最近才發(fā)現(xiàn)了這種優(yōu)化的價值,更可能的情況是他們發(fā)現(xiàn)這種優(yōu)化可以數(shù)倍提升安兔兔分?jǐn)?shù),或者這也可以解釋為什么最近曝光的下一代Atom處理器在1.1GHz頻率下都能以4萬的高分秒了2.3GHz的驍龍800了。
我們簡單歸納一下作者的觀點和論據(jù):Atom處理器跑分高有兩個原因,一個是編譯器的原因,X86使用的ICC編譯器優(yōu)化很好,而針對ARM所用的GCC編譯器甚至都不能支持ARM的NEON指令。第二個就是安兔兔代碼中,將X86運行測試程序的代碼“優(yōu)化了”,只需2個指令就能完成ARM處理器需要進(jìn)行的32次迭代,但是這種優(yōu)化對實際性能沒有好處,這種反常的設(shè)計頗有尋味之處。
原文最后把矛盾的焦點轉(zhuǎn)向了安兔兔,因為他們默認(rèn)了這樣的性能提升,還認(rèn)為安兔兔有可能是收錢了(probably for a price),不然這些反常的現(xiàn)象是沒法解釋的。
Intel、ARM出面掀起新高潮
原文的翻譯差不多完了,因為是技術(shù)文章,個別語句可能把握的不夠準(zhǔn),不過大體意思我們是知曉了的。我能這么早看到這篇文章其實是微博所賜,發(fā)這個鏈接的正是ARM移動市場經(jīng)理王駿超EW,微博發(fā)出之后很快就有人回復(fù),其中一個人則是Intel中國研究院首席工程師吳甘沙,看完Intel對ARM還是很關(guān)注的嘛,這讓人想起了錢鐘書說過的一句話:情敵之間的掛念有時候要比情人之間的牽掛還要多。
王先生雖然發(fā)了鏈接,不過自己并沒有說太多,但他顯然是站在揭黑幕、維護ARM的立場上的,而吳先生也客氣地解釋了這個問題,他認(rèn)為編譯器也是架構(gòu)競爭力的一部分,用ICC無可厚非,而且ARM的NEON指令是比不過Intel的SSE 4.x指令集的。他還認(rèn)為原文的分析并不能解釋Atom在安兔兔多數(shù)程序上的優(yōu)勢。
總之,現(xiàn)在這件事已經(jīng)多多少少地從媒體牽扯到了ARM、Intel兩家公司出面了,而涉及最深的應(yīng)該是安兔兔,目前還沒有他們的表態(tài),只是從這篇文章的分析來看,安兔兔不管有沒有收錢,在這件事上都是有不光彩行為的?!?/P>
關(guān)注我們



