我有以下需要正确并行化的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变量中。
答案 0 :(得分:1)
使用critical
部分。示意性地显示,在并行区域的末尾添加一个临界区,一次输入一个线程(根据您正在做什么,您可能不需要omp_get_thread_num()
部分。)
#pragma omp critical
{
global_variable_thingy[omp_get_thread_num()] += local_variable_thingy;
}