国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

創(chuàng)建可移植的64位應(yīng)用程序代碼

2019-11-17 05:17:24
字體:
供稿:網(wǎng)友
靈活地使用編譯器開關(guān)選項可生成具移植性且高度優(yōu)化的代碼,你用了嗎? 充分利用AMD 64位技術(shù)需要以下三個條件:必要的AMD64硬件平臺,一個可支持AMD64的操作系統(tǒng),和一個支持AMD64 的64位編譯器。AMD公司提供了第一個條件,Window和linux提供了第二個條件,而一些開發(fā)工具提供了最后一個條件。這篇文章主要著重于闡述怎樣設(shè)置Windows(Visual C++ 2005)及Linux(gcc 3.3.3)環(huán)境下的C/C++編譯器選項。雖然PathScale和Portland Group公司等幾個開發(fā)工具提供商推出了支持AMD64架構(gòu)的編譯器產(chǎn)品,但對于大多數(shù)Windows和Linux下的開發(fā)者來說,Microsoft和gcc編譯器仍然是不二的選擇。Microsoft編譯器雖然Microsoft還沒有完全發(fā)布針對AMD64的操作系統(tǒng),但通過它的消費(fèi)者預(yù)覽計劃,已經(jīng)提供了一個beta版操作系統(tǒng)可供使用,這個叫做Windows xp PRofessional x64的系統(tǒng)已經(jīng)可以獲取,這個產(chǎn)品的早期版本有不同的名字,所以不要弄混淆了。在這要討論的C/C++編譯器是Microsoft Visual Studio 2005 Beta的其中一個組件,MSDN的訂閱用戶不用任何費(fèi)用就可以獲得。有關(guān)編譯器的信息及開發(fā)環(huán)境目前都是已知的。在開始設(shè)置編譯器選項之前,必須要注重的是,沒有任何選項可以把程序代碼從32位轉(zhuǎn)換成64位。要移植的代碼必須多留意ILP(整型、長整型和指針),如:一個整型占用幾比特位,長整型、指針呢。這三種類型的數(shù)據(jù)也許代表了為什么移植的程序會悄無聲息地失敗的一系統(tǒng)問題。在x64的應(yīng)用程序二進(jìn)制層面上,ILP分別是32位、32位和64位(注重這與64位Linux上的ILP不同),所以,在移植代碼到新平臺之前,要充分考慮這些數(shù)據(jù)的位寬。-Wp64 -W3,這一對應(yīng)用于32位代碼的編譯器選項可以標(biāo)識出移植到64位平臺的潛在問題。選項Wp64是主要的作用因素,而-W3只是簡單地告訴編譯器要使用三級警告,而三級警告通常是建議性的,比如就像可移植性問題(但較低的警告級別通常會指出更嚴(yán)重的問題所在),這些選項將會捕捉到對數(shù)據(jù)值的無意識截斷。從個人角度來說,不管目標(biāo)平臺是什么,都要打開這些選項,以保證編寫出的代碼都具有可移植性。假如使用Visual Stuio .NET,通常可以在"工程"->"屬性"對話框中,在GUI模式下打開這些選項,然而,你還是可以從命令行模式使用make [程序名]或批處理文件,來編譯程序,通常是在命令行中鍵入 cl 命令,這個命令將調(diào)用C/C++編譯器。命令后面緊接著依次是:開關(guān)選項、文件名、鏈接期間選項。一旦你寫好的代碼能正常運(yùn)行,通過設(shè)置以下的優(yōu)化選項,可在運(yùn)行平臺上得到更好的執(zhí)行效率(以下只是針對AMD平臺的建議)。-O2打開幾個標(biāo)準(zhǔn)的優(yōu)化步驟-Ob2打開內(nèi)聯(lián)函數(shù)展開(小函數(shù)將在被調(diào)用處內(nèi)聯(lián)處理,這比直接調(diào)用它們效率更高)-GL打開內(nèi)部過程優(yōu)化(只在函數(shù)間)-fp:在浮點(diǎn)數(shù)學(xué)運(yùn)算中,假如只是導(dǎo)致精度稍微的損失,那么加快運(yùn)算形式。假如需要極度精確的浮點(diǎn)結(jié)果,可能你要避免使用此選項,但假如在數(shù)字的最后一些位中,程序可接受取整(四舍五入),使用此選項將會極大地提高浮點(diǎn)執(zhí)行效率。在本文后面的參考資源中,會有關(guān)于此折衷方法的具體解釋,同樣也會解釋通過使用pragma,怎樣在函數(shù)調(diào)用函數(shù)時打開快速浮點(diǎn)功能。 Visual C++ 2005帶來了配置向?qū)?yōu)化(profile-guided optimization PGO),這種形式的優(yōu)化只是由兩個步驟得來的結(jié)果。首先,代碼將會通過設(shè)備化(-LTCG:PGI)選項來編譯,接下來程序會運(yùn)行,在運(yùn)行期間,設(shè)備化代碼產(chǎn)生一個可執(zhí)行的概括文件,這個文件包含了哪些函數(shù)被調(diào)用,是以什么順序呢等信息。運(yùn)行過幾次之后,程序?qū)⒃谠创a級重新編譯,并且使用設(shè)備化文件作為輸入。編譯器此時在程序執(zhí)行模式的基礎(chǔ)之上,再進(jìn)行一次附加的優(yōu)化(這次編譯使用-LTCG:PGO選項)。設(shè)備化可以告訴編譯器許多重要的信息,例如:假如兩個函數(shù)總是一個接另一個地執(zhí)行,可能的話,就把它們放在同一個內(nèi)存頁當(dāng)中。基于AMD芯片的電腦上,Microsoft自己的測試表明(相關(guān)詳見資源中有關(guān)PGO的文章),在benchmark測試中,配置向?qū)?yōu)化將帶來大約10%的性能提升。假如程序不是面向大眾的,可以考慮關(guān)閉一個Microsoft缺省打開的安全特性:偵測緩沖溢出(-GS)。假如程序不是多線程的,也可以考慮關(guān)閉產(chǎn)生線程安全代碼的缺省選項(-D_ST_MODEL)。關(guān)閉這兩個選項會帶來稍微的性能提升,但要確定必須是在沒有犧牲安全的情況下?lián)Q來這點(diǎn)速度提升。拿不準(zhǔn)的話,還是讓它們?nèi)笔〈蜷_吧。利用上述的這些開關(guān)控制選項,可得到Microsoft Windows平臺上干凈、快速、且可具移植性的程序代碼,那我們再來看看Linux。 photoshop教程 數(shù)據(jù)結(jié)構(gòu) 五筆輸入法專題 QQ病毒專題 共享上網(wǎng)專題 Google工具和服務(wù)專題 GCC編譯器
在Linux平臺上,GNU gcc C/C++編譯器存在著許多種不同的版本。對于在Linux平臺下的AMD64應(yīng)用程序二進(jìn)制層面上,ILP是32位、64位和64位。正如前面所說的,在移植代碼到新平臺之前,要充分考慮這些數(shù)據(jù)的位寬。AMD推薦以下可以使用AMD64技術(shù)的操作系統(tǒng)版本,它們是:Red Hat Enterprise-gcc-ssa (從3.5開始的一個分枝)-package: gcc-ssa 安裝于 /usr/binSuSE Linux-gcc 3.3.3 (Hammer版)-package: gcc-33 安裝于 /opt/gcc33以上兩個版本的gcc通過使用下述選項,都可以生成更快的代碼,這對gcc來說,終歸是一場挑戰(zhàn),因?yàn)橄鄬τ趦?yōu)化,它最初的設(shè)計目標(biāo)是創(chuàng)建可具移植性的代碼。-O3打開幾個通用的優(yōu)化-ffast打開浮點(diǎn)數(shù)學(xué)運(yùn)算的更快方法,與之前提過的Microsoft的選項類似-funroll-all-loops將把所有的循環(huán)解開成代碼。這個開關(guān)選項使可執(zhí)行文件的體積變大,但能改善執(zhí)行效率,然而,測試一下此選項所帶來的改變是非常重要的。舉例來說,假如因?yàn)檠h(huán)被展開后,不再適合放入緩存,那實(shí)際上將降低性能,因此,有些循環(huán)最好還是不要管它。多試幾次,將會有助于判定此選項帶來的價值。64位GCC編譯器同樣也提供了配置向?qū)?yōu)化(profile-guided optimization PGO)。想了解PGO是如何運(yùn)作的更多信息,參考前面所提及的Microsoft編譯器部分。對以上提及的gcc編譯來說,要想使用PGO,第一步是帶上-fprofile-arcs選項,接下來在重新編譯中打開-fbranch-probabilities選項。還有一件更重要的事,假如程序中有許多數(shù)學(xué)運(yùn)算,就像計算FFT、調(diào)用觸發(fā)器函數(shù),或者解算線性代數(shù),可能此時就要考慮使用AMD核心數(shù)學(xué)庫(ACML),它提供了針對于含有AMD64技術(shù)芯片的高度優(yōu)化的函數(shù)。在這些數(shù)學(xué)函數(shù)被經(jīng)常調(diào)用的密集循環(huán)中,ACML能帶來實(shí)質(zhì)上的性能改變。總之,明智地使用這些開關(guān)選項,你可以在AMD64平臺上生成可具移植性,且極有效率的代碼。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 盐源县| 阿瓦提县| 竹山县| 永新县| 长治市| 和林格尔县| 沅陵县| 新巴尔虎右旗| 治县。| 蓝田县| 九龙城区| 太谷县| 化德县| 集贤县| 铜山县| 木兰县| 额敏县| 吴川市| 紫云| 平乐县| 年辖:市辖区| 竹北市| 新巴尔虎左旗| 济源市| 那坡县| 隆德县| 青田县| 南陵县| 辽阳市| 清原| 巴南区| 东丰县| 玉屏| 柘城县| 河津市| 高青县| 安康市| 镇宁| 潼南县| 吉安市| 富裕县|