如何在openMP中组合n线程的私有变量

How to combine private variables of n threads in openMP?

本文关键字:线程 变量 组合 openMP      更新时间:2023-10-16

我有以下c++代码需要正确并行化。

vector<vector<int> > particle_list(ncell,vector<int> (0, 0));
#pragma omp parallel num_thread(24)
{
    vector<vector<int> > particle_part(ncell,vector<int> (0, 0));
    int icell;
    #pragma omp num_thread(24) for 
    for (int i=0; i<ntotal; i++)
    {
        icell=cellno[i];
        particle_part[icell].push_back(i) ;
    }
   ***#pragma omp master
    particle_list[ncell].insert(particle_list[ncell].end(),...
    particle_part[ncell].begin(), particle_part[ncell].end());*** 
}

***中包含的代码是我不确定的。我想做的是这样的。我有一个私有变量particle_part(一个2d向量),由每个线程(在自己的副本中)并行填充。一旦工作完成,我希望在每个副本的内容'particle_part'被组合成一个单一的particle_list变量。

使用critical section。如图所示,在你的并行区域的末尾添加一个临界区,它将一次进入一个线程(你可能不需要omp_get_thread_num()部分,这取决于你到底在做什么)。

#pragma omp critical
{
    global_variable_thingy[omp_get_thread_num()] += local_variable_thingy;
}