openMp过去常常在6个线程上处理我的项目,现在,(我不知道为什么),该程序是单线程的。
我的代码非常简单,我只在一个cpp文件中使用openMp,我声明了
#include <omp.h>
然后并行化的函数是:
#pragma omp parallel for collapse(2) num_threads(IntervalMapEstimator::m_num_thread)
for (int cell_index_x = m_min_cell_index_sensor_rot_x; cell_index_x <= m_max_cell_index_sensor_rot_x; cell_index_x++)
{
for (int cell_index_y = m_min_cell_index_sensor_rot_y; cell_index_y <= m_max_cell_index_sensor_rot_y; cell_index_y++)
{
//use for debug
omp_set_num_threads (5);
std::cout << "omp_get_num_threads = " << omp_get_num_threads ()<< std::endl;
std::cout << "omp_get_max_threads = " << omp_get_max_threads ()<< std::endl;
if(split_points) {
extract_relevant_points_from_angle_lists(relevant_points, pointcloud_ff_polar_angle_lists, cell_min_angle_sensor_rot, cell_max_angle_sensor_rot);
} else {
extract_relevant_points_multithread_with_localvector(relevant_points, pointcloud, cell_min_angle_sensor_rot, cell_max_angle_sensor_rot);
}
}
}
omp_get_num_threads
返回1个帖子
omp_get_max_threads
返回5
IntervalMapEstimator::m_num_thread
设置为6
任何领导都会非常感激。
编辑1:
我修改了我的代码,但问题仍然存在,程序仍在单线程中运行。
omp_get_num_threads
返回1
omp_get_max_threads
返回8
有没有办法知道在运行时有多少线程可用?
#pragma omp parallel for collapse(2)
for (int cell_index_x = m_min_cell_index_sensor_rot_x; cell_index_x <= m_max_cell_index_sensor_rot_x; cell_index_x++)
{
for (int cell_index_y = m_min_cell_index_sensor_rot_y; cell_index_y <= m_max_cell_index_sensor_rot_y; cell_index_y++)
{
std::cout << "omp_get_num_threads = " << omp_get_num_threads ()<< std::endl;
std::cout << "omp_get_max_threads = " << omp_get_max_threads ()<< std::endl;
extract_relevant_points(relevant_points, pointcloud, cell_min_angle_sensor_rot, cell_max_angle_sensor_rot);
}
}
我刚看到我的电脑开始内存不足,这可能是问题的一部分吗?
答案 0 :(得分:0)
根据https://msdn.microsoft.com/en-us/library/bx15e8hb.aspx:
如果在禁用线程数的动态调整时遇到并行区域,并且并行区域请求的线程数超过了运行时系统可以提供的数量,则程序的行为是 - 定义。例如,实现可以中断程序的执行,或者它可以序列化并行区域。
您请求6个线程,实现只能提供5个,因此可以随意执行。
我也非常确定你不应该在平行区域内改变线程数,所以你的omp_set_num_threads
最多什么都不会做,最坏的时候就会爆炸。
答案 1 :(得分:0)
我通过另一篇文章找到了答案:Why does the compiler ignore OpenMP pragmas?
最后这是一个简单的库错误,我没有添加到编译器中,我没有注意到它因为我正在使用cmake进行编译所以我不必键入这条线直接。我也使用catkin_make进行编译,所以我没有警告,但只有控制台出错。
所以基本上,要使用openMp,你必须将-fopenmp作为参数添加到你的编译器中,如果你没有&#39; ......编译器会忽略这些行。