我正在使用 OpenMP 来并行化循环。在正常情况下,人们会使用:
#pragma omp for schedule(static, N_CHUNK)
for(int i = 0; i < N; i++) {
// ...
}
对于嵌套循环,我可以将 pragma
放在内部或外部循环上
#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 使用率的最佳方法是什么?
一如既往:
此处未显示将产生差异的内容:
- (非线性)线性内存寻址(还要注意循环的顺序
- 使用共享变量;
关于您的最后一个场景:
for(int i = 0; i < N; i++) {
for(int k = i; k < N; k++) {
// k starts from i, not from 0...
}
}
出于以下原因,我建议并行化外循环:
我是一名优秀的程序员,十分优秀!