omp不会启动线程

时间:2018-04-10 16:26:36

标签: c++ multithreading openmp

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);
            }
    }

我刚看到我的电脑开始内存不足,这可能是问题的一部分吗?

2 个答案:

答案 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; ......编译器会忽略这些行。