ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2019-10-11 12:08:21  阅读:246  来源: 互联网

标签:c cuda eigen visual-studio-2010 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源代码的代码可以很好地编译.
你可以帮帮我吗?

解决方法:

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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有