为什么numpy.float16打破了OpenBlas / Atlas的功能?

时间:2014-07-05 14:31:40

标签: python performance numpy atlas openblas

好的,我知道float16不是真正的原始类型,但它是由Python / numpy模拟的。但是,问题是:如果存在且Python允许使用numpy.dot()函数在数组乘法中使用它,为什么OpenBlas(或ATLAS)不能正常工作?我的意思是,乘法有效,但并行计算没有。或者,再次,以不同的方式(在我看来更好),为什么Python / numpy允许使用float16如果我们不能利用OpenBlas / ATLAS提供的高级功能?

1 个答案:

答案 0 :(得分:14)

Numpy float16是一个奇怪的,可能是邪恶的野兽。它是IEEE 754半精度浮点数,带有1位符号,5位指数和10位尾数。

虽然它是一个标准的浮点数,但它是一个新手,并没有广泛使用。有些GPU支持它,但硬件支持在CPU中并不常见。较新的处理器具有在16位和32位浮点之间进行转换的命令,但不支持在数学运算中直接使用它。由于这个原因,并且由于普通低级语言中缺少合适的数据类型,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)