arm, cortex-a57
1. 什么是浮点峰值
首先阅读这篇博客了解这个浮点峰值的概念。
浮点峰值那些事儿
2. cortex-a57浮点峰值的计算
这里采用:https://github.com/Mengjintao/gflops_benchmark的code进行测试。
这里其实有几个疑问:
- 为什么要在一个循环里写几条命令
- 硬件的浮点峰值怎么计算呢?
- 跑起来只用了单核,那多核的flops又怎么计算呢?
2.1 为什么要在一个循环里写几条命令
这是单条指令的延迟有关,可以下载Cortex-A57 Software Optimization Guide文档,其中有每条指令的延时。
可以看到FMLA
指令的延时是9/10。这里我们改变每个循环中FMLA
指令的条数来实际测试一下。注意改变#define OP_FLOATS (88)
的值。OP_FLOATS = 2*4*n
; // func2.S 每次循环做 40 次乘法,每条指令处理 4 个 float,共 10 条。
.text
.align 5
.global func2func2:
.loop2:fmla v0.4s, v0.4s, v0.4sfmla v1.4s, v1.4s, v1.4sfmla v2.4s, v2.4s, v2.4sfmla v3.4s, v3.4s, v3.4s// fmla v4.4s, v4.4s, v4.4s// fmla v5.4s, v5.4s, v5.4s// fmla v6.4s, v6.4s, v6.4s// fmla v7.4s, v7.4s, v7.4s// fmla v8.4s, v8.4s, v8.4s// fmla v9.4s, v9.4s, v9.4s// fmla v10.4s, v10.4s, v10.4s// fmla v11.4s, v11.4s, v11.4ssubs x0, x0, #1bne .loop2ret
测试结果:
硬件 | 架构 | 浮点峰值(GFlops) | 备注 |
---|---|---|---|
Jetson Nano | Cortex-A57,armv8a | 11.39 | |
Jetson tx2 | Cortex-A57,armv8a | 16.215759 | |
Jetson tx2 | Cortex-A57,armv8a | 6.479 | 4 |
Jetson tx2 | Cortex-A57,armv8a | 12.91 | 8 |
Jetson tx2 | Cortex-A57,armv8a | 14.468 | 9 |
Jetson tx2 | Cortex-A57,armv8a | 16.186 | 10 |
Jetson tx2 | Cortex-A57,armv8a | 16.197 | 11 |
上面的备注就是单次循环中包含的fmla指令的条数,实测大概a57上FMLA
的延时大概是10
2.2 硬件的浮点峰值怎么计算呢?
按浮点峰值那些事儿的介绍,这里我们是用的FMLA
测的。一条FMLA
指令针对float32的计算量为:4个float32数 ×( 1次乘法 + 1次加法)× cpu的频率 × cpu的核心数。
前面的程序实测的时候,只有一个cpu核心跑起来了。所以这里我们也只计算一个核心的理论峰值。
cpu的主频可以通过lscpu
命令来看,在tx2上的执行结果:
Architecture: aarch64
Byte Order: Little Endian
CPU(s): 6
On-line CPU(s) list: 0-5
Thread(s) per core: 1
Core(s) per socket: 3
Socket(s): 2
Vendor ID: ARM
Model: 3
Model name: Cortex-A57
Stepping: r1p3
CPU max MHz: 2035.2000
CPU min MHz: 345.6000
BogoMIPS: 62.50
L1d cache: 32K
L1i cache: 48K
L2 cache: 2048K
Flags: fp asimd evtstrm aes pmull sha1 sha2 crc32
可以看到单核的最高主频为:2.0352GHZ
单核理论峰值 = 4 × 2 × 2.0352GHZ = 16.2816Gflops,实测和这都相差不大了。
2.3 如何做多核的flops
暂时还没有看到有人做。。。