59 cuda 不同版本__half冲突问题 —— "__half" has no member "x"

 


0 引言


 深度学习中常常用到half类型的半精度浮点数,但是cpu本身是不支持half的,因此需要进行转换。 


1 half - float转换


 参考了某博主的github,链接如下。

https://github.com/ma-xiaodong/float_half_convertion/blob/master/convert.c 

2 half使用中的冲突解决


 (1)冲突描述

提示 "__half" has no member "x". 问题是之前我运行 "./compile"对代码进行编译一直是可以通过的呀,我怀疑是不是有人更改过环境变量,所以编译器链接了其他文件中的 __half类,导致我的程序出错。

(2)定位错误:我到程序中寻找包含__half的头文件,有这样一些

我首先去cuda里找了一波,发现 "cuda_fp16.h"  里边可能定义了half,然后用 locate cuda_fp16.h 找到了如下结果。

有条命令可以直接打开目录很好用。

nautilus /usr/local/cuda-9.0/targets/x86_64-linux/include/cuda_fp16.h

然后我去目录下看了这两个文件里边对__half的定义,发现在cuda8.0里边,有成员x,而在cuda9.0里边,成员为__x,而且是私有成员,这样问题就很清楚了,是版本冲突。解决的办法是将cuda的软链接指向cuda8.0, 命令如下。

cd /usr/local   # 目录切换到系统安装cuda的目录下
stat cuda       # 查看软链接指向哪个版本的cuda
sudo rm -rf cuda   # 删除该软链接
sudo ln -s /usr/local/cuda-8.0 /usr/local/cuda   # 重新指向cuda8.0
stat cuda # 查看软链接是否修改成功

(3)查看结果

成功解决cuda版本冲突问题。

 

posted @ 2019-03-27 15:42  十步一杀2017  阅读(1344)  评论(0编辑  收藏  举报