Ceres2.1 GPU加速的开始

举报
Hermit_Rabbit 发表于 2022/11/29 21:54:48 2022/11/29
【摘要】 0. 简介作为SLAMer常用的优化工具,我们会经常接触Ceres这一优化工具,但是在优化的过程中一直不支持GPU加速,这就导致优化性能难以提高,但是在Ceres2.1这一版本后,GPU加速开始适用于Ceres,为此本文来采坑看一看如何适用GPU加速Ceres。 1. 删除原本Ceres通过find . -name ceres*函数我们可以发现ceres代码路径是存在在下面三个路径下的,所...

0. 简介

作为SLAMer常用的优化工具,我们会经常接触Ceres这一优化工具,但是在优化的过程中一直不支持GPU加速,这就导致优化性能难以提高,但是在Ceres2.1这一版本后,GPU加速开始适用于Ceres,为此本文来采坑看一看如何适用GPU加速Ceres。
请添加图片描述

1. 删除原本Ceres

通过find . -name ceres*函数我们可以发现ceres代码路径是存在在下面三个路径下的,所以我们通过
rm -rf删除所有的依赖。

sudo rm -rf ./usr/local/include/ceres ./usr/include/ceres

请添加图片描述

2. 安装 Ceres2.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 and CXSparse (optional)
sudo apt-get install libsuitesparse-dev
# Download Ceres,如果无法下载,可以使用:https://ceres-solver.googlesource.com/ceres-solver/+archive/f68321e7de8929fbcdb95dd42877531e64f72f66.tar.gz 或者 http://ceres-solver.org/ceres-solver-2.1.0.tar.gz下载。
git clone https://ceres-solver.googlesource.com/ceres-solver/+/refs/tags/2.1.0

# check if it is ceres-solver-2.1.0.tar.gz
tar zxf ceres-solver-2.1.0.tar.gz
cd ceres-solver-2.1.0/
mkdir build
cd build
cmake -D CMAKE_INSTALL_PREFIX=/usr/local/ceres ..
make -j4
make test
sudo make install

这一步Ceres2.1就安装完毕了。我们在使用make test时候可以看到cuda已经被调用。
在这里插入图片描述

3. GPU 版本使用

我们可以看到现在Google说目前支持DENSE_QR, DENSE_NORMAL_CHOLESKY 和 DENSE_SCHUR三种优化方式,所以我们以DENSE_NORMAL_CHOLESKY为例子来进行介绍。
CMakeList.txt

set(Ceres_DIR /opt/third_party/ceres2.1/lib/cmake/Ceres)
set(CERES_INCLUDE_DIRS /opt/third_party/ceres2.1/include/)
if (CUDA)
  find_package(CUDA QUIET)
  if (CUDA_FOUND)
    message("-- Found CUDA version ${CUDA_VERSION}: "
        "${CUDA_LIBRARIES};"
        "${CUDA_cusolver_LIBRARY};"
        "${CUDA_cusparse_LIBRARY}")
    include_directories(
      ${CUDA_INCLUDE_DIRS}
    )
    if (CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64")
      message("embed_platform on")
      include_directories(/usr/local/cuda/targets/aarch64-linux/include)
      link_directories(/usr/local/cuda/targets/aarch64-linux/lib)
    else()
      message("embed_platform off")
      link_directories(/usr/local/cuda-11.1/targets/x86_64-linux/lib/)
    endif()
      
  else (CUDA_FOUND)
    message("-- Did not find CUDA library, disabling CUDA support.")
    update_cache_variable(CUDA OFF)
    list(APPEND CERES_COMPILE_OPTIONS CERES_NO_CUDA)
  endif (CUDA_FOUND)
else (CUDA)
  message("-- Building without CUDA.")
  list(APPEND CERES_COMPILE_OPTIONS CERES_NO_CUDA)
endif (CUDA)

我们可以看一下官网的例子:
cuda_dense_cholesky_test.cc

.......
// Tests the CUDA Cholesky solver with a simple 4x4 matrix.
TEST(CUDADenseCholesky, Cholesky4x4Matrix) {
  Eigen::Matrix4d A;
  A <<  4,  12, -16, 0,
       12,  37, -43, 0,
      -16, -43,  98, 0,
        0,   0,   0, 1;
  const Eigen::Vector4d b = Eigen::Vector4d::Ones();
  LinearSolver::Options options;
  ContextImpl context;
  options.context = &context;
  options.dense_linear_algebra_library_type = CUDA;
  auto dense_cuda_solver = CUDADenseCholesky::Create(options);
  ASSERT_NE(dense_cuda_solver, nullptr);
  std::string error_string;
  ASSERT_EQ(dense_cuda_solver->Factorize(A.cols(),
                                        A.data(),
                                        &error_string),
            LinearSolverTerminationType::LINEAR_SOLVER_SUCCESS);
  Eigen::Vector4d x = Eigen::Vector4d::Zero();
  ASSERT_EQ(dense_cuda_solver->Solve(b.data(), x.data(), &error_string),
            LinearSolverTerminationType::LINEAR_SOLVER_SUCCESS);
  EXPECT_NEAR(x(0), 113.75 / 3.0, std::numeric_limits<double>::epsilon() * 10);
  EXPECT_NEAR(x(1), -31.0 / 3.0, std::numeric_limits<double>::epsilon() * 10);
  EXPECT_NEAR(x(2), 5.0 / 3.0, std::numeric_limits<double>::epsilon() * 10);
  EXPECT_NEAR(x(3), 1.0000, std::numeric_limits<double>::epsilon() * 10);
}

…详情请参照古月居

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。