ceres-solver的CUDA加速版本在ubuntu上的并行加速运算
最近项目需求需要使用cartographer算法建图,打算使用CUDA做并行加速,在优化问题中cartographer主要使用的就是ceres-solver,在最新的版本中ceres-solver已经是能够支持cuda加速,本篇使用ceres-solover 2.1(最新版本已经到了2.2)来实现CUDA加速
ceres-solver官网链接: ceres-solver
依赖
C++17-compliant compiler
CMake 3.16 or later
Eigen 3.3 or later
glog 0.3.5 or later
gflags
SuiteSparse 4.5.6 or later
ceres-solver 2.1 安装
依赖安装
# CMake
sudo apt-get install cmake
# google-glog + gflags
sudo apt-get install libgoogle-glog-dev libgflags-dev
# Use ATLAS for BLAS & LAPACK
sudo apt-get install libatlas-base-dev
# Eigen3
sudo apt-get install libeigen3-dev
# SuiteSparse (optional)
sudo apt-get install libsuitesparse-dev
源码安装
#ceres-solver-2.1.0源码下载
http://ceres-solver.org/ceres-solver-2.1.0.tar.gz
tar zxf ceres-solver-2.2.0.tar.gz
mkdir build
cd build
cmake -D CMAKE_INSTALL_PREFIX=/usr/local/ceres ..
make -j4
make test
# Optionally install Ceres, it can also be exported using CMake which
# allows Ceres to be used without requiring installation, see the documentation
# for the EXPORT_BUILD_DIR option for more information.
make install
运行make test的同时可以通过nvidia-smi查看电脑GPU的使用情况,是可以发现已经使用了GPU加速
测试CUDA加速ceres-solver
CUDA加速版本的ceres-solover主要提供了三种加速优化方式:
DENSE_QR
DENSE_NORMAL_CHOLESKY
DENSE_SCHUR
打开./internal/ceres/dense_cholesky_test.cc测试一下
decltype(auto) MakeValues() {
return ::testing::Values(EIGEN
#ifndef CERES_NO_LAPACK
,
LAPACK
#endif
#ifndef CERES_NO_CUDA
,
CUDA
#endif
);
}
最后运行完后会返回在eigen,Lpack,CUDA三种方式下的运行耗时,但是示例中所给的是小规模运算,所以看到的CUDA耗时会比eigen和LPACK要大很多,可以自行加大计算的规模量可以看到速度较为明显的提升,同时可以打开nvidia-smi查看GPU的使用率,使用CUDA加速的话就是在options配置项中加入options.dense_linear_algebra_library_type = CUDA
// 使用cuda
#ifndef CERES_NO_CUDA
ceres::Solver::Options options;
options.minimizer_type = ceres::TRUST_REGION;
options.linear_solver_type = ceres::DENSE_QR;
options.dense_linear_algebra_library_type = CUDA;//加入这一句即可
ceres::Solve(options, &problem, &summary);
#endif
// 不使用 cuda
#ifdef CERES_NO_CUDA
ceres::Solver::Options options;
options.linear_solver_type = ceres::DENSE_QR;
options.minimizer_type = ceres::TRUST_REGION;
ceres::Solve(options, &problem, &summary);
#endif
对carto进行加速
使用cuda加速版本的ceres-solver对carto进行加速,找到源代码中使用ceres优化的部分如local-slam部分的scan_matching等,在ceres的配置项option加上cuda即可,具体的实现方式即效果后续会进行更新。