在使用numpy 1.12.0的基准测试中,使用float32
ndarrays
计算点积比其他数据类型快得多:
In [3]: f16 = np.random.random((500000, 128)).astype('float16')
In [4]: f32 = np.random.random((500000, 128)).astype('float32')
In [5]: uint = np.random.randint(1, 60000, (500000, 128)).astype('uint16')
In [7]: %timeit np.einsum('ij,ij->i', f16, f16)
1 loop, best of 3: 320 ms per loop
In [8]: %timeit np.einsum('ij,ij->i', f32, f32)
The slowest run took 4.88 times longer than the fastest. This could mean that an intermediate result is being cached.
10 loops, best of 3: 19 ms per loop
In [9]: %timeit np.einsum('ij,ij->i', uint, uint)
10 loops, best of 3: 43.5 ms per loop
我尝试过分析einsum
,但它只是将所有计算委托给C函数,因此我不知道这种性能差异的主要原因是什么。< / p>
答案 0 :(得分:2)
我对您的f16
和f32
数组进行的测试表明,f16
对于所有计算来说都慢了5-10倍。只有在执行像数组copy
这样的字节级操作时,float16的更紧凑性才会显示出任何速度优势。
https://gcc.gnu.org/onlinedocs/gcc/Half-Precision.html
gcc
文档中的部分是半浮点数,fp16。使用正确的处理器和正确的编译器开关,可以以加速这些计算的方式安装numpy。我们还必须检查numpy
.h
文件是否有任何特殊处理半浮动的规定。
早期的问题,可能足以成为重复的引用