我可以从嵌套并行循环中访问相同的向量吗?

时间:2018-01-10 04:12:41

标签: c++ parallel-processing pragma

我正在研究#pragma omp parallel for如何工作,并想知道以下代码是否有效,或者我是否正确使用并行化。

给定一个带有自定义类Sol的种子解决方案向量的输入,我想为这些种子中的每一个生成n_iter个解,并将它们全部放入一个向量中。

此代码的简单版本是:

// input:
std::vector<Sol> seed_sols; // vector containing seed solutions
int n_iter; // number of iterations per seed

// create data structure to hold all solutions to be generated
std::vector<Sol> sols(seed_sols.size()*n_iter);

#pragma omp parallel for
for (int seed_sol = 0; seed_sol < seed_sols.size(); ++seed_sol){
    Sol curr_seed = seed_sols[seed_sol];
    #pragma omp parallel for
    for (int i = 0; i < n_iter; ++i){
        sols[seed_sol*n_iter + i] = generateSol(curr_seed);
    }
}

以这种方式运行两个并行循环是否可以?如果我被限制为4个线程,并且seed_sols的大小大于4,那么内部循环实际上会做什么来加速进程吗?

我是否可以使用两个并行循环安全地运行此代码,即使它们访问相同的数据结构,因为他们无法同时访问sols的同一元素?

任何帮助将不胜感激, 感谢

修改

我已经多次成功运行代码而没有任何错误,而且它似乎工作得很好。但是我仍然不知道这种代码的并行化是否是一种好的做法。

0 个答案:

没有答案