OpenMP任意缩减(合并)

问题描述 投票:0回答:1

我想使用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:在实际程序中,我使用的数据结构比设置的复杂。 (实际上,它是数据点的凸包。)

c++ openmp
1个回答
0
投票

现代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);
}
© www.soinside.com 2019 - 2024. All rights reserved.