本文翻译自
https://community.arm.com/developer/ip-products/processors/b/processors-ip-blog/posts/arm-architecture-developments-armv8-6-a
原作者:Nigel Stephens 2019年9月25日
译者: Zenon Xiu
Arm 构架持续进化中以满足我们生态伙伴的需求。这篇博文介绍了Armv8.6-A引进的一些新功能的概况。
这些增强构架功能提供了更高效的处理和更好地使能新领域应用,比如神经网络和机器学习。通用矩阵乘(GEMM)和BFloat16为这些领域提供了显著的提升。我们还会介绍增强的指针鉴权(Pointer authentication)安全功能。完整的指令集和系统寄存器信息会在我们的技术网站提供。完整包含Armv8.6-A和之前构架的Armv8-A 构架参考手册(ArmARM)将在下一年(2020)公布。 XML将会很快发布,我们会提供相应链接。((译者:这篇翻译发布时,XML文档已经发布,链接为 https://developer.arm.com/architectures/cpu-architecture/a-profile/exploration-tools ,ArmARM也已经包含了armv8.6-A扩展,https://developer.arm.com/products/architecture/cpu-architecture/a-profile)
之前A-profile构架更新的细节可以在这里找到:Armv8.1-A, Armv8.2-A, Armv8.3-A, Armv8.4-A, and Armv8.5-A.
矩阵乘是神经网络的Convolution Layer的关键部分。 Weights放在一个矩阵,activations 放在另一个矩阵。
图1 weights和activation的矩阵乘, Arm Compute Library Layout
为了做矩阵乘,一个简单的算法通常使用3个嵌套循环,每次计算一个输出。
总共的数据取需要:2*M*N*K
Armv8.6-A在SVE和NEON里引进了新的矩阵乘指令。这通过减少内存访问的次数优化这个过程。这是通过一次计算多个元素来实现的,比如
图2 一次计算2x2个元素
这里我们每次从A和B取两个操作数(2xfetches)但是每次计算4个结果(一次loop 4次计算;4倍减少循环次数)。总的来说,相较于每次计算一个元素,数据取的数量减半。
区域越大好处越多,比如 4x4的数组,每个循环深度需要8个操作数,但是进行16个乘。
图3 计算4x4 块的结果
NEON和SVE里加入BF16和有符号/无符号 8-bit整型矩阵乘指令。SVE额外加入了对单精度和双精度矩阵乘的支持。
BFloat16(BF16)是最近特别针对神经网络高性能处理引进的浮点数格式。Armv8.6-A增加了利用BF16浮点数格式加速特定运算的指令。
更多有关arm BF16支持的信息可以在这个神经网络的帖子找到。
从Armv7-A开始引入虚拟化以来,arm持续改进虚拟化的支持。一个虚拟化关键的支持是trap虚拟机执行的一些操作。目的是为了虚拟化这些操作或是让hypervisor充当Guest OS的哨兵。
Armv8.6-A改进了第二个使用场景的支持(让hypervisor当着Guest OS的哨兵), 通过细化的trap控制,包括各个系统寄存器,来实现。
Wait-for-Event (WFE)指令让在等待一个事件,比如等一个锁释放,的CPU进入低功耗状态,当WFE在一个虚拟机中执行时,hypervisor通常trap这个WFE指令,让CPU运行其他的workload.
通常wait-for-event的事件会比较快到来,意味着推迟trap WFE可能有利于性能。Arm的研究表明引进延迟可以提高一个未超载系统的吞吐量。为了支持这个功能,Armv8.6-A引进了可配置的trap延迟时间的可选功能。
从Armv7-A开始,arm提供了标准的定时器框架,Generic Timer构架。Armv8.6-A引进了一序列Generic Timer的改进。
Generic Timer提供了一个CNTFREQ_EL0寄存器,用来报告system count的频率,但是给予系统设计选择其频率值的自由。这可能造成在不同频率系统上软件迁移workload的挑战。Armv8.6-A将这个频率标准化为1GHz, 这提供了一致的时间基础。 1GHz也远比Armv8.6-A之前构架的指导频率(译者:1-50MHz)高,因此可以提供更高的精度。
另外,增加了自同步(self-synchronizing)的物理和虚拟system count寄存器,这可以简化代码序列,比如,为了保证在一个内存操作之后的读当前count值的代码。
在Armv8.3-A和Armv8.5-A中,我们引进了指针鉴权(Pointer Authentication, PAC)和 Branch Target Indicators (BTI)的支持。它们一起可以帮助抵抗如ROP和JOP攻击((Return- and Jump-Oriented Programming))技术,明显减少系统中可用的gadget数目。
Armv8.6-A在此基础上改进了指针鉴权(Pointer Authentication)的支持。
在Armv8.3-A中,当鉴权失败时,返回一个无效地址。在很多情况下,这个地址在鉴权指令(AUT*)之后很快会被使用,或做跳转或数据访问。使用这样的指针会导致一个异常。
在有限的情况下,AUT*指令返回的地址不会马上使用,Armv8.6-A引入了2个功能来处理这些情况。
EnhancedPAC2改变了增加PAC到指针的方式。在Armv8.3-A 中, PAC替换部分指针高bits。而在EnhancedPAC2中,PAC是与指针的高bits进行XOR操作。
当一个攻击者可以获取AUT*指令返回的地址时,他们可能采用重复猜测的方式得到这个地址的正确的PAC。
为了对付这种攻击,在Armv8.6-A中加入了一个新扩展(FPAC )。 如果有FPAC功能,当PAC不正确时,AUT*指令会导致异常,从而阻止攻击者重复尝试猜测一个地址的正确PAC。
Armv8.6-A也包含一些小功能:
这篇博文简要介绍了Armv8-A构架中Armv8.6-A 引进的最新功能。这些功能提供了未来CPU在机器学习神经网络,虚拟化这些领域的增强,和改进处理效能的矩阵乘和改进的安全功能。下一步是和我们包括Linaro在内的生态伙伴一起使能开源软件,保证当包含这些功能的硬件可用时,软件已经准备好了。
获取更多细节,请访问我们的开发者网站。
关于通用定时器固定运行在1GHz频率有些疑问:
这是否意味着它不能切换到更低的频率?
或者1GHz仅仅代表基频,系统计数器仍然可以切换到较低的频率,如50MHz, 100MHz等?