您的位置:首页 > 其它

VS2019上配置CUDA10.1+Eigen3.3.7错误解决

2020-02-12 07:22 375 查看

最近研究CUDA,想要实现在核函数中使用Eigen数学库的一部分函数(Eigen3.3中的一部分函数可以被用于CUDA核函数)
这里用到了两套不同的环境分别是VS2017+CUDA10.0+Eigen3.3.6和VS2019+CUDA10.1+Eigen3.3.7,分别遇到了相同的编译错误,解决方法也是一致的。因为涉及到的这几个库版本都比较新,所以网上的相关教程和解决遇到的问题的方法都比较少。所以写下这篇文章来与时俱进。

使用nvcc编译带有

#include <Eigen/Eigen>

的.cu文件,使用 compute_61,sm_61 进行编译,遇到了下面这个问题
G:\VS support\Eigen-3.3.6\include\eigen3\Eigen\src/Core/arch/CUDA/Half.h(212): error : more than one instance of overloaded function “__hadd” matches the argument list:

经过搜索,这个问题已经存在了有一定时间,最早的bug report在这里
http://eigen.tuxfamily.org/bz/show_bug.cgi?id=1526
下面也给出了解决方法
https://bitbucket.org/eigen/eigen/commits/52517c8764ad/
具体的改正方法很简单,找到
Eigen/src/Core/arch/CUDA/Half.h文件,从第212行开始,对于里面的两个函数进行如下改变

EIGEN_STRONG_INLINE __device__ half operator + (const half& a, const half& b) {
+#if defined(EIGEN_CUDACC_VER) && EIGEN_CUDACC_VER >= 90000
+  return __hadd(::__half(a), ::__half(b));
+#else
return __hadd(a, b);
+#endif
}
...
...

EIGEN_STRONG_INLINE __device__ half operator / (const half& a, const half& b) {
+#if defined(EIGEN_CUDACC_VER) && EIGEN_CUDACC_VER >= 90000
+  return __hdiv(a, b);
+#else
float num = __half2float(a);
float denom = __half2float(b);
return __float2half(num / denom);
+#endif

}

重新编译,发现新的问题
1>G:\VS support\Eigen-3.3.6_try_to_fix_bug\include\eigen3\Eigen\src/SVD/JacobiSVD.h(614): error C2244: “Eigen::JacobiSVD<MatrixType,QRPreconditioner>::allocate”: 无法将函数定义与现有的声明匹配

1>G:\VS support\Eigen-3.3.6_try_to_fix_bug\include\eigen3\Eigen\src/SVD/BDCSVD.h(216): error C2244: “Eigen::BDCSVD<_MatrixType>::allocate”: 无法将函数定义与现有的声明匹配
等若干相同问题

经过了很长时间的检索,终于在互联网的某个犄角旮旯找到了解决方案。这个解决办法出自另外一个bug report
http://eigen.tuxfamily.org/bz/show_bug.cgi?id=1412
很有意思的事情是这个问题是在两年以前在VS2015+CUDA8.0+Eigen3.3.0/3.3.3环境上就出现的错误,虽然下面回复中给出了问题的解决方案,但是竟然也没有把相应的代码添加到后续的release版本中。依据根据发帖子的经验,这个问题
“can be fixed by changing the definitions to use Eigen::Index instead of Index (JacobiSVD and BDCSVD)”
如果在报错的头文件里找到对应的函数声明,就能够明白具体发生了怎样的改换,这里就不再赘述了。

希望这篇完整能够对其他网友有所帮助。

  • 点赞
  • 收藏
  • 分享
  • 文章举报
YINTAIRAN 发布了2 篇原创文章 · 获赞 0 · 访问量 707 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐