5

我尝试使用 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:如果我使用主机编译器编译相同的代码,它会完美运行。

4

3 回答 3

3

NVCC 会调用普通的主机编译器,但在它完成一些预处理之前不会调用,因此 NVCC 很可能正在努力正确解析 Eigen 代码(尤其是如果它使用 C++11 功能,但这不太可能,因为你说 VS2008 有效)。

我通常建议将设备代码和包装器分离到.cu文件中,并将应用程序的其余部分留在普通.c/.cpp文件中,由主机编译器直接处理。有关使用 VS2008 进行此设置的一些提示,请参阅此答案。

于 2012-10-12T16:34:51.110 回答
2

看起来 Eigen 的核心贡献者之一正在移植它以与 CUDA 兼容。这个想法是从内核代码中调用它。

于 2013-02-09T00:26:23.810 回答
2

从 Eigen 3.3 开始,nvcc (7.5) 成功地将 Eigen 代码正确地传递给 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;
}

按预期输出(特征 3.3rc1):

你好本征 3.2.94
你好 nvcc 7.5.17

但是有一长串警告(如果您真的想查看它们,请参阅帖子历史记录)。

更新:

不幸的是,使用 CUDA 8.0 和 VS2015(同时具有 Eigen 3.2.9 和 Eigen 3.3rc1)再次导致编译错误:

"operator=" 已在当前作用域中声明 eigen\src\Core\Block.h 111
"operator=" 已在当前作用域中声明 eigen\src\Core\Ref.h 89

很近...

更新 2:

这已在提交59db051中修复,可通过使用开发分支或等待 v3.3(或 3.3rc2)实际发布来获得。

于 2016-09-28T10:55:46.793 回答