5

float16わかりました、本当のプリミティブ型ではないことはわかっていますが、Python/numpy によってシミュレートされています。ただし、問題は、それが存在し、Python が関数を使用して配列の乗算でそれを使用できる場合、numpy.dot()OpenBlas (または ATLAS) が適切に機能しないのはなぜですか? つまり、乗算は機能しますが、並列計算は機能しません。float16または、別の方法で (私の意見ではより良い)、 OpenBlas/ATLAS が提供する高度な機能を活用できないのに、なぜ Python/numpy が使用を許可するのでしょうか?

4

1 に答える 1

16

Numpyfloat16は奇妙で、おそらく邪悪な獣です。これは、符号が 1 ビット、指数が 5 ビット、仮数が 10 ビットの IEEE 754 半精度浮動小数点数です。

これは標準の浮動小数点数ですが、新しく登場したものであり、広く使用されているわけではありません。一部の GPU はそれをサポートしていますが、ハードウェアのサポートは CPU では一般的ではありません。新しいプロセッサには、16 ビットと 32 ビットの浮動小数点数を変換するコマンドがありますが、数学演算で直接使用することはサポートされていません。このため、また一般的な下位レベルの言語には適切なデータ型がないため、16 ビット float は 32 ビットの float よりも使用が遅くなります。

それをサポートするツールはごくわずかです。通常、16 ビット float はストレージ形式と見なされ、使用前に 32 ビット float に変換されます。

いくつかのベンチマーク:

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 に答える