【问题标题】:How to combine private variables of n threads in openMP?如何在openMP中组合n个线程的私有变量?
【发布时间】:2015-09-03 12:34:43
【问题描述】:

我有以下需要正确并行化的 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(一个二维向量),它由每个线程(在它自己的副本中)并行填充。工作完成后,我希望将“particle_part”的每个副本中的内容组合成一个单一的particle_list 变量。

【问题讨论】:

    标签: c++ multithreading algorithm parallel-processing openmp


    【解决方案1】:

    使用critical 部分。如图所示,在并行区域的末尾添加一个关键部分,一次进入一个线程(您可能不需要 omp_get_thread_num() 部分,具体取决于您正在做什么)。

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

    【讨论】:

    • 我试过但没成功,因为变量是二维向量。你能推荐一些更具体的二维向量吗
    • 您的代码对我来说没有多大意义。是ntotal 24 吗?如果是这样,请不要费心尝试并行化它。没有足够的工作来证明开销是合理的。如果没有,那么icell 将被覆盖,并且无论如何都不会使用(我可以看到)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-02
    • 1970-01-01
    • 1970-01-01
    • 2017-05-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多