5

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

4

1 回答 1

16

Numpyfloat16是一种奇怪且可能是邪恶的野兽。它是一个 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)
于 2014-07-05T20:38:09.223 回答