首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

Visual Studio 2010 C++ 專案並行建置調優指南:/MP、MSBuild /m、屬性表與條件式調整

     編輯:VC 教學

兩層並行機制

層級控制參數範圍預設值
方案層 (MSBuild)/m[:N] 或 工具 > 選項 > 專案和方案 > 建置和執行 > 最大平行專案數同時建置專案數CPU 邏輯核心數
專案層 (CL 編譯器)/MP[N] 或 專案屬性 C/C++ > 一般 > 多處理器編譯單專案內同時編譯 .cpp 數CPU 邏輯核心數

設定步驟圖解

  1. 方案層:最大平行專案數設定
  2. 專案層 /MP:多處理器編譯啟用
  3. .vcxproj 中的 MultiProcessorCompilation:專案檔 XML

命令列建置

msbuild MySolution.sln /m:4 /p:CL_MPCount=2
/m:4          -> MSBuild 同時建置 4 個專案
/p:CL_MPCount=2 -> 傳遞給 CL 的 /MP2 (每專案 2 個平行編譯)

注意:VS IDE 內建置不受 CL_MPCount 環境變數影響,需在專案屬性或 .vcxproj 設定。

屬性表 (.props) 共享 /MP 設定

  1. 檢視 > 視窗 > 屬性管理器 (或 專案 > 屬性管理器)。
  2. 右鍵專案 > 加入新專案屬性表,命名 MultiprocCpp.props。
  3. 編輯該 .props,設定 C/C++ > 一般 > 多處理器編譯 = 是。
  4. 儲存後,多專案同時選取 > 右鍵 > 加入現有屬性表 選取此 .props。

Props 檔案內容

條件式調整:依機器核心數自動縮放

<PropertyGroup Condition="'$(MultiprocCLCount)' != '' and '$(MultiprocCLCount)' > '0'">
  <MultiProcessorCompilation>true</MultiProcessorCompilation>
  <ProcessorNumber>$(MultiprocCLCount)</ProcessorNumber>
</PropertyGroup>
  • 開發機設定環境變數 MultiprocCLCount=2。
  • 建置伺服器設定 MultiprocCLCount=8。
  • 同一份 .props/.vcxproj 即可自適應。

避免過度並行導致系統卡頓

若方案 8 專案皆開 /MP8,MSBuild /m8 啟動 → 64 個 cl.exe 同時執行,CPU/磁碟/記憶體飽和反而變慢。

建議策略

  • 全域 /m 設為核心數 減 1 或 2 (留資源給 OS/IDE)。
  • 專案層 /MP 視專案大小調整:大專案 /MP4,小專案 /MP1 (關閉)。
  • Release 建置優化耗時長,適合開 /MP;Debug 建置快,可關閉減少負載。
  • 使用 #import、/Gm (增量編譯) 的檔案 必須關閉 /MP (在檔案屬性 C/C++ > 一般 > 多處理器編譯 = 否)。

進階:檔案層級 ProcessorNumber 微調

在 .vcxproj 中對特定 ClCompile 項目設定 ProcessorNumber:

<ClCompile Include="Heavy.cpp">
  <MultiProcessorCompilation>true</MultiProcessorCompilation>
  <ProcessorNumber>2</ProcessorNumber> <!-- 此檔最多 2 平行 -->
</ClCompile>

配合 /MP2 整體上限,達成細粒度控制。

總結最佳實踐

  1. 建立共用 MultiprocCpp.props 統一管理 /MP。
  2. 使用環境變數 MultiprocCLCount、MultiprocMSBuildCount 區分開發/建置機。
  3. 監控建置時間 (MSBuild /clp:PerformanceSummary) 找出最佳平行度。
  4. 避免「專案平行 × 檔案平行」乘積超過邏輯核心數 1.5~2 倍。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved