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

f_f*_*ola 4 python performance numpy atlas openblas

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

DrV*_*DrV 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
Run Code Online (Sandbox Code Playgroud)

作为一般用途,除了压缩存储之外,不要将其用于任何其他用途.甚至在那时意识到妥协:

In [72]: array([3001], dtype='float16') - array([3000], dtype='float16')
Out[72]: array([ 0.], dtype=float32)
Run Code Online (Sandbox Code Playgroud)

  • "因此,16位浮点数不是标准格式".这是错误的.它是IEEE 754 2008 binary16类型,非常标准格式. (2认同)