Ошибка при компиляции библиотеки 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: хорошо работает
- если я прокомментирую собственную часть, или
- Я использую 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)
,