我正在研究#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
的同一元素?
任何帮助将不胜感激, 感谢
修改
我已经多次成功运行代码而没有任何错误,而且它似乎工作得很好。但是我仍然不知道这种代码的并行化是否是一种好的做法。