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版本冲突问题。