在 C++ 中使用 OpenMp 崩溃时出错
Error when I use collapse of OpenMp in C++
我有一个错误,我不明白为什么折叠在我的代码中不起作用。
#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]);
}
}
}
}
}
它不适用于折叠,但当我移除折叠时它会起作用。我不明白为什么,有人知道为什么吗?
它也可以在单线程中工作。
关于崩溃声明,这里提供了一个很好的解释:
。如答案中所述,仅当内部循环不依赖于外部循环时,崩溃子句才会起作用,在您的情况下,这似乎不成立,因为不能保证向量的大小对于 [ 的所有值都相同=10=]。
不幸的是,我还没有 post 评论的声誉,所以我将在这里求助于 posting 这个 - 尽管它与原始问题并不完全相关。
您似乎正在使用相当简单的指令并行化循环,线程很可能会花费大量时间在该临界区周围等待。尽管我认为这就是 local_relevant_points
的用途。
我有一个错误,我不明白为什么折叠在我的代码中不起作用。
#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]);
}
}
}
}
}
它不适用于折叠,但当我移除折叠时它会起作用。我不明白为什么,有人知道为什么吗? 它也可以在单线程中工作。
关于崩溃声明,这里提供了一个很好的解释:
不幸的是,我还没有 post 评论的声誉,所以我将在这里求助于 posting 这个 - 尽管它与原始问题并不完全相关。
您似乎正在使用相当简单的指令并行化循环,线程很可能会花费大量时间在该临界区周围等待。尽管我认为这就是 local_relevant_points
的用途。