You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

小宽度整数数组计算更快的原因及不同位宽性能差异解析

小宽度整数数组计算速度差异的原因解析

问题背景

为什么小宽度整数数组的计算速度更快?为什么8位整数数组的计算速度比16位整数数组快约4倍,而16位整数数组仅比32位快约2倍,32位整数数组也仅比64位快约2倍?

测试代码与结果

import numpy as np

np.random.seed(200)
arr_int8 = np.array(np.random.randint(10, size=int(1e8)), dtype=np.int8)

np.random.seed(200)
arr_int16 = np.array(np.random.randint(10, size=int(1e8)), dtype=np.int16)

np.random.seed(200)
arr_int32 = np.array(np.random.randint(10, size=int(1e8)), dtype=np.int32)

np.random.seed(200)
arr_int64 = np.array(np.random.randint(10, size=int(1e8)), dtype=np.int64)

%%timeit
arr_int8_mult = arr_int8*7
# 28.5 ms ± 4.14 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

%%timeit
arr_int16_mult = arr_int16*7
# 124 ms ± 2.11 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

%%timeit
arr_int32_mult = arr_int32*7
# 250 ms ± 2.96 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

%%timeit
arr_int64_mult = arr_int64*7
# 533 ms ± 29.9 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

某次测试arr_int8_mult时得到提示:

最慢的运行时间是最快的5.97倍,这可能意味着中间结果被缓存了。

疑问点:为何从32位切换到16位会有性能提升,从16位切换到8位提升更明显?猜测固定宽度寄存器可容纳更多小宽度整数,但无法解释8位整数为何有超出预期2倍的性能表现。是因为结果被缓存了吗?性能提升稳定在约4倍、2倍、2倍,背后必然存在原因。

测试环境:x86-64架构Intel i5-5250U CPU(Broadwell,3MiB L3缓存),8GB内存,NumPy 1.24.3,Python 3.11.4,MacOS Monterey 12.6.7。

核心原因解析

1. 内存带宽与数据密度的影响

数组的内存占用随位宽线性增长:1亿个元素的情况下,int8数组仅占100MB,int16为200MB,int32为400MB,int64为800MB。由于你的CPU L3缓存仅3MiB,远小于数组大小,计算时数据需从主存加载。主存带宽固定,位宽越小,单位时间内能加载的元素数量越多:

  • int8的元素密度是int16的2倍,int16是int32的2倍,int32是int64的2倍。这直接决定了内存加载阶段的效率差异。

2. SIMD指令的并行放大效应

你的Broadwell架构CPU支持AVX2指令集,其寄存器宽度为256位(32字节),单条指令可同时处理的元素数量随位宽缩小而翻倍:

  • 256位寄存器可容纳32个int8元素、16个int16元素、8个int32元素、4个int64元素。
  • 对于int8,内存加载效率(2倍)+ SIMD并行处理能力(2倍)形成叠加效应,最终带来比int16快4倍的性能提升;而int16到int32、int32到int64的阶段,内存效率和SIMD并行的提升倍数一致(均为2倍),但受限于CPU指令执行的吞吐量等因素的综合影响,最终表现为约2倍的性能差。

3. 缓存的影响

测试中出现的缓存提示仅影响单次运行的波动(首次加载数据时较慢),但你测试的是多次运行的平均值,且性能差异稳定,说明缓存不是核心原因——整体的倍数关系由内存带宽和SIMD并行能力共同决定。

总结

  • int8 vs int16:内存密度提升2倍 + SIMD并行能力提升2倍,叠加后带来约4倍的性能提升
  • int16 vs int32 / int32 vs int64:内存密度与SIMD并行能力均提升2倍,但受限于CPU指令执行的吞吐量等因素,最终表现为约2倍的性能提升

内容的提问来源于stack exchange,提问作者Avantgarde

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 17:05:42