我正在使用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