如何在OpenMP中进行有序缩减

时间:2017-06-14 07:27:20

标签: c++ openmp

OpenMP 4.5+提供了在C ++中进行向量/数组缩减的功能(press release

使用所述功能允许我们编写,例如:

readxl

问题是,在执行这样的代码时,可以以任何方式对各种线程的结果进行排序。

有没有办法强制执行订单,以便线程0的结果先于线程1,依此类推?

1 个答案:

答案 0 :(得分:3)

明确未指定减少的顺序。 (" OpenMP程序中组合值的位置以及值的顺序 组合的值未指定。",2.15.3.6在OpenMP 4.5中。因此,您不能使用减少。

一种方法是按如下方式使用有序:

std::vector<int> vec;
#pragma omp parallel for default(none) schedule(static) shared(vec)
for(int i=0;i<100;i++) {
    // do some computations here
    #pragma omp ordered
    vec.push_back(i);
}

请注意,vec现在已共享,ordered表示线程之间的执行和同步的序列化。这可能对性能非常不利,除非您的每个计算需要大量且统一的时间。

您可以进行自定义缩减。从parallel循环中拆分for区域,然后按顺序手动插入本地结果。

std::vector<int> global_vec;
#pragma omp parallel
{
    std::vector<int> local_vec;
    #pragma omp for schedule(static)
    for (int i=0; i < 100; i++) {
        // some computations
        local_vec.push_back(i);
    }
    for (int t = 0; t < omp_get_num_threads(); t++) {
        #pragma omp barrier
        if (t == omp_get_thread_num()) {
            global_vec.insert(local_vec.begin(), local_vec.end())
        }
    }
}