我尝试编译以下代码,同时使用Eigen和cuda,我收到错误。
#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;
}
使用VS 2017,Eigen v3.3.4和CUDA 9.0,我收到以下错误
eigen \ src / Core / util / Macros.h(402):致命错误C1017:无效的整数常量表达式
Macros.h(402): fatal error C1017
在我的原始项目中,Eigen代码在.h文件中与cuda代码分开,但错误是相同的。
PS:效果很好
这是否特定于VS2017 + CUDA 9.0 + Eigen v3.3.4?因为根据Compiling Eigen library with nvcc (CUDA) : update2 它适用于其他版本。
由于
更新1:
感谢Avi Ginsburg,我已经下载了最新版本的dev分支。有了那个版本,我就不会再犯这个错误了。 但是,我还有其他一些我不明白的错误:我刚刚将最新的稳定版本替换为The unstable source code from the development branch 完整错误可在此处Error_Compil的图片中找到,但它看起来像这样
1&GT; kernel.cu 1&gt; g:\ librray_quant \ issues_lib \ eigen_nvcc \ eigen_nvcc \ 3rdparties \ dev_branch \ eigen \ src / SVD / JacobiSVD.h(614):错误C2244:&#39; Eigen :: JacobiSVD :: allocate&#39;:无法将函数定义与现有声明匹配 1&gt; g:\ librray_quant \ issues_lib \ eigen_nvcc \ eigen_nvcc \ 3rdparties \ dev_branch \ eigen \ src / SVD / JacobiSVD.h(613):注意:参见Eigen :: JacobiSVD :: allocate&#39;的声明 1&gt; g:\ librray_quant \ issues_lib \ eigen_nvcc \ eigen_nvcc \ 3rdparties \ dev_branch \ eigen \ src / SVD / JacobiSVD.h(614):注意:定义 1&gt; g:\ librray_quant \ issues_lib \ eigen_nvcc \ eigen_nvcc \ 3rdparties \ dev_branch \ eigen \ src / SVD / JacobiSVD.h(614):注意:&#39; void Eigen :: JacobiSVD :: allocate(:: Eigen :: SVDBase&gt; :: Index,Eigen :: SVDBase :: Index,unsigned int)&#39; 1&gt; g:\ librray_quant \ issues_lib \ eigen_nvcc \ eigen_nvcc \ 3rdparties \ dev_branch \ eigen \ src / SVD / JacobiSVD.h(614):注意:现有声明 1&gt; g:\ librray_quant \ issues_lib \ eigen_nvcc \ eigen_nvcc \ 3rdparties \ dev_branch \ eigen \ src / SVD / JacobiSVD.h(614):注意:&#39; void Eigen :: JacobiSVD :: allocate(Eigen :: SVDBase: :Index,Eigen :: SVDBase :: Index,unsigned int)&#39;
答案 0 :(得分:1)
显然,CUDA 9.0不再支持__CUDACC_VER__
,因此__CUDACC_VER__ >= 80000
不再是有效的比较。我不确定它被定义为什么(我假设#define __CUDACC_VER__ ""
导致此错误),因为我没有在此计算机上安装CUDA。试试Eigen的dev分支,他们可能会对它进行修复。如果没有,则检查应该是__CUDACC_VER_MAJOR__
,__CUDACC_VER_MINOR__
。如果让它正常工作,您可以提交建议的修复程序。
Eigen开发人员已将其固定在dev分支中(不确定何时)。他们用以下方式绕过了这个问题:
// 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
<{1>}中的并将Eigen/Core
行替换为Macros.h
。