为什么numpy.float16会影响OpenBlas/Atlas功能?
好的,我知道 float16
不是一种真正的基本数据类型,而是由 Python/numpy 模拟出来的。不过,问题是:既然它存在,而且 Python 允许在数组相乘时使用 numpy.dot()
函数,那为什么 OpenBlas(或者 ATLAS)就不能正常工作呢?我的意思是,虽然乘法可以进行,但并行计算却不行。或者换个说法(我觉得这样更好),为什么 Python/numpy 允许使用 float16
,但我们却无法利用 OpenBlas/ATLAS 提供的高级功能呢?
1 个回答
16
Numpy中的float16
是一种奇怪的、可能有点麻烦的东西。它是一种IEEE 754半精度浮点数,包含1位符号位、5位指数位和10位尾数位。
虽然它是标准的浮点数,但它比较新,使用的人不多。有些图形处理器(GPU)支持它,但大多数中央处理器(CPU)并不常见这种硬件支持。新一些的处理器有指令可以在16位和32位浮点数之间转换,但在数学运算中直接使用16位浮点数的支持并不多。因为这些原因,加上常见的低级语言中缺乏合适的数据类型,16位浮点数的使用速度比32位的要慢。
支持它的工具非常少。通常情况下,16位浮点数被视为一种存储格式,在使用之前会转换成32位浮点数。
一些基准测试结果:
In [60]: r=random.random(1000000).astype('float32')
In [61]: %timeit r*r
1000 loops, best of 3: 435 us per loop
In [62]: r=random.random(1000000).astype('float16')
In [63]: %timeit r*r
100 loops, best of 3: 10.9 ms per loop
作为一般用途,不要把它用于其他目的,除了作为压缩存储。即使如此,也要意识到其中的权衡:
In [72]: array([3001], dtype='float16') - array([3000], dtype='float16')
Out[72]: array([ 0.], dtype=float32)