用nvcc(CUDA)编译特征库

时间:2012-10-09 14:42:25

标签: c++ cuda eigen

我尝试使用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:如果我使用主机编译器编译相同的代码,它可以很好地工作。

3 个答案:

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

如此接近......

更新2:

这已经在commit 59db051中得到修复,可以使用开发分支或等待v3.3(或3.3rc2)实际出现。