如何包含和链接 kokkos 和 eigen

问题描述 投票:0回答:1

我从依赖于 Eigen 的 C++ 代码库开始,我试图看看它是否可以与 Kokkos 库 结合起来添加 GPU 功能,所以我需要在 CMake 中找到并链接这两个代码库文件。

此外,我的 Eigen 依赖项已经在使用 BLAS 和 LAPACK。

如果我在

target_link_libraries
部分中包含这些依赖项中的任何一个,那么一切都很好,但是如果我同时包含这两个依赖项,则编译会失败并显示

In file included from /main.cpp:6:
In file included from /bask/apps/live/EL8-ice/software/Eigen/3.4.0-GCCcore-11.3.0/include/Eigen/Dense:7:
In file included from /bask/apps/live/EL8-ice/software/Eigen/3.4.0-GCCcore-11.3.0/include/Eigen/Eigenvalues:55:
/bask/apps/live/EL8-ice/software/Eigen/3.4.0-GCCcore-11.3.0/include/Eigen/src/Eigenvalues/SelfAdjointEigenSolver_LAPACKE.h:80:1: error: __host__ function 'compute' cannot overload __host__ __device__ function 'compute'
   80 | EIGEN_LAPACKE_EIG_SELFADJ(double,   double,                double, dsyev)
      | ^
/bask/apps/live/EL8-ice/software/Eigen/3.4.0-GCCcore-11.3.0/include/Eigen/src/Eigenvalues/SelfAdjointEigenSolver_LAPACKE.h:77:9: note: expanded from macro 'EIGEN_LAPACKE_EIG_SELFADJ'
   77 |         EIGEN_LAPACKE_EIG_SELFADJ_2(EIGTYPE, LAPACKE_TYPE, LAPACKE_RTYPE, LAPACKE_NAME, ColMajor )  \
      |         ^
/bask/apps/live/EL8-ice/software/Eigen/3.4.0-GCCcore-11.3.0/include/Eigen/src/Eigenvalues/SelfAdjointEigenSolver_LAPACKE.h:43:72: note: expanded from macro 'EIGEN_LAPACKE_EIG_SELFADJ_2'
   43 | SelfAdjointEigenSolver<Matrix<EIGTYPE, Dynamic, Dynamic, EIGCOLROW> >::compute(const EigenBase<InputType>& matrix, int options) \
      |                                                                        ^
/bask/apps/live/EL8-ice/software/Eigen/3.4.0-GCCcore-11.3.0/include/Eigen/src/Eigenvalues/SelfAdjointEigenSolver.h:216:29: note: previous declaration is here
  216 |     SelfAdjointEigenSolver& compute(const EigenBase<InputType>& matrix, int options = ComputeEigenvectors);
      |                             ^

此错误似乎暗示 Eigen 正在尝试使用设备(GPU?)功能。

我在这里复制了代码的最小版本,一个

main.cpp
文件和 CMake 脚本:

main.cpp

#define lapack_complex_float std::complex<float>
#define lapack_complex_double std::complex<double>
#define EIGEN_USE_BLAS
#define EIGEN_USE_LAPACKE
#include <Eigen/Dense>

int main(void){
    Eigen::Matrix3d::Zero()
}

CMakeList.txt

cmake_minimum_required (VERSION 3.8)

set(CMAKE_CXX_STANDARD 20)

project ("trial")

find_package(Kokkos REQUIRED)
find_package(BLAS REQUIRED)
find_package(LAPACK REQUIRED)
find_package(Eigen3 REQUIRED NO_MODULE)

add_executable(main "main.cpp")

target_link_libraries(
    main
    Kokkos::kokkos
    Eigen3::Eigen
    BLAS::BLAS
    LAPACK::LAPACK
    )

请注意,这假设 Kokkos、BLAS 和 Eigen 已安装且可找到。

如果我删除 Kokkos 的链接,它将起作用,但是添加

Kokkos::kokkos
链接(即使不调用任何 Kokkos 代码)会导致编译失败。

仅供参考,我正在使用:

  • 铿锵18.1.8
  • CUDA/11.8.0
  • OpenBLAS-0.3.20
  • 本征-3.4.0
  • kokkos-4.3.01
  • openmp=libomp
c++ cmake cuda eigen
1个回答
0
投票

由于带有 CUDA 后端的 Kokkos 将使用 CUDA 编译器编译

.cpp
文件,因此我使用给定的代码和 NVCC 进行了一些操作,这给出了不同的错误。

最后我尝试使用 Clang 作为 CUDA 编译器,并且在问题中报告了相同的错误。 IE。 Kokkos 似乎默认使用 Clang 作为 CUDA 编译器而不是 NVCC。但我不认为 Eigen 的 CUDA 支持是用 Clang 进行测试的,因为 CUDA 编译器和 Clang 处理

__host__
__device__
与 NVCC 略有不同,这可能是这个特定问题的原因,即这个问题与 Kokkos 没有直接关系完全没有。

由于 OP 似乎并不打算在 GPU 代码中使用 Eigen,我建议通过定义

EIGEN_NO_CUDA
来关闭 Eigen CUDA 支持。这个问题在 Eigen 似乎是已知

© www.soinside.com 2019 - 2024. All rights reserved.