c++ - 当我在 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]);
}
}
}
}
}
它不适用于崩溃,但当我移除崩溃时它会起作用。我不知道为什么,有人知道为什么吗?它也可以在单线程中工作。
解决方案
关于折叠语句,这里提供了一个很好的解释:
了解 openmp 中的折叠子句。正如答案中所述,collapse 子句仅在内部循环不依赖于外部循环时才起作用,在您的情况下,外部循环似乎不成立,因为不能保证向量的大小对于 的所有值都是相同的i
。
不幸的是,我还没有发表评论的声誉,所以我将求助于在这里发布——即使它与原始问题并不完全相关。
您似乎正在使用相当简单的指令并行化循环,线程很可能会花费大量时间在该关键区域周围等待。虽然我认为这就是local_relevant_points
将要使用的。
推荐阅读
- angular - 当用户重新关注输入字段时,使验证错误消息消失
- java - 如何删除字符串中 /* 和 */ 表示的注释?
- php - 如何在 php 中执行 5log(7.5/2) 之类的数学函数?
- php - 定位 PHP“每个”警告的详细来源
- java - “网页不可用,无法加载位于 http://xxx.xxx.xxx.xx:3000/pgSimulator/axis/redirect 的网页。net::ERR_CLEARTEXT_NOT_PERMITTED”
- itext - pdf 操作 - 标记图像或图形
- registry - RegOpenKeyExA 和 RegOpenKeyEx 有什么区别
- android - Wowza 直播视频未存储在“内容”文件夹中
- ios - 如何快速从 JSON 中获取数据
- python - websocket._exceptions.WebSocketProxyException:通过代理连接失败状态:503