所以,我大致有这样的代码:
for (int i = 0; i != 10000; ++i) {
doAction(i);
for (int j = 0; j != 10000; ++j) {
...
}
}
我想使用 OpenMP 对其进行并行处理。据我了解,在这种情况下,简单的 collapse
是行不通的;我尝试使用单独的 #pragma omp for
也没有结果。有没有一种简单的方法可以轻松地并行化,或者我是否必须求助于调用 doAction
i*j
次?
最佳答案
简单的并行化方式,只在外层循环使用OpenMP。
一直并行化并不是一件好事,因为线程同步和任务调度开销。当您将大型 CPU 绑定(bind)任务拆分为多个部分以并行执行时,理想情况下,这些部分应尽可能大,同时在大多数时间使用所有可用的 CPU 内核。
附言如果您有 OpenMP 4,对于内部循环,您可能需要 #pragma omp simd
而不是 parallel
。外循环仍应并行
。通过这种方式,您将同时使用两种并行性,外循环跨内核并行,内循环跨 SIMD channel 并行。从理论上讲,这通常是最快的计算方式。
关于c++ - 打开MP;嵌套循环之间的 Action ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46800732/