我尝试使用nvcc(CUDA 5.0 RC)编译以下程序(main.cu):
#include <Eigen/Core>
#include <iostream>
int main( int argc, char** argv )
{
std::cout << "Pure CUDA" << std::endl;
}
不幸的是,我收到了一堆警告和错误,我只能使用nvcc而不是Microsoft编译来解释。
这个假设是对的吗? 有没有办法用nvcc编译Eigen? (我实际上不想将Eigen矩阵转移到GPU,只是访问他们的成员)?
如果使用nvcc编译Eigen不起作用,是否有关于分离主机和设备代码的巧妙方法的指南/教程?
我使用的是CUDA 5.0 RC,Visual Studio 2008,Eigen 3.0.5。要编译我同时使用的.cu文件,CUDA中包含的规则文件,以及CMake生成的自定义构建步骤。使用CUDA规则文件,我将构建定位在计算能力3.0。
感谢您的建议。
PS:如果我使用主机编译器编译相同的代码,它可以很好地工作。
答案 0 :(得分:2)
NVCC调用普通的主机编译器,但在它进行一些预处理之前没有调用,所以很可能NVCC正在努力正确地解析特征代码(特别是如果它使用C ++ 11的功能,但是这不太可能,因为你说VS2008工作正常)。
我通常建议将设备代码和包装器分离到.cu
文件中,并将应用程序的其余部分保留在正常.c
/ .cpp
文件中,以便主机编译器直接处理。有关使用VS2008进行此设置的一些提示,请参阅this answer。
答案 1 :(得分:2)
看起来Eigen的核心贡献者之一是porting it to be compatible with CUDA。我们的想法是从内核代码中调用它。
答案 2 :(得分:2)
从Eigen 3.3开始,nvcc(7.5)成功地将特征码传递给cl(MSVC 2013)(几乎?)。例如,以下代码仅生成 11警告:
#include <Eigen/Core>
#include <iostream>
int main()
{
std::cout << "Hello Eigen\t";
std::cout << EIGEN_WORLD_VERSION << "." << EIGEN_MAJOR_VERSION << "." << EIGEN_MINOR_VERSION << "\n";
std::cout << "Hello nvcc\t";
std::cout << __CUDACC_VER_MAJOR__ << "." << __CUDACC_VER_MINOR__ << "." << __CUDACC_VER_BUILD__ << "\n";
return 0;
}
按预期输出(Eigen 3.3rc1):
Hello Eigen 3.2.94
你好nvcc 7.5.17
但是有一长串警告(如果你真的想看到它们,请参见帖子history。)
不幸的是,使用CUDA 8.0&amp; VS2015(同时具有Eigen 3.2.9和Eigen 3.3rc1)会再次导致编译错误:
“operator =”已经在当前范围内声明了eigen \ src \ Core \ Block.h 111 “operator =”已在当前范围内声明为eigen \ src \ Core \ Ref.h 89
如此接近......
这已经在commit 59db051中得到修复,可以使用开发分支或等待v3.3(或3.3rc2)实际出现。