【问题标题】:Why does numpy.float16 break the OpenBlas/Atlas functionalities?为什么 numpy.float16 会破坏 OpenBlas/Atlas 功能?
【发布时间】:2014-07-05 14:31:40
【问题描述】:

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

【问题讨论】:

  • 我观察到scipy.ndimage.gaussian_filter1d(以及使用它的函数)在np.float16 上中断。不确定这种数据类型是如何编码的,但你的问题似乎不是唯一的问题。

标签: python performance numpy atlas openblas


【解决方案1】:

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)

【讨论】:

  • “因此 16 位浮点数不是标准格式”。这是错误的。它是 IEEE 754 2008 binary16 类型,非常标准的格式。
  • 参见docs.scipy.org/doc/numpy/user/basics.types.html,其中明确描述:“符号位,5 位指数,10 位尾数”。
  • 哎呀。我会修改我的答案!谢谢。
  • 感谢修改!
  • @MarkDickinson:把简单的错误信息留在视线内是没有好处的......现在我学到了很多,因为我深入研究了半精度浮点数的背景。所以,我既尴尬(早期的无知)又高兴(新知识)。并感谢你。
猜你喜欢
  • 1970-01-01
  • 2016-08-16
  • 1970-01-01
  • 1970-01-01
  • 2011-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
相关资源
最近更新 更多