我从依赖于 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 代码)会导致编译失败。
仅供参考,我正在使用:
由于带有 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 似乎是已知。