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