使用VS2017+nvcc(CUDA 9.0)编译Egen library v3.3.4时出错

使用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

我试图编译下面的代码,在这里我同时使用了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;
    }
使用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