c++ - 打开MP;嵌套循环之间的 Action

标签 c++ nested openmp nested-loops

所以,我大致有这样的代码:

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/

相关文章:

c++ - 如何并行化将矩阵的行随机复制到内存中的另一个矩阵的过程?

c++ - OMP中的减少和折叠条款有一些令人困惑的地方

c++ - 无效的字符数组赋值

C++迭代器停留在第一个值

javascript - 有没有办法在 React Router 中使用嵌套路由 ID 作为 prop 参数

nested - 如何在 CaSTLe Windsor 中使用嵌套的接口(interface)实现?

python - 如何从 2 个 pkl 文件创建 Python 嵌套字典/将 2 个嵌套字典合并为一个?

c++ - 在C++程序中删除全局变量

c++ - std::variant<>::get() 不能用 Apple LLVM 10.0 编译

Python 和 OpenMP C 扩展