Ошибка при компиляции библиотеки Eigen v3.3.4 с VS2017 + nvcc (CUDA 9.0)

Я попытался скомпилировать следующий код, где я использую 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): фатальная ошибка C1017

В моем оригинальном проекте Eigen-код отделен в файле.h от кода cuda, но ошибка та же.

PS: хорошо работает

  1. если я прокомментирую собственную часть, или
  2. Я использую Eigen в полностью cpp проекте с VS 2017 без nvcc

Это специфично для VS2017 + CUDA 9.0 + Eigen v3.3.4? Потому что в соответствии с библиотекой Compiling Eigen с помощью nvcc (CUDA): update2 она работала для других версий.

Спасибо

Update1:

Спасибо Ави Гинзбург, я скачал последнюю версию ветки разработчика. С этой версией я больше не получаю эту ошибку. Однако у меня есть другие ошибки, которые я не понимаю: я только что заменил последнюю стабильную версию на ту, что здесь . Нестабильный исходный код из ветки разработки. Полная ошибка доступна на изображении здесь Error_Compil, но выглядит это так

1>kernel.cu 1>g:\librray_quant\ Issues_lib\eigen_nvcc\eigen_nvcc\3rdparties\dev_branch\eigen\src/SVD/JacobiSVD.h(614): ошибка C2244: 'Eigen::JacobiSVD::allocate': невозможно сопоставить определение функции с существующим объявлением 1> g: \ librray_quant \ Issues_lib\eigen_nvcc\eigen_nvcc\3rdparties\dev_branch\eigen\src/SVD/JacobiSVD.h(613): примечание: см. объявление 'Eigen::JacobiSVD::allocate' 1>g:\librray_quant\ questions_lib \ eigen_nvcc \ eigen_nvcc \ 3rdparties \ dev_branch \ eigen \ src / SVD / JacobiSVD.h (614): примечание: определение 1> g: \ librray_quant \ Issue_lib \ eigen_nvcc \ dev_ranch \ eigen_narts \ eigen \ src / SVD / JacobiSVD.h (614): примечание: 'void Eigen::JacobiSVD::allocate(::Eigen::SVDBase>::Index,Eigen::SVDBase::Index,unsigned int)' 1>g:\librray_quant\ questions_lib \ eigen_nvcc \ eigen_nvcc \ 3rdparties \ dev_branch \ eigen \ src / SVD / JacobiSVD.h (614): примечание: существующие объявления 1> g: \ librray_quant \ Issue_lib \ eigen_nvcc \ dev_ranch \ eigen_nvcc \ eigen_nvcc eigen \ src / SVD / JacobiSVD.h (614): примечание: 'void Eigen::JacobiSVD::allocate(Eigen::SVDBase::Index,Eigen::SVDBase::Index, без знака int) '

1 ответ

По-видимому, __CUDACC_VER__ больше не поддерживается в CUDA 9.0, и, следовательно, __CUDACC_VER__ >= 80000 больше не является действительным сравнением. Я не уверен, что это определено (я предполагаю, #define __CUDACC_VER__ "" чтобы вызвать эту ошибку), так как у меня не установлен CUDA на этом компьютере. Попробуйте ветку dev в Eigen, у них может быть исправление. Если нет, проверка должна быть для __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

в Eigen/Core и заменил Macros.h линия с (EIGEN_CUDACC_VER >= 80000),

Другие вопросы по тегам