我很想看看使用OpenMP的一些代碼,儘管我不太熟悉它。 (代碼也沒有OpenMP)OpenMP:「隱性屏障」中的20%時間?
當運行探查器時,我發現程序在「OMP隱式屏障」函數中花費大約20%的掛鐘時間。
是OpenMP的典型代表,還是這樣做(可能)意味着工作負載不會在線程間平均分配?
由於
我很想看看使用OpenMP的一些代碼,儘管我不太熟悉它。 (代碼也沒有OpenMP)OpenMP:「隱性屏障」中的20%時間?
當運行探查器時,我發現程序在「OMP隱式屏障」函數中花費大約20%的掛鐘時間。
是OpenMP的典型代表,還是這樣做(可能)意味着工作負載不會在線程間平均分配?
由於
有在最OpenMP結構等for
(在C/C++)或do
(用Fortran),sections
和single
末端隱障礙(然而,有一個在所述master
的端部沒有屏障構造)。如果算法允許不同的線程在工作共享指令之後運行去同步,則可以使用nowait
子句來禁用這些隱式屏障。另一個隱式屏障位於每個並行區域的末尾,作爲fork/join執行模型的一部分。
您已經正確猜測隱含屏障等待時間的高百分比通常意味着工作分配遠不是最佳。這可能是(大量的)大的構造,或者可能是存在並行循環(for
/do
構造),每次迭代的執行時間都不相同。如果不平衡來自每次迭代中計算時間不同的循環(規範示例繪製Mandelbrot集),則可以使用schedule(dynamic,chunk)
子句將循環調度更改爲dynamic
,其中chunk
是塊大小(> = 1)。塊大小越小,負載平衡越好,但動態環路調度器的開銷會更高。塊大小越大,負載不平衡就會出現。最佳值通常取決於問題類型和硬件,因此必須調整該值以便在代碼執行的特定系統上獲得最佳性能。
這一切都取決於應用程序在屏障之間做什麼。即如果它確實很少,那麼它將花費所有時間在MP中。 –
這是不尋常的,正如你所建議的是負載不平衡的症狀。如果你能找到特定的隱含障礙,我們可以給出更多的建議 - 例如,如果它在'omp for'工作共享結構的末尾,你可以嘗試使用'schedule(動態)'看看是否有幫助。 –