Chapter15 The Future of the Architecture

1999年10月,ARM开始考虑未来的架构方向,最终演变为ARMv6,并首次应用于名为ARM1136J-S的新产品中。在这个时候,ARM已经设计了许多不同应用的方案,并且需要评估每个方案的未来需求,以及ARM将来可能用于的新应用领域。
随着系统级芯片设计变得越来越复杂,ARM处理器在拥有多个处理单元和子系统的系统中成为中央处理器。特别是便携式和移动计算市场为ARM带来了新的软件和性能挑战。需要解决的问题包括便携设备的数字信号处理(DSP)和视频性能,混合大小端系统(如TCP/IP)的互操作,以及多处理环境中高效的同步。
ARM面临的挑战是要满足所有这些市场需求,并且在计算效率(每瓦的计算能力)方面保持业内的竞争优势。
本章介绍了ARMv6架构中的组件,这些组件是ARM引入的用于解决市场需求的,包括增强的DSP支持和多处理环境支持。该章节还介绍了第一款高性能的ARMv6实现,并且除了ARMv6技术外,还介绍了ARM的最新技术之一——TrustZone。
15.1 Advanced DSP and SIMD Support in ARMv6
在ARMv6项目的早期阶段,ARM考虑如何改进架构中的DSP和媒体处理能力,超越第3.7节中描述的ARMv5E扩展。这项工作与ARM1136J-S工程团队密切合作,该团队正在为产品开发微架构的早期阶段。SIMD(单指令多数据)是一种常用的技术,用于获得相当大的数据并行性,并且在DSP、视频和图形处理算法中特别有效。SIMD对于高代码密度和低功耗非常有吸引力,因为执行的指令数量(因此也是内存系统访问)较少。这种效率的代价是需要以特定的数据块模式计算,从而降低了灵活性;然而,在许多图像和信号处理算法中,这种方法非常有效。
采用了标准的ARM设计理念,即计算效率非常高且功耗非常低,ARM提出了一种简单而优雅的方法,将现有的ARM 32位数据通路切割成四个8位和两个16位切片。与许多现有的SIMD架构不同,这种方法允许将SIMD添加到基础ARM架构中,几乎不增加额外的硬件成本。
ARMv6架构包括这种“轻量级”SIMD方法,几乎不增加额外的复杂性(门数),因此也不增加功耗。同时,新的指令可以将某些算法的处理吞吐量提高一倍(对于16位数据)或四倍(对于8位数据)。与ARM指令集架构中的大多数操作一样,所有这些新的指令都是有条件地执行,如第2.2.6节所述。
您可以在附录A的指令集表中找到所有ARMv6指令的完整描述。
15.1.1 SIMD Arithmetic Operations
表15.1显示了8位SIMD操作的摘要。每个字节的结果是通过对源操作数的每个相应字节切片进行算术运算得到的。

这些8位操作的结果可能需要表示多达9位,具体取决于使用的特定指令,可能会导致环绕或饱和发生。
除了8位SIMD操作外,还有广泛的双16位操作,如表15.2所示。每个半字(16位)的结果是通过对源操作数的每个相应16位切片进行算术运算得到的。
结果可能需要存储17位,在这种情况下,可以使用饱和版本的指令来使其在16位有符号结果范围内环绕或饱和。
SIMD指令的操作数在源寄存器中不总是以正确的顺序找到;为了提高处理这些情况的效率,存在能够交换一个操作数寄存器中的16位字的16位SIMD操作。这些操作在处理在内存中以不同方式对齐的半字时提供了很大的灵活性,并且在处理打包到32位寄存器中的16位复数对时特别有用。如表15.3所示,这些操作有带符号、无符号、饱和带符号和饱和无符号的版本。

指令助记符中的X表示在应用操作之前将寄存器Rm中的两个半字进行交换,以便进行以下操作:
Rd[15:0] = Rn[15:0] - Rm[31:16]
Rd[31:16] = Rn[31:16] + Rm[15:0]
引入SIMD操作意味着现在需要一种显示每个SIMD切片通过数据通路的溢出或进位的方式。cpsr寄存器最初在第2.2.5节中描述时被修改,添加了四个额外的标志位来表示数据通路中的每个8位切片。带有GE位的新修改后的cpsr寄存器如图15.1和表15.4所示。每个GE位的功能是数据通路中每个切片的“大于等于”标志。

操作系统已经在上下文切换时保存了cpsr寄存器。在cpsr寄存器中添加这些位对于操作系统对体系结构的支持几乎没有影响。
除了对SIMD数据切片进行基本算术操作外,还需要进行一些操作,允许在数据通路中选择单个数据元素并形成这些元素的新组合。选择指令SEL可以根据相关的GE标志独立地从一个源寄存器Rn或另一个源寄存器Rm中选择每个8位字段。

SEL Rd, Rn, Rm
Rd[31:24] = GE[3] ? Rn[31:24] : Rm[31:24]
Rd[23:16] = GE[2] ? Rn[23:16] : Rm[23:16]
Rd[15:08] = GE[1] ? Rn[15:08] : Rm[15:08]
Rd[07:00] = GE[0] ? Rn[07:00] : Rm[07:00]

这些指令与其他SIMD操作一起,可以非常有效地实现Viterbi算法的核心,该算法在通信系统中广泛用于符号恢复。由于Viterbi算法本质上是一种统计最大似然选择算法,因此它也被用于语音和手写识别引擎等领域。Viterbi的核心是一种通常称为加法-比较-选择(ACS)的操作,在许多DSP处理器中都有定制的ACS指令。通过其并行(SIMD)的加法、减法(可用于比较)和选择指令,ARMv6可以实现极为高效的加法-比较-选择操作:

ADD8 Rp1, Rs1, Rb1 ; 路径1 = 状态1 + 分支1(度量更新)
ADD8 Rp2, Rs2, Rb2 ; 路径2 = 状态2 + 分支2(度量更新)
USUB8 Rt, Rp1, Rp2 ; 比较度量值 - 设置SIMD标志
SEL Rd, Rp2, Rp1 ; 选择最佳(最小)度量值

这个内核以并行方式在四条路径上执行ACS操作,并在ARM1136J-S上总共需要4个周期。对于使用ARMv5TE指令集编码的相同序列,必须串行执行每个操作,至少需要16个周期。因此,对于8位度量值,ARM1136J-S上的加法-比较-选择函数速度提高了四倍。
15.1.2 Packing Instructions
ARMv6架构包括一组新的打包指令,如表15.5所示,用于从不同源寄存器的16位值对构建新的32位打包数据。第二个操作数可以选择性地进行移位。打包指令特别适用于配对16位值,以便您可以利用之前描述的16位SIMD处理指令。

15.1.3 Complex Arithmetic Support
复数运算在通信信号处理中常被使用,尤其是在变换算法的实现中,比如在第8章中描述的快速傅里叶变换。该章节中讨论的大部分实现细节涉及使用ARMv4或ARMv5E指令集高效实现复数乘法。
ARMv6添加了用于加速复数乘法的新乘法指令,如表15.6所示。如果指定了X后缀,这两个操作都可以选择性地交换源操作数Rs的两个16位半部分的顺序。
示例15.1
在此示例中,Ra和Rb保存具有16位系数的复数,其中实部打包在寄存器的较低半部分,虚部打包在较高半部分。
我们将Ra和Rb相乘,得到一个新的复数Rc。代码假设16位值表示Q15小数部分。以下是针对ARMv6的代码:

SMUSD Rt, Ra, Rb ; real*real–imag*imag at Q30
SMUADX Rc, Ra, Rb ; real*imag+imag*real at Q30
QADD Rt, Rt, Rt ; convert to Q31 & saturate
QADD Rc, Rc, Rc ; convert to Q31 & saturate
PKHTB Rc, Rc, Rt, ASR #16 ; pack results

Compare this with an ARMv5TE implementation:

SMULBB Rc, Ra, Rb ; real*real
SMULTT Rt, Ra, Rb ; imag*imag
QSUB Rt, Rc, Rt ; real*real-imag*imag at Q30
SMULTB Rc, Ra, Rb ; imag*real
SMLABT Rc, Ra, Rb ; + real*imag at Q30
QADD Rt, Rt, Rt ; convert to Q31 & saturate
QADD Rc, Rc, Rc ; convert to Q31 & saturate
MOV Rc, Rc, LSR #16
MOV Rt, Rt, LSR #16
ORR Rt, Rt, Rc, LSL#16 ; pack results

对于ARMv5E而言,需要10个周期,而对于ARMv6而言,只需要5个周期。很明显,对于任何进行非常密集的复杂数学运算的算法,复数乘法的性能可以提高两倍。
15.1.4 Saturation Instructions
饱和算术首次在ARMv5TE架构中引入了E扩展,该扩展是与ARM966E和ARM946E产品一起推出的。ARMv6进一步提供了可以操作32位字和16位半字的个别和更灵活的饱和指令。除了表15.7中显示的这些指令之外,还有已在第15.1.1节中描述的新的饱和算术SIMD操作。

需要注意的是,在这些饱和操作的32位版本中,可以对源寄存器Rm进行可选算术移位,以便在饱和之前进行缩放,从而在同一条指令中完成。
15.1.5 Sum of Absolute Differences Instructions
这两个新指令可能是ARMv6架构中最具应用特定性的指令-USAD8和USADA8。它们用于计算八位值之间的绝对差值,在运动视频压缩算法(如MPEG或H.263)中特别有用,包括通过使用许多绝对差值操作比较块来测量运动的运动估计算法(见图15.2)。

表15.8列出了这些指令。

要比较图像p1中坐标为(x, y)的N×N正方形与N×N正方形p2,我们计算绝对差值的累加和:

要使用新的指令来实现这一点,可以使用以下序列来计算四个像素的绝对差值累加和:

LDR p1,[p1Ptr],#4 ; 从p1加载4个像素
LDR p2,[p2Ptr],#4 ; 从p2加载4个像素
;延迟槽
;延迟槽
USADA8 acc, p1, p2 ; 累加绝对差

这种算法与ARMv5TE的实现相比具有巨大的性能优势。仅八位SIMD就可以提高四倍的性能。此外,USADA8操作还包括累加操作。通常在循环之前,使用USAD8操作来进行设置以便开始时存在累加值。
15.1.6 Dual 16-Bit Multiply Instructions
ARMv5TE为ARM引入了相当可观的DSP性能,但ARMv6进一步提升了性能。ARMv6的实现(如ARM1136J)具有双16×16乘法能力,与许多高端专用DSP设备相当。表15.9列出了这些指令。

我们演示了在点积内循环中使用SMLAD作为有符号双乘法的用法:

MOV R0, #0 ; 清零累加器
Loop
LDMIA R2!,{R4,R5,R6,R7} ; 加载8个16位数据项
LDMIA R1!,{R8,R9,R10,R11} ; 加载8个16位系数
SUBS R3,R3,#8 ; 循环计数器减8
SMLAD R0,R4,R8,R0 ; 两次乘法累加
SMLAD R0,R5,R9,R0
SMLAD R0,R6,R10,R0
SMLAD R0,R7,R11,R0
BGT Loop ; 如果还有系数,则继续循环

该循环在不使用任何数据阻塞技术的情况下,在10个周期内完成了8次16×16乘法累加。如果一组点积的操作数存储在寄存器中,那么性能接近每个周期的真正双乘法。
15.1.7 Most Significant Word Multiplies
ARMv5TE增加了广泛用于控制、通信等各种DSP算法中的算术操作,并且这些算法旨在使用Q15数据格式。然而,在音频处理应用中,通常16位处理无法描述信号的质量。在这些情况下,通常使用32位值,而ARMv6则添加了一些新的乘法指令,可对Q31格式的值进行操作。 (请回忆第8章中对Q格式算术的详细描述)。这些新指令列在表15.10中。

助记符中的可选{R}允许在生成上32位之前,将固定常量0x80000000添加到64位乘积中。这允许对结果进行有偏舍入。
15.1.8 Cryptographic Multiplication Extensions
在一些密码算法中,非常长的乘法很常见。为了最大化它们的吞吐量,已经添加了一个新的64 + 32 × 32 → 64乘累加操作,以补充已经存在的32 × 32乘法操作UMULL(请参阅表15.11)。

这里是一个使用新指令非常高效的64位×64位乘法的示例:
15.2 System and Multiprocessor Support Additions to ARMv6
随着系统越来越复杂,它们将包含多个处理器和处理引擎。这些引擎可能共享不同的内存视图,甚至使用不同的字节顺序(endianness)。为了支持这些系统中的通信,ARMv6添加了对混合字节序系统的支持、快速异常处理和新的同步原语。
15.2.1 Mixed-Endianness Support
传统上,ARM架构对内存具有小端视图,并且可以在复位时切换到大端模式。这个大端模式将内存系统设置为大端顺序的指令和数据。
正如本章介绍中提到的,ARM芯片已经集成到非常复杂的SoC设备中,处理混合字节序,并且通常在软件中处理小端和大端数据。ARMv6添加了一条新指令来设置大代码序列的数据字节序(请参见表15.12),并且还添加了一些单独的操作指令,以增加处理混合字节序环境的效率。

endian_specifier可以是BE表示大端,或LE表示小端。当程序执行特定字节序数据的操作时,通常会使用SETEND。图15.3显示了单个字节操作指令。

15.2.2 Exception Processing
在操作系统中,将中断或异常的返回状态保存在堆栈上是很常见的。ARMv6添加了表15.13中的指令,以提高这个操作的效率,这在中断/调度驱动的系统中可能非常频繁发生。

15.2.3 Multiprocessing Synchronization Primitives
随着系统级芯片(SoC)架构变得越来越复杂,ARM核心现在常常出现在具有许多处理单元并竞争共享资源的设备中。ARM架构一直以来都有SWP指令用于实现信号量,以确保在这种环境中的一致性。然而,随着SoC变得更加复杂,SWP的某些方面在某些情况下会导致性能瓶颈。回想一下,SWP基本上是一个“阻塞”原语,它锁定了处理器的外部总线,并且使用大部分带宽来等待资源被释放。从这个意义上说,SWP指令被认为是“悲观”的,因为在SWP返回已释放的资源之前,无法进行任何计算。

为了解决这个问题,ARMv6架构添加了新的LDREX和STREX指令(加载和存储独占)。这些指令(表15.14)在使用上非常简单,并通过在内存系统中引入系统监视器来实现。LDREX乐观地将一个值从内存加载到寄存器中,假设在我们处理它的过程中不会有其他内容改变内存中的该值。STREX将一个值存回内存,并返回一个指示,用于判断在原始的LDREX操作和此存储之间内存中的值是否发生了变化。通过这种方式,原语是“乐观”的,即使某个外部设备也可能修改该值,您仍然可以继续处理使用LDREX加载的数据。只有在实际发生外部修改时,该值才会被丢弃并重新加载。
对于系统来说,最大的不同在于处理器不再在系统总线上等待一个可用的信号量,因此系统总线带宽的大部分都可供其他进程或处理器使用。
15.3 ARMv6 Implementations
ARM于2002年12月完成了ARM1136J的开发,并且到目前为止,正在设计采用该核心的消费产品。ARM1136J流水线是迄今为止最复杂的ARM实现。如图15.4所示,它具有一个八级流水线,其中加载/存储和乘法/累加拥有独立的并行流水线。

具有“命中下错”功能的并行加载/存储单元(LSU)允许在加载或存储正在与较慢的内存系统完成时发出操作并继续执行。通过将执行流水线与加载或存储的完成分离,核心可以获得相当大的额外性能,因为内存系统通常比核心速度慢得多。命中下错将此分离扩展到L1-L2内存接口,以便在其他L1命中仍在进行时,可以发生L1缓存不命中并完成L2事务。
微架构中的另一个重要改变是从虚拟标记缓存转向物理标记缓存。传统上,ARM使用的是虚拟标记缓存,其中MMU位于缓存与外部L2内存系统之间。随着ARMv6的推出,这一点发生了改变,现在MMU位于核心与L1缓存之间,因此所有缓存内存访问都使用物理(已经翻译)地址。采用这种方法的一个重要好处是在ARM运行大型操作系统时,上下文切换时缓存刷新大大减少。这种减少的刷新还将降低最终系统的功耗,因为缓存刷新直接导致更多的外部内存访问。预计在某些情况下,这种架构变化将带来高达20%的性能改进。
15.4 Future Technologies beyond ARMv6
在2003年,ARM进一步宣布了包括TrustZone和Thumb-2在内的新技术。尽管这些技术非常新颖,在撰写本文时,它们已被纳入新的微处理器核心。下面简要介绍这些新技术。
15.4.1 TrustZone
TrustZone是一种面向安全性的架构扩展,旨在保护使用消费产品(如手机)进行的交易,将来可能还包括下载音乐或视频等在线交易。它首次在2003年10月引入,当时ARM宣布推出ARM1176JZ-S处理器。
其基本思想是,操作系统(即使是嵌入式设备上的操作系统)现在非常复杂,很难在软件中验证安全性和正确性。ARM解决这个问题的方法是向体系结构添加新的操作“状态”,其中只运行一个小型可验证的软件内核,并为更大的操作系统提供服务。微处理器核心则在控制系统外围设备上扮演一个角色,这些设备可能只能通过总线接口上的一些新导出信号对安全“状态”可见。系统状态如图15.5所示。

TrustZone在进行内容下载的设备中非常有用,例如手机或其他带有网络连接的便携设备。目前尚无关于该架构的详细信息对公众公开。
15.4.2 Thumb-2
Thumb-2是一种旨在提高代码密度的架构扩展。它允许将32位的ARM指令与16位的Thumb指令混合使用。这种组合使您既可以享受Thumb的代码密度优势,又可以获得访问32位指令的额外性能优势。
Thumb-2在2003年10月宣布,并将应用于ARM1156T2-S处理器。目前尚无关于该架构的详细信息对公众公开。
15.5 Summary
ARM架构并不是一个静态的常数,而是在不断开发和改进,以适应当今消费设备所需的应用。虽然ARMv5TE架构在为ARM添加一些DSP支持方面非常成功,但ARMv6架构扩展了DSP支持,并增加了对大型多处理器系统的支持。表15.15显示了这些新技术如何映射到不同的处理器核心。

ARM仍然专注于其中一个关键优势——代码密度,并最近宣布了对其流行的Thumb架构的扩展——Thumb-2。在安全方面,对TrustZone的新关注使ARM在这一领域处于领先地位。
预计未来将会有更多创新出现!


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值