OpenMP 是否有可能,當堆疊中較低的函式啟動多處理時,OpenMP 設施會忽略來自堆疊中較高的函式主體的多處理請求?
這是 OpenMP 始終作業的方式嗎?如果沒有,我可以這樣做嗎?如何?
void do1()
{
#pragma omp parallel for
for (unsigned int i = 0; i < 10; i);
}
void do2()
{
#pragma omp parallel for
for (unsigned int i = 0; i < 10; i) do1();
}
void do3()
{
#pragma omp parallel for
for (unsigned int i = 0; i < 10; i) do2();
}
int main()
{
do1(); // runs in parallel
do2(); // do2() runs in parallel, do1() I want not
do3(); // do3() runs in parallel, do1() and do2() I want not
}
uj5u.com熱心網友回復:
如果嵌套并行被禁用,OpenMP 的作業方式與您描述的完全一樣。在當前的 OpenMP 實作中,默認情況下禁用它,但標準未指定它,因此為了安全起見,值得通過將OMP_MAX_ACTIVE_LEVELS環境變數設定為 1 或在代碼中使用omp_set_max_active_levels(1);函式來禁用它。
uj5u.com熱心網友回復:
這種情況稱為嵌套,通常效率低下(但這取決于運行時)。您可以調整 OpenMP 運行時引數以緩解性能問題(請參閱@Laci 的答案),但老實說,這種模式通常會導致比它解決的問題更多的問題。現代解決方案只是在您的情況下使用任務和更具體taskloop的指令。或者,您可以使用該if(...)子句來調整并行部分的行為(例如,禁用關于給定條件的并行性)。任務的調度取決于運行時。例如,IOMP(Clang/ICC)基于(隨機)作業竊取演算法,而 GCC 使用有界集中佇列。任務的開銷可能大于并行部分的開銷(尤其是靜態調度)。
請注意,編譯器可以優化堆疊幀。事實上,do1和do2可以do3行內,這樣在運行時就不會留下這些函式的痕跡。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/491157.html
上一篇:Java非法監視器狀態例外
下一篇:Java競態條件
