如何在OpenMP中进行有序缩减 OpenMP 4.5 +提供了在C++()中进行向量/数组缩减的能力

如何在OpenMP中进行有序缩减 OpenMP 4.5 +提供了在C++()中进行向量/数组缩减的能力,c++,openmp,C++,Openmp,使用上述功能,我们可以编写,例如: #include <vector> #include <iostream> int main(){ std::vector<int> vec; #pragma omp declare reduction (merge : std::vector<int> : omp_out.insert(omp_out.end(), omp_in.begin(), omp_in.end())) #pragma

使用上述功能,我们可以编写,例如:

#include <vector>
#include <iostream>

int main(){
  std::vector<int> vec;

  #pragma omp declare reduction (merge : std::vector<int> : omp_out.insert(omp_out.end(), omp_in.begin(), omp_in.end()))

  #pragma omp parallel for default(none) schedule(static) reduction(merge: vec)
  for(int i=0;i<100;i++)
    vec.push_back(i);

  for(const auto x: vec)
    std::cout<<x<<"\n";

  return 0;
}
#包括
#包括
int main(){
std::vec;
#pragma omp declare reduction(merge:std::vector:omp_out.insert(omp_out.end()、omp_in.begin()、omp_in.end())
#pragma omp parallel用于默认(无)计划(静态)缩减(合并:vec)

对于(int i=0;i而言,未明确指定缩减顺序(“OpenMP程序中组合值的位置以及 组合的值未指定。”,OpenMP 4.5中的2.15.3.6)。因此不能使用缩减

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

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

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