在C ++中使用OpenMp崩溃时出错

时间:2018-05-22 12:47:41

标签: c++ openmp

我有一个错误,我不明白为什么崩溃在我的代码中不起作用。

    #pragma omp parallel num_threads(IntervalMapEstimator::m_num_thread)
    {
        std::vector<Point3D> local_relevant_points;

        #pragma omp for collapse(2)
        for(int i = first_list_index; i < last_list_index ; i++)
        {
            for (int k = 0; k < pointcloud_ff_polar_angle_lists[i].size(); k++)
            {
                if ( pointcloud_ff_polar_angle_lists[i][k].pol_sensor_rot.phi >= cell_start_angle && pointcloud_ff_polar_angle_lists[i][k].pol_sensor_rot.phi <= cell_end_angle )
                {
                    #pragma omp critical
                    {
                        relevant_points.push_back(pointcloud_ff_polar_angle_lists[i][k]);
                    }
                }
            }
        }
    }

它不适用于崩溃,但是当我移除崩溃时它就会发生。我无法弄清楚为什么,有人知道为什么吗? 它也适用于单线程。

1 个答案:

答案 0 :(得分:4)

关于崩溃声明,这里提供了一个很好的解释: Understanding the collapse clause in openmp。如答案中所述,collapse子句仅在内部循环不依赖于外部时才起作用,在您的情况下,外部循环似乎不会保持,因为对于{的所有值,不能保证向量的大小相同{1}}。

不幸的是我还没有发表评论的声誉,所以我会在这里发布 - 尽管它与原始问题并不完全相关。

您似乎使用相当简单的指令并行化循环,很可能线程将花费大量时间等待该关键区域。虽然我认为这将是org.springframework.web.util.UriUtils.encode(foo, charset)将被用于。