使用NumPy对uint16和uint64阵列求和时没有加速?阵列、NumPy

2023-09-03 11:07:36 作者:我的系统你不配进入i

我必须对相对较小的整数进行大量的运算(加法),我开始考虑哪种数据类型在64位计算机上性能最好。

我确信,将4uint16加在一起将花费与uint64相同的时间,因为ALU只使用1uint64加法器就可以进行4uint16加法。(进位传播意味着这对于单个64位加法器来说不是那么容易工作,但这就是整数SIMD指令的工作方式。)

显然不是这样的:

In [3]: data = np.random.rand(10000)

In [4]: int16 = data.astype(np.uint16)

In [5]: int64 = data.astype(np.uint64)

In [6]: int32 = data.astype(np.uint32)

In [7]: float32 = data.astype(np.float32)

In [8]: float64 = data.astype(np.float64)

In [9]: %timeit int16.sum()
13.4 µs ± 43.3 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

In [10]: %timeit int32.sum()
13.9 µs ± 347 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

In [11]: %timeit int64.sum()
9.33 µs ± 47.8 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

In [12]: %timeit float32.sum()
5.79 µs ± 6.51 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

In [13]: %timeit float64.sum()
6 µs ± 3.54 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
开发技术 Numpy模块

所有int操作都需要相同的时间(比Float操作多),并且没有加速。这是因为NumPy的C实现没有完全优化,还是有一些我不知道的硬件限制?

推荐答案