开放MP;嵌套循环之间的操作
OpenMP; action between 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 密集型任务拆分为多个部分以进行并行执行时,理想情况下,这些部分应尽可能大,同时大部分时间使用所有可用的 CPU 内核。
附言如果您有 OpenMP 4,对于内部循环,您可能希望#pragma omp simd
而不是parallel
。外循环仍应parallel
。这样,您就可以同时使用这两种并行性,即跨内核并行的外部环路,跨 SIMD 通道并行的内部环路。从理论上讲,这通常是计算东西的最快方法。
相关文章:
- 复制和交换习惯用法与移动操作之间的交互
- "+=" 操作在类型之间不起作用 std::复杂<double>和__complex__双精度
- 我是否应该避免在循环中的常数之间进行操作
- C++模板 - 实例之间的通用操作和成员可见性
- 在'string=string+s1'和"string+=s1"之间移动语义可以保存多少个复制操作?
- _Complex 和 std::complex 之间的 C/C++ 互操作
- 嵌入式串行读取操作和桌面PC之间可能有什么区别
- 是整数舍入规则决定了 C++、python3 和 python2.7 之间的 % 操作差异吗?
- 两个 UShorts 之间的操作在 VC2015 中给出了一个 int
- 开放MP;嵌套循环之间的操作
- C++类和OpenCV矩阵操作之间的转换
- 整数/浮点数/字符串值之间的操作,组合太多
- 仅使用位操作(不使用分支)将16位带符号值约束在0和4095之间
- std::set::迭代器和std::set::const_iterator之间是否存在操作差异
- 操作之间的关系中的对象类型是什么?
- WinRT 组件内C++类之间的互操作
- 类和字符串之间的重载操作
- 图像操作2个图像之间的差异
- 计算c++中操作之间的时间长度
- C++11 是否保证释放围栏和使用操作之间的内存顺序