[英]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);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.