使用VS2017 + nvcc编译特征库v3.3.4时出错(CUDA 9.0)

时间:2018-01-19 12:41:25

标签: 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>

    __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:效果很好

  1. 如果我评论特征部分,或
  2. 我在一个完全cpp项目中使用Eigen,而VS 2017没有nvcc
  3. 这是否特定于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;

1 个答案:

答案 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