日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
VisualStudio2010中C++并行構(gòu)建調(diào)優(yōu)

【經(jīng)典譯文】在多處理器計(jì)算機(jī)上提高構(gòu)建速度的一個極好方法是充分利用其并行處理能力,如果你在Visual Studio 2010中有一個C++項(xiàng)目,有兩種不同類型的并行構(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è)要多少錢,請找那個售后服務(wù)好的大安市做網(wǎng)站的公司定做!

有哪些參數(shù)可以調(diào)整?

項(xiàng)目級并行構(gòu)建是由MSBuild控制的,它是在Visual Studio的解決方案級進(jìn)行設(shè)置的(實(shí)際上Visual Studio是為每個用戶都保存了設(shè)置,與你想象的可能有點(diǎn)不一樣,你可能認(rèn)為不同解決方案有不同的設(shè)置,但UI卻不允許你這么做),默認(rèn)情況下,Visual Studio選取你機(jī)器上的處理器數(shù)量作為***并行構(gòu)建項(xiàng)目的數(shù)量,如圖1所示,你可以將這個數(shù)字調(diào)大調(diào)小找出一個并行構(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)目,還有一個地方你可以設(shè)置并行構(gòu)建參數(shù),CL編譯器支持/MP參數(shù),它告訴編譯器使用自身的一個單獨(dú)實(shí)例同時構(gòu)建它的子集,默認(rèn)的并行數(shù)仍然使用了CPU的數(shù)量,但你可以指定一個值,如/MP5,注意現(xiàn)在情況發(fā)生了一點(diǎn)變化,因此我要告訴你如何找到這個值,以及在MSBuild格式項(xiàng)目文件中看起來是什么樣子。

打開項(xiàng)目的“屬性”窗口,轉(zhuǎn)到“C/C++”*“常規(guī)”窗口,我建議你選擇“所有配置”和“所有平臺”,在后面你才有更多的可選項(xiàng)。

圖 2 項(xiàng)目屬性設(shè)置

象往常一樣,通過轉(zhuǎn)儲,你可以看到項(xiàng)目文件中有什么內(nèi)容,在“解決方案資源管理器”中的節(jié)點(diǎn)上點(diǎn)擊右鍵,選擇“編輯”。

圖 3

下圖顯示了項(xiàng)目文件的一部分代碼。

圖 4 項(xiàng)目文件代碼示例

在這里,所有類型為“ClCompile”的項(xiàng)目都自動擁有元數(shù)據(jù)MultiProcessorCompilation,默認(rèn)值為true,除非明確指定了一個不同的值。

順便說一下,MSBuild項(xiàng)目通常都是一個文件,它們的子元素是元數(shù)據(jù),下面是一個例子,注意它們被放在一個“ItemGroup”中。

圖 5 MSBuild項(xiàng)目文件示例

因?yàn)檫@是一個元數(shù)據(jù),如果是高手,完全可以直接修改每個文件,你需要為使用了#import的文件禁用/MP,因?yàn)樗恢С?MP,其它不支持/MP的特性是/Gm,/Gm表示漸進(jìn)式編譯,更多參數(shù)請參考http://msdn.microsoft.com/en-us/library/bb385193.aspx。

回到多處理器CL,如果你想明確告訴CL有多少并行編譯執(zhí)行,Visual Studio可通過/MP實(shí)現(xiàn),它出現(xiàn)在全局設(shè)置中。

圖 6 C++編譯***并行任務(wù)數(shù)設(shè)置

Visual Studio通過一個全局屬性CL_MPCount進(jìn)行設(shè)置,這意味著在Visual Studio外構(gòu)建時將不受任何影響。

如果你選擇一個更細(xì)粒度的值,你就不能使用圖形界面進(jìn)行設(shè)置了,因?yàn)槟愀究床坏剿脑O(shè)置項(xiàng),這時就必須打開項(xiàng)目文件直接進(jìn)行修改。在CLICompile項(xiàng)目上這是一個完全不同的元數(shù)據(jù)塊,叫做“ProcessorNumber”,你可以設(shè)定一個從1到你認(rèn)為合理的一個值,然后在/MP后也追加一個同樣的值,如果沒有,它就會被忽略。

圖 7 ProcessorNumber和MultiProcessorCompilation設(shè)置

圖中出現(xiàn)的波浪線是一個小小的bug,直接忽略它。

#p#

如何在命令行上構(gòu)建?

/MP設(shè)置來自項(xiàng)目文件,因此在命令行上進(jìn)行設(shè)置作用是一樣的,它是整個MSBuild的一部分,在命令行上構(gòu)建和在Visual Studio中構(gòu)建是一樣的效果嗎?在Visual Studio中設(shè)置的全局并行設(shè)置不會影響到命令行,你必須親自給msbuild.exe傳遞/m參數(shù),這個參數(shù)是可選的,如果你不設(shè)置,它就使用CPU的數(shù)量,但和Visual Studio開箱即用的特性不一樣,在命令行中如果不指定/m參數(shù),它只會使用1顆CPU,這個問題可能在將來的版本中會得到修正。

圖 8 命令行構(gòu)建參數(shù)

如果想給/MP選任意的值,你可以設(shè)置一個環(huán)境變量,或象Visual Studio那樣傳遞一個屬性CL_MPCount。

在每個項(xiàng)目上都設(shè)置/MP是很煩人的,怎么才能提高設(shè)置效率?

你可能想在多個項(xiàng)目上使用/MP,但你又不想在每個項(xiàng)目上都設(shè)置一遍,Visual Studio解決這類問題的辦法是使用屬性表。首先從“視圖”菜單打開“屬性管理器”,根據(jù)你使用的設(shè)置它的確切位置可能不一樣,下面是一個C++項(xiàng)目設(shè)置的位置。

圖 9 視圖菜單中的屬性管理器

在一個項(xiàng)目上點(diǎn)擊右鍵,選擇“添加新的屬性表”:

圖 10 給項(xiàng)目添加新的屬性表

我給它取了一個名字叫做“MultiprocCpp.props”,你將會看到該項(xiàng)目的所有配置都將添加這個屬性表,在它上面點(diǎn)擊右鍵,你將看到與項(xiàng)目相同的屬性窗口,但這個時候你編輯的是屬性表,再次將“Multi-processor Compilation”設(shè)為“YES”。關(guān)閉屬性窗口,在屬性管理器中選擇屬性表,然后點(diǎn)擊“保存”。

現(xiàn)在可以在編輯器中打開新建的MultiprocCpp.props文件,我的看起來如下:

圖 11 在編輯器中打開MultiprocCpp.props

仔細(xì)查看這個項(xiàng)目文件,你可以看到屬性表通過一個Import標(biāo)簽應(yīng)用到每個配置中了,這一點(diǎn)和C++中的#include非常類似。

圖 12 通過Import引用屬性表

現(xiàn)在我們就可以重用之前在項(xiàng)目文件中的定義了,于是我可以在屬性管理器中選中多個項(xiàng)目,然后點(diǎn)擊右鍵,選擇“添加現(xiàn)有屬性表”。

圖 13 為多個項(xiàng)目同時指定屬性表

OK!現(xiàn)在所有項(xiàng)目編譯時都帶有/MP參數(shù)了。

在某些情況下,你可能想要更簡單一點(diǎn),例如,你可能想要刪除大量的屬性表,幸運(yùn)的是,MSBuild 4.0有一個強(qiáng)大的,完整的對象模型,你可以使用它,再編寫幾行代碼就可以搞定這種工作了。

如果你不想通過圖形界面進(jìn)行設(shè)置,完全可以自己手動進(jìn)行編輯,例如,在VS自己的構(gòu)建中,我們在每個項(xiàng)目的***都設(shè)置了一套屬性。

圖 14 手動設(shè)置項(xiàng)目***屬性

在這里我們定義了所有類型的全局設(shè)置,并導(dǎo)入了其它設(shè)置,我將在以后的文章中介紹組織大型構(gòu)建樹的方法。

#p#

并行數(shù)量太多了也不好

一般來說,利用完所有處理器或處理器核心就已經(jīng)足夠了,否則可能會導(dǎo)致機(jī)器變慢甚至崩潰,下圖就顯示了這樣一個例子。

圖 15 太多的并行構(gòu)建進(jìn)程很容易讓機(jī)器崩潰

我是在一臺8 CPU的機(jī)器上做的這個實(shí)驗(yàn),我把解決方案中的所有項(xiàng)目全部開啟/MP了,然后使用msbuild.exe /m進(jìn)行構(gòu)建(我使用命令行進(jìn)行構(gòu)建不會出現(xiàn)這個問題,但在Visual Studio中進(jìn)行構(gòu)建就會出現(xiàn)),如果相關(guān)依賴不能阻止它,MSBuild將立即啟動8個項(xiàng)目,每個CL將會一次運(yùn)行自己的8個實(shí)例,因此總共會有64個CL運(yùn)行考驗(yàn)我們的處理器核心和磁盤,這樣做不但不能提升速度,反倒會使性能急劇下降。

你可能希望有一天系統(tǒng)能夠?qū)崿F(xiàn)自我調(diào)整,但如果現(xiàn)在遇到這樣的問題,你不得不手工調(diào)整。下面是一些建議

◆將全局值設(shè)小一點(diǎn)

例如將/m:4減少到/m:3,或使用屬性表將/MP修改為/MP2,如果你的構(gòu)建中還有其它問題,如有許多的并行項(xiàng)目,但并行的CL不夠,反之亦然,這個時候你都應(yīng)該將全局并行構(gòu)建參數(shù)調(diào)小。

◆為每個項(xiàng)目和配置調(diào)整/MP

有些時候使用/MP可能不是***的辦法,你也可以通過配置進(jìn)行調(diào)整,Retail配置可能會使速度變得更慢,因?yàn)榫幾g器要做的優(yōu)化更多了,為Retail開啟/MP而不是為Debug開啟/MP可能更有意義。

◆獲得超級定制

在你的團(tuán)隊(duì)中,你可能有一系列硬件,也許你的開發(fā)人員使用的是雙CPU機(jī)器,但夜間構(gòu)建是在一臺8 CPU的機(jī)器上進(jìn)行的,兩者構(gòu)建時需要的來源是一樣的,你希望兩者的速度都不能太慢,在這種情況下,你可以使用環(huán)境變量,或是在MSBuild標(biāo)簽上設(shè)置條件,幾乎所有MSBuild標(biāo)簽都可以設(shè)置條件。

下面是一個例子,當(dāng)“MultiprocCLCount”有一個大于零的值時,就可以使用這個值啟用/MP。

圖 16 通過環(huán)境變量調(diào)整處理器數(shù)量

MSBuild啟動時將所有環(huán)境變量的值作為初始屬性值,因此在我更快速的機(jī)器上,我將MultiprocCLCount的值設(shè)為8,而在我的開發(fā)用機(jī)上,我將其設(shè)為2。

類似的方法還可以應(yīng)用到MSBuild.exe的/m參數(shù)中,如/m:%MultiprocMSBuildCount%,

在外來?xiàng)l件中還有其它屬性可能很有用,如$(Number_Of_Processors)表示邏輯處理核心數(shù)量,它來自環(huán)境變量。$(MSBuildNodeCount)是傳遞給msbuild.exe /m參數(shù)的值,在Visual Studio中,這個值是通過“工具”*“選項(xiàng)”進(jìn)行設(shè)置的。

***,我希望你能有效利用/m和/MP。希望你對我介紹的MSBuild功能能進(jìn)一步深入學(xué)習(xí),***自己動手配置一次。

原文名:Tuning C++ build parallelism in VS2010


本文題目:VisualStudio2010中C++并行構(gòu)建調(diào)優(yōu)
分享路徑:http://www.5511xx.com/article/dhsegdj.html