我正在使用OpenMP來並行化循環。在正常情況下,應當使用:OpenMP嵌套for,不等於num。的迭代
#pragma omp for schedule(static, N_CHUNK)
for(int i = 0; i < N; i++) {
// ...
}
對於嵌套的循環,我可以把pragma
在內部或outter循環
#pragma omp for schedule(static, N_CHUNK) // can be here...
for(int i = 0; i < N; i++) {
#pragma omp for schedule(static, N_CHUNK) // or here...
for(int k = 0; k < N; k++) {
// both loops have consant number of iterations
// ...
}
}
但是!我有兩個迴路,其中在第二循環迭代的數量取決於第一環:
for(int i = 0; i < N; i++) {
for(int k = i; k < N; k++) {
// k starts from i, not from 0...
}
}
什麼是平衡的CPU使用這種循環的最佳方式?
我剛剛瞭解了'collapse'並應用了它。你知道它是否能很好地擴展? _「粗粒度並行化通常會導致更好的性能」,「計劃(......,CHUNK)」解決並行化粒度問題? –
@JakubM .:日程安排是一種防止碎片化線程任務的工具。但是,單靠這些還不足以防止代價高昂的線程開銷。我的一般經驗法則是不使用嵌套的OMP並行部分。畢竟,反正只有很多核心。因此,而不是每個循環思考:'這可以並行'我看我的程序高級功能,並認爲'什麼_big_任務可以並行化'?我想這意味着我只在CPU處理任務上應用OMP(true)。做例如可能會有更微妙的判斷。一個IO處理程序,其中包含許多short _but parallelizable_任務。 – sehe