/MP
( 使用多個行程建置 )
選項 /MP
可以減少在命令行上編譯來源檔案的總時間。 選項 /MP
會讓編譯程式建立本身的一或多個複本,每個復本都會在不同的進程中。 然後,這些實例會同時編譯來源檔案。 在某些情況下,可以大幅減少建置來源檔案的總時間。
語法
/MP
[processMax
]
引數
processMax
(選擇性) 編譯器可建立的處理序數目上限。
processMax
引數的範圍必須介於 1 到 65536。 否則,編譯程式會發出警告訊息 D9014、忽略 processMax
自變數,並假設進程數目上限為 1。
如果您略過 processMax
引數,則編譯器會從作業系統擷取電腦上 有效的處理器 數目,並為每一個處理器建立一個處理序。
備註
編譯 /MP
程式選項可大幅縮短編譯許多檔案時的建置時間。 為了縮短建置時間,編譯器最多會建立 processMax
個本身的複本,然後使用這些複本同時編譯原始程式檔。 此選項 /MP
適用於編譯,但不適用於連結或鏈接時間程式代碼產生。 選項預設 /MP
為關閉。
建置時間的改善取決於電腦上的處理器數目、要編譯的檔案數目、系統資源的可用性 (例如 I/O 容量) 等因素而定。 試驗 /MP
選項,以判斷建置特定專案的最佳設定。 如需協助制定決策的相關建議,請參閱 方針。
不相容的選項和語言功能
這個選項 /MP
與某些編譯程式選項和語言功能不相容。 如果您使用與 選項不相容的編譯程式選項 /MP
,編譯程式會發出警告 D9030 並忽略 /MP
選項。 如果您使用不相容的語言功能,編譯程式會發出錯誤 C2813 ,然後根據目前的編譯程式警告層級選項結束或繼續。
注意
大部分的選項都不相容,這是因為如果允許這些選項,在同時執行編譯器時就會將編譯器的輸出一起寫入主控台或特定檔案中。 結果,輸出就會相互摻雜而且不完整。 有時候,結合選項還可能會使效能變得更差。
下表列出與 選項不相容的 /MP
編譯程式選項和語言功能:
選項或語言功能 | 描述 |
---|---|
#import 預處理器指示詞 |
將類型程式庫中的類型轉換成 C++ 類別,然後將這些類別寫入標頭檔。 |
/E , /EP |
將預處理器輸出複製到標準輸出 (stdout )。 |
/Gm |
已取代。 允許累加式重建。 |
/showIncludes |
將 Include 檔案清單寫入標準錯誤 (stderr )。 |
/Yc |
寫入先行編譯的標頭檔。 |
診斷訊息
如果您指定與 選項不相容 /MP
的選項或語言功能,您會收到診斷訊息。 下表列出編譯器的訊息和行為:
診斷訊息 | 描述 | 編譯器行為 |
---|---|---|
C2813 | 指示 #import 詞與 選項不相容 /MP 。 |
除非另外指定 編譯器警告層級 選項,否則編譯就會結束。 |
D9014 | 為 processMax 引數指定了無效值。 |
編譯器會忽略無效值,並假設值為 1。 |
D9030 | 指定的選項與 /MP 不相容。 |
編譯程式會 /MP 忽略 選項。 |
指導方針
測量效能
請使用總建置時間來測量效能。 您可以使用實體時鐘來計算建置時間,或使用軟體來計算建置開始到停止之間的時間差。 如果您的電腦有多個處理器,則以實體時鐘計算出來的時間可能比軟體時間測量更精確。
有效處理器
計算機可以有一或多個虛擬處理器,也就是 每個實體處理器的有效處理器。 此外,每一個實體處理器都可以有一或多個核心,如果作業系統啟用核心的超執行緒,則每一個核心看起來都會有兩個虛擬處理器。
例如,如果電腦有一個實體處理器,而處理器有一個核心且停用超執行緒,則該電腦會有一個有效的處理器。 相反地,如果電腦有兩個實體處理器,每一個都有兩個核心,且所有核心都啟用超執行緒,則這部電腦就有八個有效的處理器。 也就是說,(8個有效處理器) = (2 個實體處理器) x (每個實體處理器 2 個核心) x (每個核心 2 個有效處理器,因為超線程)。
如果您省略 processMax
選項中的 /MP
自變數,編譯程式會從操作系統取得有效的處理器數目,然後為每個有效處理器建立一個進程。 不過,編譯程式無法保證哪個進程在特定處理器上執行;操作系統會做出該決定。
處理序數目
編譯器會計算要用來編譯原始程式檔的處理序數目。 該值是您在命令行上指定的來源檔案數目,以及您使用 選項明確或隱含指定 /MP
的進程數目。 如果您提供 processMax
選項的 /MP
自變數,可以明確設定進程數目上限。 或者,如果您略過 processMax
引數,則可以使用預設值,也就是電腦中有效處理器的數目。
例如,假設您指定下列命令列:
cl /MP7 a.cpp b.cpp c.cpp d.cpp e.cpp
在此情況下,編譯程式會使用五個進程,因為這是五個原始程序檔中的較少,且最多七個進程。 或者,假設您的電腦有兩個有效的處理器,而且您指定下列命令列:
cl /MP a.cpp b.cpp c.cpp
在此情況下,操作系統會報告兩個處理器,因此編譯程式會在其計算中使用兩個進程。 因此,編譯程式會使用兩個進程來執行組建,因為這是兩個進程和三個原始程序檔中的較少。
原始程式檔和建置順序
原始程式檔編譯的順序,可能和它們出現在命令列中的順序不同。 雖然編譯器會建立一組處理序,其中包含編譯器的複本,但是作業系統會為每一個處理序的執行時間進行排程。 選項 /MP
無法保證來源檔案會以特定順序編譯。
當處理序可用來編譯時,就會編譯原始程式檔。 如果檔案比處理序還多,可用的處理序就會編譯第一組檔案。 當處理序處理完上一個檔案,還可以接著處理剩下的其中一個檔案時,就會處理剩下的檔案。
請勿在命令行上多次指定相同的原始程序檔。 例如,如果工具根據專案中的相依性信息自動建立 makefile ,可能會發生多個規格。 如果您未指定 /MP
選項,編譯程式會循序處理檔案清單,並重新編譯每個出現的檔案。 不過,如果您指定 /MP
選項,不同的編譯程序實例可能會同時編譯相同的檔案。 不同的實例可能會同時嘗試寫入相同的輸出檔案。 一個編譯程式實例會取得輸出檔案的獨佔寫入許可權並成功,而其他編譯程序實例則失敗併發生檔案存取錯誤。
使用類型庫 (#import
)
編譯程式不支援搭配 參數使用 #import
指示詞 /MP
。 如果可能,請遵循下列步驟來解決這個問題:
將各種原始程序檔中的所有
#import
指示詞移至一或多個檔案,然後編譯這些檔案而不/MP
使用 選項。 結果會產生一組標頭檔。在您的其餘原始程序檔中,插入
#include
指示詞來指定產生的標頭,然後使用 選項編譯剩餘的原始程序檔/MP
。
Visual Studio 項目設定
MSBuild 工具
Visual Studio 會使用 MSBuild
工具 (msbuild.exe
) 來建置方案和專案。 /maxcpucount:number
MSBuild 工具的 (或/m:number
) 命令行選項可以同時建置多個專案。 而且編譯 /MP
程式選項可以同時建置多個編譯單位。 如果適合您的應用程式,請使用 或和 /MP
/maxcpucount
來改善解決方案的建置時間。
您的方案建置時間有一部分取決於執行組建的處理序數目。 number
MSBuild 選項的/maxcpucount
自變數會指定要同時建置的項目數目上限。 同樣地,編譯 processMax
程式選項的 /MP
自變數會指定要同時建置的編譯單位數目上限。 /maxcpucount
如果選項指定 P 專案,而 /MP
選項指定 C 進程,則 P x C 進程上限會同時執行。
決定是否使用 MSBuild 或 /MP
技術的指導方針如下:
如果每個專案中有許多專案檔案很少,請使用 MSBuild 工具搭配
/maxcpucount
選項。如果每個專案中有許多檔案的專案很少,請使用
/MP
選項。如果每個項目的項目與檔案數目已平衡,請使用 MSBuild 和
/MP
。 一開始,將/maxcpucount
選項設定為要建置的項目數目,以及/MP
計算機上處理器數目的選項。 測量效能然後調整設定,以產生最佳結果。 重複該迴圈,直到您對總建置時間感到滿意為止。