OpenMP 任意缩减(合并)
OpenMP arbitrary reduction (merge)
我想使用 OpenMP 收集一些数据。为此,我检查了许多候选人,只收集那些满足某些条件的候选人。简化的示例如下。
#include <bits/stdc++.h>
#include "omp.h"
using namespace std;
class DataPoint {};
DataPoint random_data_point() {
// generate random data point
}
bool test(DataPoint r) {
// do something
}
int main() {
constexpr int num_iterations = 10000;
set<DataPoint> good_points;
#pragma omp parallel for reduction(???)
for (int iter = 0; iter < num_iterations; iter++) {
DataPoint r = random_data_point();
if (test(DataPoint))
good_points.insert(r);
}
// ...
return 0;
}
问题是如何有效地使用 OpenMP。我的想法是每个线程收集自己的数据(在上面的例子中 - 它自己的集合(,然后在所有线程完成后,它们的集合被合并。
注意 1:我的迭代非常独立(如上例所示(,因此 OpenMP 应该会有所帮助。 注2:在实际程序中,我使用的数据结构比set复杂。(实际上,它是数据点的凸包。
现代 OpenMP 允许您定义自己的归约函数,因此,如果您愿意,您应该能够以这种方式实现这一点,但实际上,对于这么简单的事情,沿着这些行编写代码可能会更容易(未经测试,键入此答案,未编译:-((
#pragma omp parallel
{
set<Data_Point> thread_good_points;
#pragma omp for nowait
for (int iter = 0; iter < num_iterations; iter++) {
DataPoint r = random_data_point();
if (test(DataPoint))
thread_good_points.insert(r);
}
#pragma omp critical
good_points.merge(thread_good_points);
}
相关文章:
- 使用C++程序合并排序没有得到正确的输出
- UE4-如何在给定4个屏幕坐标的情况下缩放纹理或材质
- 计算缩放多边形的比例,得到给定的多边形面积
- clang格式:宏的缩进
- C++setiosflags函数操纵器-未确定的缩进
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- QwtPlot具有相等的轴和自动缩放
- 如何在directx/c++中进行平移/缩放操作
- 用于合并排序的合并函数
- 在声明中合并两个常量"std::set"(不是在运行时)
- 如何将一个数组值合并为一个整数c++
- 如何将不同的可执行文件合并到一个窗口框架中进行编码?像浏览器一样
- 在Qt中实现无限可缩放的画布
- 从函数返回任意简单类型的数据
- 将向量的 N 段合并到位C++
- OpenMP 任意缩减(合并)
- 用libxml2缩进合并的XML文件
- 如何沿任意轴缩放对象(在三维空间中)
- 重载派生类的比较运算符==,以便对任意数量的基类进行缩放
- 我如何将缩放合并到这个坐标系中