自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Visual Studio 2010中C++并行構建調優(yōu)

原創(chuàng)
開發(fā) 后端
本文將討論的是Visual Studio 2010中C++并行構建調優(yōu),著重要談的是MSBuild這樣一個平臺的主要功能。

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

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

項目級并行構建是由MSBuild控制的,它是在Visual Studio的解決方案級進行設置的(實際上Visual Studio是為每個用戶都保存了設置,與你想象的可能有點不一樣,你可能認為不同解決方案有不同的設置,但UI卻不允許你這么做),默認情況下,Visual Studio選取你機器上的處理器數(shù)量作為***并行構建項目的數(shù)量,如圖1所示,你可以將這個數(shù)字調大調小找出一個并行構建速度最快的合適值,有些人可能喜歡將其調小,以便在構建期間還可以做點其它工作。

并行構建項目

圖 1 并行構建項目的***數(shù)量

雖然MSBuild從Visual Studio接管了部分功能,但這里的設置仍然保持和Visual Studio 2008一樣。

如果你正在構建C++或C++/CLI項目,還有一個地方你可以設置并行構建參數(shù),CL編譯器支持/MP參數(shù),它告訴編譯器使用自身的一個單獨實例同時構建它的子集,默認的并行數(shù)仍然使用了CPU的數(shù)量,但你可以指定一個值,如/MP5,注意現(xiàn)在情況發(fā)生了一點變化,因此我要告訴你如何找到這個值,以及在MSBuild格式項目文件中看起來是什么樣子。

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

項目屬性設置

圖 2 項目屬性設置

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

圖 3

編輯節(jié)點屬性

下圖顯示了項目文件的一部分代碼。

項目文件代碼示例

圖 4 項目文件代碼示例

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

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

MSBuild項目文件示例

圖 5 MSBuild項目文件示例

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

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

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

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

Visual Studio通過一個全局屬性CL_MPCount進行設置,這意味著在Visual Studio外構建時將不受任何影響。

如果你選擇一個更細粒度的值,你就不能使用圖形界面進行設置了,因為你根本看不到它的設置項,這時就必須打開項目文件直接進行修改。在CLICompile項目上這是一個完全不同的元數(shù)據(jù)塊,叫做“ProcessorNumber”,你可以設定一個從1到你認為合理的一個值,然后在/MP后也追加一個同樣的值,如果沒有<MultiProcessorCompilation>,它就會被忽略。

ProcessorNumber和MultiProcessorCompilation設置

圖 7 ProcessorNumber和MultiProcessorCompilation設置

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

#p#

如何在命令行上構建?

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

命令行構建參數(shù)

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

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

在每個項目上都設置/MP是很煩人的,怎么才能提高設置效率?

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

視圖菜單中的屬性管理器

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

在一個項目上點擊右鍵,選擇“添加新的屬性表”:

給項目添加新的屬性表

圖 10 給項目添加新的屬性表

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

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

在編輯器中打開MultiprocCpp.props

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

仔細查看這個項目文件,你可以看到屬性表通過一個Import標簽應用到每個配置中了,這一點和C++中的#include非常類似。

通過Import引用屬性表

圖 12 通過Import引用屬性表

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

為多個項目同時指定屬性表

圖 13 為多個項目同時指定屬性表

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

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

如果你不想通過圖形界面進行設置,完全可以自己手動進行編輯,例如,在VS自己的構建中,我們在每個項目的***都設置了一套屬性。

手動設置項目***屬性

圖 14 手動設置項目***屬性

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

#p#

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

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

太多的并行構建進程很容易讓機器崩潰

圖 15 太多的并行構建進程很容易讓機器崩潰

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

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

◆將全局值設小一點

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

◆為每個項目和配置調整/MP

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

◆獲得超級定制

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

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

通過環(huán)境變量調整處理器數(shù)量

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

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

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

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

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

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

【編輯推薦】

  1. Visual Studio 2010中Parallel類實現(xiàn)并行計算
  2. Visual Studio 2010敏捷利劍:詳解Scrum
  3. 教你如何用好Visual Studio 2010層次驗證
  4. 關注Visual Studio 2010中代碼提示的改進
  5. Visual Studio 2010中C++的四大變化 
責任編輯:彭凡 來源: 51CTO
相關推薦

2009-03-17 08:56:57

Visual StudVS2010C++

2010-03-10 09:28:58

Visual Stud

2009-11-13 14:59:12

Visual Stud

2010-03-11 15:23:44

Visual Stud

2010-03-15 09:04:09

C++Visual Stud

2009-10-27 09:12:50

Visual Stud

2009-09-02 16:21:17

Visual BasiC#語言

2009-07-01 09:26:56

Visual Stud

2009-06-15 14:48:13

Visual C++本狀態(tài)管理

2010-03-02 09:10:41

Visual Stud

2009-09-04 09:39:15

Visual Stud

2009-12-02 09:43:38

Visual Stud

2010-06-01 13:32:15

Visual Stud

2010-01-25 16:58:15

C++程序

2009-11-10 13:43:37

Visual Stud

2010-01-14 10:56:43

Visual C++

2023-04-03 07:08:28

C++函數(shù)模板

2009-11-11 09:48:06

Visual Stud

2010-02-22 16:43:33

Visual Stud

2010-03-19 16:43:37

Visual Stud
點贊
收藏

51CTO技術棧公眾號