新聞中心
【經(jīng)典譯文】在多處理器計(jì)算機(jī)上提高構(gòu)建速度的一個(gè)極好方法是充分利用其并行處理能力,如果你在Visual Studio 2010中有一個(gè)C++項(xiàng)目,有兩種不同類(lèi)型的并行構(gòu)建配置方法供你選擇。

大安市網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián),大安市網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為大安市上千多家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站建設(shè)要多少錢(qián),請(qǐng)找那個(gè)售后服務(wù)好的大安市做網(wǎng)站的公司定做!
有哪些參數(shù)可以調(diào)整?
項(xiàng)目級(jí)并行構(gòu)建是由MSBuild控制的,它是在Visual Studio的解決方案級(jí)進(jìn)行設(shè)置的(實(shí)際上Visual Studio是為每個(gè)用戶(hù)都保存了設(shè)置,與你想象的可能有點(diǎn)不一樣,你可能認(rèn)為不同解決方案有不同的設(shè)置,但UI卻不允許你這么做),默認(rèn)情況下,Visual Studio選取你機(jī)器上的處理器數(shù)量作為***并行構(gòu)建項(xiàng)目的數(shù)量,如圖1所示,你可以將這個(gè)數(shù)字調(diào)大調(diào)小找出一個(gè)并行構(gòu)建速度最快的合適值,有些人可能喜歡將其調(diào)小,以便在構(gòu)建期間還可以做點(diǎn)其它工作。
圖 1 并行構(gòu)建項(xiàng)目的***數(shù)量
雖然MSBuild從Visual Studio接管了部分功能,但這里的設(shè)置仍然保持和Visual Studio 2008一樣。
如果你正在構(gòu)建C++或C++/CLI項(xiàng)目,還有一個(gè)地方你可以設(shè)置并行構(gòu)建參數(shù),CL編譯器支持/MP參數(shù),它告訴編譯器使用自身的一個(gè)單獨(dú)實(shí)例同時(shí)構(gòu)建它的子集,默認(rèn)的并行數(shù)仍然使用了CPU的數(shù)量,但你可以指定一個(gè)值,如/MP5,注意現(xiàn)在情況發(fā)生了一點(diǎn)變化,因此我要告訴你如何找到這個(gè)值,以及在MSBuild格式項(xiàng)目文件中看起來(lái)是什么樣子。
打開(kāi)項(xiàng)目的“屬性”窗口,轉(zhuǎn)到“C/C++”*“常規(guī)”窗口,我建議你選擇“所有配置”和“所有平臺(tái)”,在后面你才有更多的可選項(xiàng)。
圖 2 項(xiàng)目屬性設(shè)置
象往常一樣,通過(guò)轉(zhuǎn)儲(chǔ),你可以看到項(xiàng)目文件中有什么內(nèi)容,在“解決方案資源管理器”中的節(jié)點(diǎn)上點(diǎn)擊右鍵,選擇“編輯”。
圖 3
下圖顯示了項(xiàng)目文件的一部分代碼。
圖 4 項(xiàng)目文件代碼示例
在這里,所有類(lèi)型為“ClCompile”的項(xiàng)目都自動(dòng)擁有元數(shù)據(jù)MultiProcessorCompilation,默認(rèn)值為true,除非明確指定了一個(gè)不同的值。
順便說(shuō)一下,MSBuild項(xiàng)目通常都是一個(gè)文件,它們的子元素是元數(shù)據(jù),下面是一個(gè)例子,注意它們被放在一個(gè)“ItemGroup”中。
圖 5 MSBuild項(xiàng)目文件示例
因?yàn)檫@是一個(gè)元數(shù)據(jù),如果是高手,完全可以直接修改每個(gè)文件,你需要為使用了#import的文件禁用/MP,因?yàn)樗恢С?MP,其它不支持/MP的特性是/Gm,/Gm表示漸進(jìn)式編譯,更多參數(shù)請(qǐng)參考http://msdn.microsoft.com/en-us/library/bb385193.aspx。
回到多處理器CL,如果你想明確告訴CL有多少并行編譯執(zhí)行,Visual Studio可通過(guò)/MP實(shí)現(xiàn),它出現(xiàn)在全局設(shè)置中。
圖 6 C++編譯***并行任務(wù)數(shù)設(shè)置
Visual Studio通過(guò)一個(gè)全局屬性CL_MPCount進(jìn)行設(shè)置,這意味著在Visual Studio外構(gòu)建時(shí)將不受任何影響。
如果你選擇一個(gè)更細(xì)粒度的值,你就不能使用圖形界面進(jìn)行設(shè)置了,因?yàn)槟愀究床坏剿脑O(shè)置項(xiàng),這時(shí)就必須打開(kāi)項(xiàng)目文件直接進(jìn)行修改。在CLICompile項(xiàng)目上這是一個(gè)完全不同的元數(shù)據(jù)塊,叫做“ProcessorNumber”,你可以設(shè)定一個(gè)從1到你認(rèn)為合理的一個(gè)值,然后在/MP后也追加一個(gè)同樣的值,如果沒(méi)有
圖 7 ProcessorNumber和MultiProcessorCompilation設(shè)置
圖中出現(xiàn)的波浪線(xiàn)是一個(gè)小小的bug,直接忽略它。
#p#
如何在命令行上構(gòu)建?
/MP設(shè)置來(lái)自項(xiàng)目文件,因此在命令行上進(jìn)行設(shè)置作用是一樣的,它是整個(gè)MSBuild的一部分,在命令行上構(gòu)建和在Visual Studio中構(gòu)建是一樣的效果嗎?在Visual Studio中設(shè)置的全局并行設(shè)置不會(huì)影響到命令行,你必須親自給msbuild.exe傳遞/m參數(shù),這個(gè)參數(shù)是可選的,如果你不設(shè)置,它就使用CPU的數(shù)量,但和Visual Studio開(kāi)箱即用的特性不一樣,在命令行中如果不指定/m參數(shù),它只會(huì)使用1顆CPU,這個(gè)問(wèn)題可能在將來(lái)的版本中會(huì)得到修正。
圖 8 命令行構(gòu)建參數(shù)
如果想給/MP選任意的值,你可以設(shè)置一個(gè)環(huán)境變量,或象Visual Studio那樣傳遞一個(gè)屬性CL_MPCount。
在每個(gè)項(xiàng)目上都設(shè)置/MP是很煩人的,怎么才能提高設(shè)置效率?
你可能想在多個(gè)項(xiàng)目上使用/MP,但你又不想在每個(gè)項(xiàng)目上都設(shè)置一遍,Visual Studio解決這類(lèi)問(wèn)題的辦法是使用屬性表。首先從“視圖”菜單打開(kāi)“屬性管理器”,根據(jù)你使用的設(shè)置它的確切位置可能不一樣,下面是一個(gè)C++項(xiàng)目設(shè)置的位置。
圖 9 視圖菜單中的屬性管理器
在一個(gè)項(xiàng)目上點(diǎn)擊右鍵,選擇“添加新的屬性表”:
圖 10 給項(xiàng)目添加新的屬性表
我給它取了一個(gè)名字叫做“MultiprocCpp.props”,你將會(huì)看到該項(xiàng)目的所有配置都將添加這個(gè)屬性表,在它上面點(diǎn)擊右鍵,你將看到與項(xiàng)目相同的屬性窗口,但這個(gè)時(shí)候你編輯的是屬性表,再次將“Multi-processor Compilation”設(shè)為“YES”。關(guān)閉屬性窗口,在屬性管理器中選擇屬性表,然后點(diǎn)擊“保存”。
現(xiàn)在可以在編輯器中打開(kāi)新建的MultiprocCpp.props文件,我的看起來(lái)如下:
圖 11 在編輯器中打開(kāi)MultiprocCpp.props
仔細(xì)查看這個(gè)項(xiàng)目文件,你可以看到屬性表通過(guò)一個(gè)Import標(biāo)簽應(yīng)用到每個(gè)配置中了,這一點(diǎn)和C++中的#include非常類(lèi)似。
圖 12 通過(guò)Import引用屬性表
現(xiàn)在我們就可以重用之前在項(xiàng)目文件中的定義了,于是我可以在屬性管理器中選中多個(gè)項(xiàng)目,然后點(diǎn)擊右鍵,選擇“添加現(xiàn)有屬性表”。
圖 13 為多個(gè)項(xiàng)目同時(shí)指定屬性表
OK!現(xiàn)在所有項(xiàng)目編譯時(shí)都帶有/MP參數(shù)了。
在某些情況下,你可能想要更簡(jiǎn)單一點(diǎn),例如,你可能想要?jiǎng)h除大量的屬性表,幸運(yùn)的是,MSBuild 4.0有一個(gè)強(qiáng)大的,完整的對(duì)象模型,你可以使用它,再編寫(xiě)幾行代碼就可以搞定這種工作了。
如果你不想通過(guò)圖形界面進(jìn)行設(shè)置,完全可以自己手動(dòng)進(jìn)行編輯,例如,在VS自己的構(gòu)建中,我們?cè)诿總€(gè)項(xiàng)目的***都設(shè)置了一套屬性。
圖 14 手動(dòng)設(shè)置項(xiàng)目***屬性
在這里我們定義了所有類(lèi)型的全局設(shè)置,并導(dǎo)入了其它設(shè)置,我將在以后的文章中介紹組織大型構(gòu)建樹(shù)的方法。
#p#
并行數(shù)量太多了也不好
一般來(lái)說(shuō),利用完所有處理器或處理器核心就已經(jīng)足夠了,否則可能會(huì)導(dǎo)致機(jī)器變慢甚至崩潰,下圖就顯示了這樣一個(gè)例子。
圖 15 太多的并行構(gòu)建進(jìn)程很容易讓機(jī)器崩潰
我是在一臺(tái)8 CPU的機(jī)器上做的這個(gè)實(shí)驗(yàn),我把解決方案中的所有項(xiàng)目全部開(kāi)啟/MP了,然后使用msbuild.exe /m進(jìn)行構(gòu)建(我使用命令行進(jìn)行構(gòu)建不會(huì)出現(xiàn)這個(gè)問(wèn)題,但在Visual Studio中進(jìn)行構(gòu)建就會(huì)出現(xiàn)),如果相關(guān)依賴(lài)不能阻止它,MSBuild將立即啟動(dòng)8個(gè)項(xiàng)目,每個(gè)CL將會(huì)一次運(yùn)行自己的8個(gè)實(shí)例,因此總共會(huì)有64個(gè)CL運(yùn)行考驗(yàn)我們的處理器核心和磁盤(pán),這樣做不但不能提升速度,反倒會(huì)使性能急劇下降。
你可能希望有一天系統(tǒng)能夠?qū)崿F(xiàn)自我調(diào)整,但如果現(xiàn)在遇到這樣的問(wèn)題,你不得不手工調(diào)整。下面是一些建議:
◆將全局值設(shè)小一點(diǎn)
例如將/m:4減少到/m:3,或使用屬性表將/MP修改為/MP2,如果你的構(gòu)建中還有其它問(wèn)題,如有許多的并行項(xiàng)目,但并行的CL不夠,反之亦然,這個(gè)時(shí)候你都應(yīng)該將全局并行構(gòu)建參數(shù)調(diào)小。
◆為每個(gè)項(xiàng)目和配置調(diào)整/MP
有些時(shí)候使用/MP可能不是***的辦法,你也可以通過(guò)配置進(jìn)行調(diào)整,Retail配置可能會(huì)使速度變得更慢,因?yàn)榫幾g器要做的優(yōu)化更多了,為Retail開(kāi)啟/MP而不是為Debug開(kāi)啟/MP可能更有意義。
◆獲得超級(jí)定制
在你的團(tuán)隊(duì)中,你可能有一系列硬件,也許你的開(kāi)發(fā)人員使用的是雙CPU機(jī)器,但夜間構(gòu)建是在一臺(tái)8 CPU的機(jī)器上進(jìn)行的,兩者構(gòu)建時(shí)需要的來(lái)源是一樣的,你希望兩者的速度都不能太慢,在這種情況下,你可以使用環(huán)境變量,或是在MSBuild標(biāo)簽上設(shè)置條件,幾乎所有MSBuild標(biāo)簽都可以設(shè)置條件。
下面是一個(gè)例子,當(dāng)“MultiprocCLCount”有一個(gè)大于零的值時(shí),就可以使用這個(gè)值啟用/MP。
圖 16 通過(guò)環(huán)境變量調(diào)整處理器數(shù)量
MSBuild啟動(dòng)時(shí)將所有環(huán)境變量的值作為初始屬性值,因此在我更快速的機(jī)器上,我將MultiprocCLCount的值設(shè)為8,而在我的開(kāi)發(fā)用機(jī)上,我將其設(shè)為2。
類(lèi)似的方法還可以應(yīng)用到MSBuild.exe的/m參數(shù)中,如/m:%MultiprocMSBuildCount%,
在外來(lái)?xiàng)l件中還有其它屬性可能很有用,如$(Number_Of_Processors)表示邏輯處理核心數(shù)量,它來(lái)自環(huán)境變量。$(MSBuildNodeCount)是傳遞給msbuild.exe /m參數(shù)的值,在Visual Studio中,這個(gè)值是通過(guò)“工具”*“選項(xiàng)”進(jìn)行設(shè)置的。
***,我希望你能有效利用/m和/MP。希望你對(duì)我介紹的MSBuild功能能進(jìn)一步深入學(xué)習(xí),***自己動(dòng)手配置一次。
原文名:Tuning C++ build parallelism in VS2010
網(wǎng)站名稱(chēng):VisualStudio2010中C++并行構(gòu)建調(diào)優(yōu)
標(biāo)題鏈接:http://www.fisionsoft.com.cn/article/dhsegdj.html


咨詢(xún)
建站咨詢(xún)
