分享方式:


從 OpenMP 移轉至並行執行階段

並行執行階段支援多種不同的程式設計模型。 這些模型有可能相互重疊,但或許也可彌補其他程式庫之模型的不足之處。 本節中的檔會比較 OpenMP 與並行執行時間,並提供如何移轉現有 OpenMP 程式碼以使用並行執行時間的範例。

OpenMP 程式設計模型是以開放標準定義的,具有定義完善的 Fortran 和 C/C++ 程式設計語言繫結。 Microsoft C++ 編譯器支援的 OpenMP 2.0 和 2.5 版非常適合反復執行的平行演算法:也就是說,它們會在資料陣列上執行平行反覆運算。 OpenMP 3.0 除了反復工作之外,還支援非反復工作。

當平行處理原則程度已預先決定且符合系統可用資源時,OpenMP 最有效率。 OpenMP 模型特別適合高效能運算,其中非常大的計算問題會分散到一部電腦的處理資源。 在此案例中,硬體環境通常會固定,且開發人員可以合理預期在執行演算法時,擁有所有計算資源的獨佔存取權。

不過,較不受限的運算環境可能不適合 OpenMP。 例如,遞迴問題(例如快速排序演算法或搜尋資料樹狀結構)較難以使用 OpenMP 2.0 和 2.5 實作。 並行執行時間藉由提供 非同步代理程式程式庫和 平行模式程式庫 (PPL) 來補充 OpenMP 的功能。 非同步代理程式程式庫支援粗略的工作平行處理原則;PPL 支援更精細的平行工作。 並行執行時間提供平行執行作業所需的基礎結構,讓您可以專注于應用程式的邏輯。 不過,由於並行執行時間會啟用各種程式設計模型,因此其排程額外負荷可能會大於其他並行程式庫,例如 OpenMP。 因此,建議您在將現有的 OpenMP 程式碼轉換為使用並行執行時間時,以累加方式測試效能。

何時從 OpenMP 遷移至並行執行時間

在下列情況下,移轉現有的 OpenMP 程式碼以使用並行執行時間可能很有利。

案例 並行執行時間的優點
您需要可延伸的並行程式設計架構。 並行執行階段中有許多功能皆可進行擴充。 您也可以合併現有功能,以撰寫新功能。 由於 OpenMP 依賴編譯器指示詞,因此無法輕易擴充。
您的應用程式會受益于合作式封鎖。 當工作因為需要尚無法使用的資源而封鎖時,並行執行時間可以在第一個工作等候資源時執行其他工作。
您的應用程式會受益于動態負載平衡。 並行執行時間會使用排程演算法,在工作負載變更時調整計算資源的配置。 在 OpenMP 中,當排程器將計算資源配置至平列區域時,這些資源配置會在整個計算中固定。
您需要例外狀況處理支援。 PPL 可讓您攔截平列區域或迴圈內外的例外狀況。 在 OpenMP 中,您必須處理平列區域或迴圈內的例外狀況。
您需要取消機制。 PPL 可讓應用程式同時取消個別工作和平行工作樹狀結構。 OpenMP 需要應用程式實作自己的取消機制。
您需要平行程式碼,才能在它啟動的不同內容中完成。 並行執行時間可讓您在一個內容中啟動工作,然後在另一個內容中等候或取消該工作。 在 OpenMP 中,所有平行工作都必須在開始的內容中完成。
您需要增強的偵錯支援。 Visual Studio 提供 平行堆疊 平行 工作視窗,讓您更輕鬆地偵錯多執行緒應用程式。

如需偵錯並行執行時間支援的詳細資訊,請參閱 使用工作視窗、 使用平行堆疊視窗 逐步解說:偵錯平行應用程式

何時不要從 OpenMP 遷移至並行執行時間

下列案例說明何時可能不適合移轉現有的 OpenMP 程式碼以使用並行執行時間。

案例 說明
您的應用程式已經符合您的需求。 如果您滿意應用程式效能和目前的偵錯支援,移轉可能不適合。
您的平行迴圈主體執行的工作很少。 並行執行時間工作排程器的額外負荷可能無法克服平行執行迴圈主體的優點,特別是當迴圈主體相對較小時。
您的應用程式是以 C 撰寫。 因為並行執行時間使用許多 C++ 功能,所以當您無法撰寫可讓 C 應用程式完全使用它的程式碼時,它可能不適合。

如何:轉換 OpenMP parallel for 迴圈來使用並行執行階段

假設有一個使用 OpenMP 平行和 for 指示詞的基本迴圈,示範如何將它轉換成使用並行執行時間 並行::p arallel_for 演算法。

如何:轉換使用取消的 OpenMP 迴圈來使用並行執行階段
假設 OpenMP parallel for 迴圈不需要執行所有反復專案,會示範如何將它轉換成使用並行執行時間取消機制。

如何:轉換使用例外狀況處理的 OpenMP 迴圈來使用並行執行階段
指定執行例外狀況處理之迴圈的 OpenMP 平行 處理,示範如何轉換它以使用並行執行時間例外狀況處理機制。

如何:轉換使用削減變數的 OpenMP 迴圈來使用並行執行階段
針對使用縮減 子句的 迴圈提供 OpenMP 平行 處理,示範如何將它轉換成使用並行執行時間。

另請參閱

並行執行階段
OpenMP \(英文\)
平行模式程式庫 (PPL)
非同步代理程式程式庫