DragonArray 文档
龙芯 3A6000 基准测试
本文记录 DragonArray 当前在龙芯 3A6000 上的性能快照,不代表 3C5000 的结果。
测试系统
| 原版 NumPy | DragonArray | |
|---|---|---|
| 版本 | 2.5.0.dev0+git20260515.79b0331 |
2.5.0.dev0+dragon.unofficial.1 |
| 源码 | 上游 79b033101a |
当前 2026-08-10 工作树 |
| 运行时 SIMD | LSX baseline | LSX baseline + LASX dispatch |
- CPU:2.0 GHz 龙芯 3A6000
- OS:Linux 5.4.18-167-generic,loongarch64
- 编译器:GCC 15.2.0
- Python:3.13.13
- 基准测试:
bench/loongarch.py --iters 30 - 数组长度:1,000,000 个元素
吞吐量单位为每秒处理的连续数组元素数(百万)。加速比是 DragonArray 吞吐量除以 原版 NumPy 吞吐量。两个版本在同一台机器上使用相同的基准测试输入运行。
汇总
完整测试覆盖 135 个 operation 与 dtype 组合,原始几何平均加速为 1.81×。
| 类别 | 组合数 | 原始几何平均加速 | 加速至少 1.10× 的组合数 |
|---|---|---|---|
| Boolean | 2 | 8.31× | 2 |
float16 |
20 | 2.77× | 9 |
float32 |
27 | 1.61× | 8 |
float64 |
27 | 1.25× | 6 |
| Integer | 59 | 1.86× | 32 |
| 全部 | 135 | 1.81× | 57 |
原始汇总包含基准测试固定的 operation 执行顺序。这台机器上的基本浮点算术对执行 顺序敏感,因此其确认结果在下文单独列出。
当前最大增益
| Operation | Dtype | 原版 NumPy | DragonArray | 加速比 |
|---|---|---|---|---|
arctanh |
float16 |
24.0 | 453.9 | 18.91× |
floor_divide |
int8 |
163.5 | 2675.7 | 16.37× |
mod |
int8 |
173.7 | 2475.5 | 14.25× |
sin |
float16 |
52.4 | 689.3 | 13.16× |
cos |
float16 |
51.4 | 662.0 | 12.88× |
arcsinh |
float16 |
21.1 | 261.2 | 12.38× |
tanh |
float32 |
26.5 | 319.0 | 12.04× |
floor_divide |
int16 |
157.7 | 1827.1 | 11.59× |
log1p |
float16 |
36.1 | 392.4 | 10.87× |
logical_and |
bool |
1044.5 | 11346.8 | 10.86× |
浮点 kernel
下表列出当前测得比原版 NumPy 至少快 1.10× 的浮点 operation 与 dtype 组合。 未列出的 transcendental 组合在本次测试中性能相当。
| Dtype | Operation | 原版 NumPy | DragonArray | 加速比 |
|---|---|---|---|---|
float16 |
arcsinh |
21.1 | 261.2 | 12.38× |
float16 |
arctanh |
24.0 | 453.9 | 18.91× |
float16 |
cbrt |
36.1 | 145.7 | 4.04× |
float16 |
cos |
51.4 | 662.0 | 12.88× |
float16 |
log |
68.0 | 442.1 | 6.50× |
float16 |
log10 |
43.2 | 421.8 | 9.76× |
float16 |
log1p |
36.1 | 392.4 | 10.87× |
float16 |
log2 |
67.8 | 422.7 | 6.24× |
float16 |
sin |
52.4 | 689.3 | 13.16× |
float32 |
arcsin |
95.9 | 194.1 | 2.02× |
float32 |
arctan |
64.2 | 573.1 | 8.93× |
float32 |
arctan2 |
43.5 | 205.7 | 4.73× |
float32 |
cos |
78.1 | 410.5 | 5.26× |
float32 |
sin |
77.4 | 423.4 | 5.47× |
float32 |
tanh |
26.5 | 319.0 | 12.04× |
float64 |
arctan |
45.4 | 207.5 | 4.57× |
float64 |
arctan2 |
24.6 | 80.5 | 3.27× |
float64 |
cbrt |
42.8 | 136.7 | 3.19× |
float64 |
log1p |
63.4 | 262.8 | 4.15× |
float64 |
tanh |
24.0 | 54.8 | 2.28× |
float32 divide 与其他基本算术结果列在一起,因为它在两种基准测试执行顺序下
都经过了检查。
基本浮点算术
下表给出两次确认测试中各匹配轮次的 DragonArray/原版 NumPy 比值中位数。
“按 dtype 分组”会先对一个 dtype 运行全部四个 operation,再切换到下一个 dtype;
“按 operation 分组”会针对每个 operation 交替测试 float32 与 float64。
| Operation | f32 按 dtype 分组 | f32 按 operation 分组 | f64 按 dtype 分组 | f64 按 operation 分组 |
|---|---|---|---|---|
add |
0.99× | 0.83× | 0.99× | 0.71× |
subtract |
0.99× | 1.05× | 1.00× | 0.73× |
multiply |
1.00× | 1.05× | 1.01× | 0.73× |
divide |
1.91× | 1.92× | 1.13× | 0.78× |
float32 divide 是其中稳定的结果:在两种顺序下都保持约 1.9× 的加速。
其他算术数据应视为对 working set 和执行顺序敏感的测量值,而不是稳定的性能退化
或增益。
Integer、boolean 与 sort 重点结果
LASX integer division 在不超过 32-bit 的宽度上最有效。所有实测宽度的 integer modulo 都有所加速。
| Operation | Dtype | 原版 NumPy | DragonArray | 加速比 |
|---|---|---|---|---|
floor_divide |
int8 |
163.5 | 2675.7 | 16.37× |
floor_divide |
int16 |
157.7 | 1827.1 | 11.59× |
floor_divide |
int32 |
165.3 | 1114.8 | 6.74× |
floor_divide |
uint8 |
408.9 | 2425.8 | 5.93× |
floor_divide |
uint16 |
286.2 | 1744.9 | 6.10× |
floor_divide |
uint32 |
189.9 | 1117.4 | 5.88× |
mod |
int8 |
173.7 | 2475.5 | 14.25× |
mod |
int16 |
168.3 | 1641.7 | 9.76× |
mod |
int32 |
157.1 | 1052.7 | 6.70× |
mod |
int64 |
102.8 | 527.0 | 5.13× |
logical_and |
bool |
1044.5 | 11346.8 | 10.86× |
logical_not |
bool |
1866.3 | 11875.2 | 6.36× |
sort |
float32 |
11.0 | 74.9 | 6.81× |
sort |
float64 |
11.0 | 36.8 | 3.35× |
sort |
int16 |
14.7 | 93.6 | 6.37× |
sort |
int32 |
14.8 | 80.3 | 5.43× |
sort |
int64 |
15.6 | 41.8 | 2.68× |
在八种有符号和无符号 integer 宽度上,integer max reduction 的加速为
1.28× 至 2.00×。在这个数组长度下,integer add、multiply、comparison 和 argmax
总体接近原版性能。
复现测试
在一台没有其他负载的 3A6000 上连续运行两个版本:
PYTHONPATH=<stock-install> \
python3 bench/loongarch.py --iters 30 > stock.txt
PYTHONPATH=<dragon-install> \
python3 bench/loongarch.py --iters 30 > dragon.txt
逐行比较 contiguous-throughput 列。基准测试会在每个计时循环前运行三次预热。 sort 使用 10 次计时迭代,其他 operation 使用 30 次。
2026-08-10 的准确测试文件如下:
