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