有关OpenmP并行化的问题。我在下面提供了我的函数的精简版本。问题是,尽管并非总是如此,但并未针对uiIndex的所有值评估for循环的内容。
- 我使用缓冲区vec_succ_status来检查uiIndex的所有值是否都得到评估。事实证明并非如此。
- 我的代码不会崩溃,它只是从函数compute_Lagr_shortest_paths_from_source退出,而不会遇到下面的函数定义中的任何exit(-1)语句。
- 我正在Ubunutu 14上使用g ++ 7.4.0版本,并且每次失败时,都会略过uiIndex的一个值。函数无法对其进行评估的uiIndex不一致。
- 对于我正在测试的程序,vec_group的大小始终为1,因此只有for循环内的第一个if语句才会求值。
- 在我的主要功能中,添加了omp_set_num_threads(4)行。除此之外,我没有为OpenmP设置任何其他设置(例如调度程序类型)。
- 此外,我可以确保没有uiIndex的2个值导致相同的uiRobot值,因此,没有2个线程将必须通过该函数的lieftime访问相同的vec_cf_graphs [uiRobot]数组。
我想知道我是否对Openmp做一些错误的假设。我要求所有对象(例如vec_cf_graphs,vec_succ_status)在所有线程之间共享。我想知道是否需要明确提及它们是共享的,这通常是推荐的方法。无论如何,我认为我的实现方式也足够了。但是,对于某些uiIndex值可以完全跳过,这对我来说似乎很奇怪。我必须指出,我反复调用了所示的函数,但是只有某些uiIndex值会从评估中跳过。如果有人可以指出我的方法存在潜在的问题,那将很棒。我很乐意提供其他信息。谢谢。
bool compute_Lagr_shortest_paths_from_source(std::vector<Robot_CF_Graph>& vec_cf_graphs,const std::vector<std::vector<size_t>>& vec_robot_groups)
{
size_t uiIndex;
std::vector<bool> vec_succ_status(vec_robot_groups.size(),false);
#pragma omp parallel for default(shared) private(uiIndex)
for(uiIndex = 0; uiIndex < vec_robot_groups.size(); uiIndex++)
{
vec_succ_status[uiIndex] = false;
const auto& vec_group = vec_robot_groups[uiIndex];
if(1 == vec_group.size())
{
size_t uiRobot = vec_group[0];
vec_cf_graphs[uiRobot].compute_shortest_path("ABC");
vec_succ_status[uiIndex] = true;
}
else
{
std::cout<< "Tag: Code should not have entered this block"<<endl;
exit(-1);
}
if(false == vec_succ_status[uiIndex])
{
std::cout<< "It is not possible for this to happen \n";
exit(-1);
}
}
return true;
}