使用OpenMP

有关OpenmP并行化的问题。我在下面提供了我的函数的精简版本。问题是,尽管并非总是如此,但并未针对uiIndex的所有值评估for循环的内容。

  1. 我使用缓冲区vec_succ_status来检查uiIndex的所有值是否都得到评估。事实证明并非如此。
  2. 我的代码不会崩溃,它只是从函数compute_Lagr_shortest_paths_from_source退出,而不会遇到下面的函数定义中的任何exit(-1)语句。
  3. 我正在Ubunutu 14上使用g ++ 7.4.0版本,并且每次失败时,都会略过uiIndex的一个值。函数无法对其进行评估的uiIndex不一致。
  4. 对于我正在测试的程序,vec_group的大小始终为1,因此只有for循环内的第一个if语句才会求值。
  5. 在我的主要功能中,添加了omp_set_num_threads(4)行。除此之外,我没有为OpenmP设置任何其他设置(例如调度程序类型)。
  6. 此外,我可以确保没有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;     
}
harry1900 回答:使用OpenMP

您同时写入一个{'1}},它不是正常的vector<bool>。它具有内部存储器优化。这是不确定的行为。

在此处查看详细的推理:

Write concurrently vector<bool>

vector与其他vector<bool>的不同之处可以在这里找到:

https://en.cppreference.com/w/cpp/container/vector_bool

仅使用vector(其中0或1表示对或错)是解决此问题的最简单方法。如果您想要更优雅的代码,请在此处讨论其他选项:

Alternative to vector<bool>

本文链接:https://www.f2er.com/3134884.html

大家都在问