0 引言


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


1 half - float转换


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

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

2 half使用中的冲突解决


(1)冲突描述

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

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

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

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

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

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

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

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.
stat cuda # 查看软链接是否修改成功

(3)查看结果

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

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

05-26 17:09