CUDA和Eigen的成员“已被宣布”错误

时间:2014-01-19 11:51:40

标签: c++ visual-studio-2010 cuda eigen nsight

我只是CUDA和Nsight的初学者,并希望利用线性代数运算(例如CUBLAS)来利用出色的GPU性能。我有很多自定义代码在Eigen的帮助下编写,并且有很多矩阵乘法运算,所以我希望我的代码保持不变,只需在GPU上执行这些操作。

我用Visual Studio Nsight创建了一个示例项目,它工作正常,但是当我添加

#include <Eigen/Dense>

与该项目相关,我遇到了以下错误

1>------ Build started: Project: MatrixPerformanceCompare, Configuration: Debug Win32 ------
1>  Compiling CUDA source file kernel.cu...
1>  
1>  C:\CUDA\Progs\VS\SampleProject\MatrixPerformanceCompare>"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.5\bin\nvcc.exe" -gencode=arch=compute_10,code=\"sm_10,compute_10\" --use-local-env --cl-version 2010 -ccbin "c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin"  -Ic:\CUDA\Progs\VS\SampleProject\MatrixPerformanceCompare\include -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.5\include" -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.5\include"  -G   --keep-dir Debug -maxrregcount=0  --machine 32 --compile -cudart static  -g   -DWIN32 -D_DEBUG -D_CONSOLE -D_MBCS -Xcompiler "/EHsc /W3 /nologo /Od /Zi /RTC1 /MDd  " -o Debug\kernel.cu.obj "C:\CUDA\Progs\VS\SampleProject\MatrixPerformanceCompare\kernel.cu" 
1>c:\cuda\progs\vs\sampleproject\matrixperformancecompare\include\eigen\src/Core/Block.h(102): error : "operator=" has already been declared in the current scope
1>c:\cuda\progs\vs\sampleproject\matrixperformancecompare\include\eigen\src/Core/Ref.h(122): error : "operator=" has already been declared in the current scope
1>c:\cuda\progs\vs\sampleproject\matrixperformancecompare\include\eigen\src/Core/products/Parallelizer.h(20): warning : variable "m_maxThreads" was set but never used
1>c:\cuda\progs\vs\sampleproject\matrixperformancecompare\include\eigen\src/Geometry/RotationBase.h(76): error : function template "Eigen::operator*(const Eigen::EigenBase<OtherDerived> &, const Eigen::Quaternion<_Scalar, _Options> &)" has already been defined
1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\BuildCustomizations\CUDA 5.5.targets(592,9): error MSB3721: The command ""C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.5\bin\nvcc.exe" -gencode=arch=compute_10,code=\"sm_10,compute_10\" --use-local-env --cl-version 2010 -ccbin "c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin"  -Ic:\CUDA\Progs\VS\SampleProject\MatrixPerformanceCompare\include -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.5\include" -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.5\include"  -G   --keep-dir Debug -maxrregcount=0  --machine 32 --compile -cudart static  -g   -DWIN32 -D_DEBUG -D_CONSOLE -D_MBCS -Xcompiler "/EHsc /W3 /nologo /Od /Zi /RTC1 /MDd  " -o Debug\kernel.cu.obj "C:\CUDA\Progs\VS\SampleProject\MatrixPerformanceCompare\kernel.cu"" exited with code 2.
========== Build: 0 succeeded, 1 failed, 1 up-to-date, 0 skipped ==========

我知道这是与定义保护相关的错误,但是Eigen中的那些似乎没问题,而在简单的c ++项目中,具有相同Eigen源的代码编译得很好。 你能帮帮我吗?

1 个答案:

答案 0 :(得分:2)

C ++代码的CUDA前端解析器无法在所有情况下正确解析极其复杂的主机模板定义。它的工作是查看.cu文件中的代码,并尝试拆分必须由GPU工具链编译的代码,这些代码应该传递给主机编译器。已知将Boost和QT标头导入.cu文件时会失败。我打赌Eigen模板会导致同样的问题。

我所知道的唯一解决方案是重构代码,将依赖于模板的主机代码分离到具有.cc扩展名的其他文件。 CUDA前端永远不会看到.cc文件中的任何代码,问题就会消失。实际上,这种代码拆分并不是一个真正的问题,因为无论如何主机模板代码实际上都不能在CUDA GPU代码中使用,最糟糕的是你可能需要一个小的包装函数或额外的抽象级别来保持你的GPU和主机代码分开。