效率提升::线程组

时间:2018-03-23 13:28:25

标签: multithreading boost boost-thread point-clouds

我想提高程序的效率,为此我尝试并行化可能的任务。我正在使用点云,所以我们谈论的是大数据,大约是17000点。

这是之前的代码:

void Estimator::extract_relevant_points(std::vector<Point3D>& relevant_points, std::vector<Point3D>& pointcloud, doubleIE cell_min_angle_sensor_rot, doubleIE cell_max_angle_sensor_rot)
    {
    for(int i = 0; i < pointcloud.size(); i++) {
       //Doing my operations ...
    }
}

现在的代码是:

void Estimator::extract_relevant_points_multithread(std::vector<Point3D>& relevant_points, std::vector<Point3D>& pointcloud, doubleIE cell_min_angle_sensor_rot, doubleIE cell_max_angle_sensor_rot)
    {
        std::cout << "pointcloud = " << pointcloud.size ()<< std::endl;

        boost::thread_group group;

        for(int i = 0; i < pointcloud.size(); i++) {
            group.create_thread(boost::bind(&IntervalMapEstimator::extract_relevant_point_in_thread, i,boost::ref(relevant_points), boost::ref(pointcloud), boost::cref(cell_min_angle_sensor_rot), boost::cref(cell_max_angle_sensor_rot)));
        }
        std::cout << "size group before join = " << group.size ()<< std::endl;
        group.join_all();
        std::cout << "size group after join = " << group.size ()<< std::endl;
    }

void Estimator::extract_relevant_point_in_thread(int i, std::vector<Point3D>& relevant_points, std::vector<Point3D>& pointcloud, doubleIE cell_min_angle_sensor_rot, doubleIE cell_max_angle_sensor_rot)
    {
        //Doing my operations
    }

但新代码在运行中崩溃,我无法理解原因。有没有人知道? 此外,我还推出了一些小计时器,以便花时间在这个功能上,似乎新版本花费的时间比第一次更长......无法理解为什么......

2 个答案:

答案 0 :(得分:1)

看起来这段代码为每个17000点创建一个线程。这肯定会使你的应用程序崩溃,因为除非你有更多的RAM,否则每个线程最少需要2MB堆栈到34GB的堆栈。

使用gcc parallel algorithmsIntel TBB parallel algorithmsIntel TBB task scheduler

答案 1 :(得分:0)

感谢您的回答。

我想我能用线程池模式解决问题,你认为这会有用吗? 但是同时运行多少线程也会更有效率?
我的CPU有8个内核,所以我猜它。

TBB看起来很有趣,但我更愿意自己做。