簡體   English   中英

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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM