arm, cortex-a57

1. 什么是浮点峰值

首先阅读这篇博客了解这个浮点峰值的概念。

浮点峰值那些事儿

2. cortex-a57浮点峰值的计算

这里采用:https://github.com/Mengjintao/gflops_benchmark的code进行测试。

这里其实有几个疑问:

  • 为什么要在一个循环里写几条命令
  • 硬件的浮点峰值怎么计算呢?
  • 跑起来只用了单核,那多核的flops又怎么计算呢?

2.1 为什么要在一个循环里写几条命令

这是单条指令的延迟有关,可以下载Cortex-A57 Software Optimization Guide文档,其中有每条指令的延时。

【ARM】——Cortex-A57浮点峰值的计算_v8
可以看到FMLA指令的延时是9/10。这里我们改变每个循环中FMLA指令的条数来实际测试一下。注意改变#define OP_FLOATS (88)的值。OP_FLOATS = 2*4*n

; // func2.S 每次循环做 40 次乘法,每条指令处理 4 个 float,共 10 条。
.text
.align 5
.global func2

func2:
.loop2:
    fmla v0.4s, v0.4s, v0.4s
    fmla v1.4s, v1.4s, v1.4s
    fmla v2.4s, v2.4s, v2.4s
    fmla 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.4s


    subs x0, x0, #1
    bne .loop2
    ret

测试结果:

硬件 架构 浮点峰值(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核心跑起来了。所以这里我们也只计算一个核心的理论峰值。
【ARM】——Cortex-A57浮点峰值的计算_4s_02
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

暂时还没有看到有人做。。。