簡體   English   中英

OpenMP嵌套並行化

[英]OpenMP nested parallelization

我正在使用已經與OpenMP並行化的庫。 問題在於,2-4個內核似乎足以滿足其處理需求。 使用4個以上的內核幾乎沒有什么區別。

我的代碼是這樣的:

for (size_t i=0; i<4; ++i)
    Call_To_Library (i, ...);

由於4個內核似乎足以容納該庫(即,在Call_To_Library應使用4個內核),並且我正在使用16個內核的機器,因此我也打算並行處理for循環。 請注意,此for最多包含3-4個迭代。

並行化此外部對象的最佳方法是什么? 我還可以使用OpenMP嗎? 使用嵌套並行化是最佳實踐嗎? 我正在調用的庫已經在使用OpenMP,並且我無法修改其代碼(無論如何它都不會很簡單)。

PS。 即使外部循環僅包含4次迭代,也值得並行化。 每次調用庫需要4-5秒。

如果此循環的迭代之間沒有依賴性,則可以執行以下操作:

 #pragma omp for schedule(static)
 for (size_t i=0; i<4; ++i)
    Call_To_Library (i, ...);

如您所說,如果每次調用Call_To_Library都花費大量時間,則嵌套OpenMP運算符的開銷可能可以忽略不計。

此外,您說您無法控制在Call_To_Library中創建的openmp線程的數量。 此解決方案會將openmp線程數乘以4,最有可能看到4倍的加速。 內部的Call_To_Library可能以這樣的方式進行了並行化:一次只能執行幾個openmp線程。 使用外部並聯時,該數字增加4倍。

嵌套並行性的問題可能是,您同時創建的線程數量激增,因此由於與創建/關閉openmp線程相關的開銷,您看到的加速效果可能不理想。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM