我想提高程序的效率,为此我尝试并行化可能的任务。我正在使用点云,所以我们谈论的是大数据,大约是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
}
但新代码在运行中崩溃,我无法理解原因。有没有人知道? 此外,我还推出了一些小计时器,以便花时间在这个功能上,似乎新版本花费的时间比第一次更长......无法理解为什么......
答案 0 :(得分:1)
看起来这段代码为每个17000点创建一个线程。这肯定会使你的应用程序崩溃,因为除非你有更多的RAM,否则每个线程最少需要2MB堆栈到34GB的堆栈。
使用gcc parallel algorithms或Intel TBB parallel algorithms或Intel TBB task scheduler。
答案 1 :(得分:0)
感谢您的回答。
我想我能用线程池模式解决问题,你认为这会有用吗?
但是同时运行多少线程也会更有效率?
我的CPU有8个内核,所以我猜它。
TBB看起来很有趣,但我更愿意自己做。