[英]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.