其他分享
首页 > 其他分享> > c-CUDA和本征成员“已被声明”错误

c-CUDA和本征成员“已被声明”错误

作者:互联网

我只是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源代码的代码可以很好地编译.
你可以帮帮我吗?

解决方法:

C代码的CUDA前端解析器无法在所有情况下正确解析极其复杂的主机模板定义.它的工作是浏览.cu文件中的代码,然后尝试将必须由GPU工具链编译的代码与应传递给主机编译器的代码分开.将Boost和QT标头导入.cu文件时会失败.我打赌Eigen模板会引起同样的问题.

我知道的唯一解决方案是重构您的代码,以将依赖于模板的宿主代码分离到扩展名为.cc的其他文件中. CUDA前端在.cc文件中看不到任何代码,问题消失了.实际上,这种代码拆分实际上不是问题,因为主机模板代码无论如何都不能在CUDA GPU代码内使用,并且在最坏的情况下,您可能需要小的包装函数或附加的抽象级别来保持GPU和主机代码分开.

标签:c,cuda,eigen,visual-studio-2010,nsight
来源: https://codeday.me/bug/20191011/1892352.html