使用VS2017+nvcc(CUDA 9.0)编译Egen library v3.3.4时出错
我试图编译下面的代码,在这里我同时使用了Eigen和cuda,但我得到了一个错误使用VS2017+nvcc(CUDA 9.0)编译Egen library v3.3.4时出错,cuda,visual-studio-2017,eigen,nvcc,Cuda,Visual Studio 2017,Eigen,Nvcc,我试图编译下面的代码,在这里我同时使用了Eigen和cuda,但我得到了一个错误 #include "cuda_runtime.h" #include "device_launch_parameters.h" #include <stdio.h> #include <iostream> #include <Eigen/Dense> #include <Eigen/IterativeLinearSolvers
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <stdio.h>
#include <iostream>
#include <Eigen/Dense>
#include <Eigen/IterativeLinearSolvers>
__global__ void printWithCUDA()
{
if (threadIdx.x == 0)
{
printf(" Printed with thread %d \n", threadIdx.x);
}
}
int main()
{
// Eigen Operation
Eigen::Matrix3d eigenA;
eigenA << 1, 2, 3,
4, 5, 6,
7, 8, 9;
Eigen::Matrix3d eigenB;
eigenB << -1, -2, -3,
-4, -5, -6,
-7, -8, -9;
Eigen::MatrixXd eigenC = eigenA * eigenB;
std::cout << " \n Eigen Matrix " << std::endl;
std::cout << eigenC;
// CUDA Operation
printWithCUDA <<< 1, 32 >>>();
if (cudaPeekAtLastError() != cudaSuccess)
{
fprintf(stderr, "addWithCuda failed!");
return 1;
}
return 0;
}
使用VS2017、Eigen v3.3.4和CUDA 9.0,我得到以下错误
eigen\src/Core/util/Macros.h402:致命错误C1017:整数常量表达式无效
在我最初的项目中,Eigen代码在一个.h文件中与cuda代码分离,但错误是相同的
附言:效果很好
如果我评论特征部分,或者
我在一个完整的cpp项目中使用了Egen,其中VS 2017没有nvcc
这是否特定于VS2017+CUDA 9.0+Egen v3.3.4?因为根据
它适用于其他版本
谢谢
更新1:
谢谢Avi Ginsburg,我已经下载了最新版本的dev branch。有了这个版本,我再也不会犯这个错误了。
然而,我还有其他一些我不明白的错误:我刚刚用这里的版本替换了最新的稳定版本
图中显示了完整的错误,但看起来是这样的
1> kernel.cu
1> g:\librray\u quant\issues\u lib\eigen\u nvcc\eigen\u nvcc\3rdparties\dev_branch\eigen\src/SVD/JacobiSVD.h614:错误C2244:“eigen::JacobiSVD::allocate”:无法将函数定义与现有声明匹配
1> g:\librray\u quant\issues\u lib\eigen\envcc\eigen\nvcc\3rdparties\dev_branch\eigen\src/SVD/JacobiSVD.h613:注意:请参见“eigen::JacobiSVD::allocate”的声明
1> g:\librray\u quant\issues\u lib\eigen\u nvcc\eigen\u nvcc\3rdparties\dev\u branch\eigen\src/SVD/JacobiSVD.h614:注:定义
1> g:\librray\u quant\issues\u lib\eigen\u nvcc\eigen\u nvcc\3rdparties\dev_branch\eigen\src/SVD/JacobiSVD.h614:注意:'void eigen::JacobiSVD::allocate::eigen::SVDBase>::Index,eigen::SVDBase::Index,unsigned int'
1> g:\librray\u quant\issues\u lib\eigen\u nvcc\eigen\u nvcc\3rdparties\dev\u branch\eigen\src/SVD/JacobiSVD.h614:注:现有声明
1> g:\librray\u quant\issues\u lib\eigen\u nvcc\eigen\u nvcc\3rdparties\dev_branch\eigen\src/SVD/JacobiSVD.h614:注意:'void-eigen::JacobiSVD::allocateEigen::SVDBase::Index,eigen::SVDBase::Index,unsigned int'
显然,CUDA 9.0不再支持uuuu CUDACC_VER_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。我不确定它的定义是什么,我假设define u CUDACC u VER uu导致此错误,因为我没有在这台计算机上安装CUDA。尝试Eigen的dev分支,他们可能会对此进行修复。如果没有,则应检查是否为uu CUDACC u VER uu MAJOR uu uu CUDACC u VER uu MINOR u。你可以提交一个建议的修复,如果你让它工作
使现代化
Eigen开发人员已经在开发分支中修复了它,但不确定何时修复。他们绕过了这个问题:
// Starting with CUDA 9 the composite __CUDACC_VER__ is not available.
#if defined(__CUDACC_VER_MAJOR__) && (__CUDACC_VER_MAJOR__ >= 9)
#define EIGEN_CUDACC_VER ((__CUDACC_VER_MAJOR__ * 10000) + (__CUDACC_VER_MINOR__ * 100))
#elif defined(__CUDACC_VER__)
#define EIGEN_CUDACC_VER __CUDACC_VER__
#else
#define EIGEN_CUDACC_VER 0
#endif
在Eigen/Core中,将宏.h行替换为Eigen_CUDACC_VER>=80000