我想要提高我的程序的效率,在这个目的,我试图并行的任务,可以。我使用的是点云,所以我们谈论的是大数据,大约有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
}但是新的代码在运行中崩溃了,我不明白为什么。有没有人有主意?另外,我在这个函数上花了一些时间,新版本似乎比第一个版本花了更多的时间……我也不明白为什么..
发布于 2018-03-23 23:53:06
看起来这段代码为每17000个点创建了一个线程。这必然会使您的应用程序崩溃,因为每个线程至少需要2MB堆栈,总共需要34 is堆栈,除非您有更多的RAM。
使用gcc parallel algorithms、Intel TBB parallel algorithms或Intel TBB task scheduler。
发布于 2018-03-26 17:43:25
谢谢你的回答。
我想我可以用线程池模式来解决这个问题,你觉得这行得通吗?但是多少线程应该同时运行才能更有效率呢?
我的CPU有8个核心,所以我要猜测一下。
TBB看起来很有趣,但我更喜欢自己做。
https://stackoverflow.com/questions/49450758
复制相似问题