并行架构与ARM指令集架构.docx
- 文档编号:24369834
- 上传时间:2023-05-26
- 格式:DOCX
- 页数:16
- 大小:288.29KB
并行架构与ARM指令集架构.docx
《并行架构与ARM指令集架构.docx》由会员分享,可在线阅读,更多相关《并行架构与ARM指令集架构.docx(16页珍藏版)》请在冰豆网上搜索。
并行架构与ARM指令集架构
郑州大学科技文章翻译
题目:
并行架构与ARM指令集架构
指导教师:
李正民职称:
副教授
学生姓名:
张黎明学号:
20052430138
专业:
计算机科学与技术
院(系):
信息工程学院
完成时间:
2009年5月20日
2009年5月20日
并行架构与ARM指令集架构
在几代并行架构的推动支持下,ARM公司的新型芯片设计或许能改变人们获取技术的途径。
随着销售量的快速增长,并且已经有超过15亿ARM处理器的出售,现在软件生产商们在可用ARM编码上拥有一个巨大的市场。
过去的15年间,ARM精简指令计算机处理器快速发展,提供了一系列的芯片,其中也包含技术成熟的多处理器芯片。
对性能和附加关键新技术的效率的层次提升,这方面的嵌入式应用需求推动了ARM架构的发展。
在发展的道路上,ARM团队利用了称作计算机架构的全范围技术来开发平行架构。
ARM采用的性能和效率方法包括多样的执行时间,子字平行架构,数字信号处理—比如操作、线程层并行、异常处理和多处理。
ARM架构的发展历程展示了过去处理器是如何应用不同类型的并行架构。
新的ARM11MPCore多处理器更是顶峰之作。
针对嵌入式应用的RISC
早期的RISC设计,比如MIPS,纯粹集中在高性能上。
架构师从而有了大量的寄存器集、更少的指令类别、一个存取架构和简单的管道。
所有的这些在现代处理器上还是很常见。
ARM版本的RISC很多方面有不一样的地方,主要是因为ARM处理器是嵌入式的处理器,是装载在片上系统设备上的。
尽管这样做保留了基于高性能的目标,但是研发人员仍旧把高代码密度、低功耗和小模具面积放在了优先地位。
为了实现这种设计,ARM团队改变了RISC规则,使得它包含对某些指令可变周期执行时间、一个用于处理输入寄存器的内嵌移位器、条件执行、压缩的16位Thumb指令集以及几条增强的DSP指令。
●可变周期执行时间
由于ARM是一个存取架构,所以ARM处理器首先必须在处理数据之前先装载到一个通用寄存器里。
假使单周期执行限制了原来的RISC的设计,对每个寄存器单独的存取就没有效率。
因此,ARMISA指令专门用于存取多个寄存器。
这些指令执行的周期不同,取决于处理器用来传送的寄存器的数目。
这对于存储和恢复进程序言和结语的上下语境特别有用。
这种方法直接改善了代码密度,减少了指令获取次数,降低了总功耗。
●内嵌桶形移位器
为了使每条数据处理指令更加灵活,一个移位或者循环就能处理一个源寄存器。
这使得每条数据处理指令更加灵活。
●条件执行
一条ARM指令只有当它满足一定特殊条件时才会执行。
这个条件放在指令块的末端,默认情况下,是无条件执行的。
比如,生成12字节的存储空间—42%的用于除数计算,无论是否有条件执行。
●16位Thumb指令集
这个压缩的16位ARM指令集以些许的性能消耗来执行较高密度的代码。
由于Thumb16位ISA被设计成编译目标,这不包括正交寄存器对ARM32位ISA的读取。
采用ThumbISA使程序面积大大减少。
2003年,ARM宣布它的Thumb-2技术,对代码密度进行了进一步的扩展。
这项技术在一个指令流里混合采用32位和16位指令来增加代码密度。
为了达到这个目标,研究人员在处理器里融入了未对准地址。
●增强的DSP指令
标准ISA中加入这些指令支持灵活快速的16*16乘法和算术饱和运算,这使得专门用于DSP的指令规则可移植到ARM机上。
一个单一ARM处理器能执行应用程序,比如voice–over-IP,而不需请求一个专门的DSP。
这个处理器能利用这些指令,例如SMLAxy来和一个32位寄存器的高16位或者低16位相乘。
处理器能将R1寄存器的高16位和R2的低16位相乘后和R3相加并将结果放到R3里面。
图一显示了溢出是如何影响ADD指令的结果。
图1
饱和运算对数字信号处理特别重要,因为当整型数值溢出时,不饱和指令就会给出一个负值。
一个饱和的QADD指令无需反复求值时即可返回最大值。
数据层并行架构
随着在V5TEISA中引入增强DSP指令的成功,ARM在2001年引进ARMV6ISA。
除了改善数据层和线程层的并行架构外,还包含了其他的功能,比如,增强的数学运算操作、异常处理以及终端处理。
一个影响ARMv6ISA设计的因素涉及逐渐增加的类似DSP功能的视频处理、2D和3D图像处理。
在保持低功耗的前提下设计同时要实现这些改善的功能。
ARM将单指令、多数据架构作为实现这种设计的方法。
在提供数据层并行架构方面SIMD是很常用的技术,它无损代码密度和功耗。
一个SIMD的执行需要很少的指令、较少的访问内存次数来完成复杂的计算。
由于对计算效率和低功耗的权衡,ARM的SIMD执行过程将32位的数据路径分割成四个8位或者两个16位。
这与很多其他的执行不同,它们需要额外专门的数据通道来完成SIMD操作。
图2当采用ARMv6SIMD指令时不同代码需要的MHz的改进:
图2
ARM中SIMD的使用的不足就是减少了门数,因此很大程度上减少了模具尺寸、功耗以及复杂性。
进一步说,所有的的SIMD指令的执行都是有条件的。
为了改进对视频压缩系统(比如MPEG和H.263)的处理,ARM也引进了绝对差求和的概念---SAD,它是DLP指令的又一种形式。
移动估测采用两个像素块,R(I,j)和C(I,j),通过
,更小的SAD值意味着更多相似的块数。
因为移动估测采用不同位置的R和C块来执行SAD测试,视频压缩系统要求非常快速有高效能的SAD操作。
USAD8和USADA8的指令在两个8位数值间进行绝对差计算。
对移动视频压缩和移动估测计算来说是相当有用的。
线程层并行架构
我们可以把线程视为进程,当分享一个共同的内存空间时每一个线程都有自己的程序计数器和寄存器集。
对于线程层并行架构来说,ARM需要改进异常处理,为在多处理器上处理多线程而不断增加的复杂性做好准备。
这些需求增加了中断处理、调度程序和上下文切换的内在复杂度。
在上下文切换的临界时间中一个最优化的方法扩展了异常处理指令来保存重要的时钟周期。
ARM通过向指令集中加入三条新指令,如表一所示,来达到目的。
表一
编程人员能利用改变处理机状态指令来选择处理机状态,这通过设置当前程序状态寄存器为管理模式以及屏蔽快速中断请求来实现,如图3所示。
然而ARMv4TISA要求四条指令来完成,ARMv6ISA只需要两条。
图3
程序员可采用保存返回状态指令SRS在特殊模式下修改保存状态寄存器。
在特殊的ARMv4TISA模式中修改SPSR比在ARMv6ISA中用的指令要多。
这条新指令对处理上下文切换或者准备从异常处理模式返回是十分有用的。
多处理器的原子操作指令
更早的ARM架构利用swap指令来执行旗语,这条指令占用外部总线直至结束。
很显然,这对线程层的并行是不可取的,因为一个处理器可能占用整条总线直至结束,而不允许其他的处理器使用。
ARMv6引进两条新指令——占有式装载LDREX和占有存储STREX——它们使用了内存中的专用监视器:
●LDREX从内存中装载一个数值并设置监视器来监视装载过程
●STREX察看监视器,如果在那块装载区没发生写操作,就执行内存存储,并返回一个值表明数据已经写进去了。
因此,这个架构可以执行不锁用系统总线的旗语,而这些总线允许其他处理器或者线程有权使用内存系统。
ARMv6ISA的首例硬件使用就是ARM11微架构。
它有个8级管道,为存取装载和乘法/累加操作提供独立的平行管道。
利用存取单元,ARM1136J-S处理器不用等待较慢的内存分配(一个对处理器运行很重要的因素),就可以继续执行。
此外,ARM1136J-S处理器采用物理标记的高速缓存来帮助实现线程的并行,这和ARM处理器的虚拟的高速缓存相反。
特别是当运行大型的操作系统时,对上下文切换相当有用。
由于包含已有的虚拟向物理的转换,一个虚拟标记的高速缓存在每次切换发生时都要被刷新。
在ARM11中,内存管理单元逻辑介于1级高速缓存和处理器核心之间。
高速缓存刷新的减少,通过减少在虚拟标记的高速缓存中对外存的访取次数来降低总体的功耗。
物理标记的高速缓存提高了总性能的20%。
指令层并行架构
在ILP中,处理器从当前的单指令序列中执行多条指令。
这种形式的并行很重要,因为它在不影响软件执行模式情况下提供额外的整体性能。
很显然,ILP更注重这样的编译器,它能从源代码提取ILP并在超标量体系结构核心上为指令安排时间表。
这样尽管潜在的简化了其他复杂的硬件,用来提取ILP并通过增加MHZ来获得高性能的做法也已增加了硬件的复杂性和成本。
ARM在网络上做处理器已经好多年了。
这个领域一直有最新的技术发明,并带有逐渐从大型计算机系统向小型化发展的趋势。
例如,在今天的桌面计算机上可以看到一两年前发展来的主框架技术。
类似的,在消费者和网络产品上开始出现5年前的桌面电脑技术的影子。
例如,对称多处理操作出现在桌面计算机和嵌入式计算机上。
性能和能量需求的对比
几年以来,嵌入式处理器市场沿用桌面计算器的成熟技术,因为消费者对嵌入式设备功能的需求与其很相似。
持续地对低功耗性能的要求,产生了稍微不同的需求并致使总体功耗预算的大幅度减小,这要借助于嵌入式设备中的多处理器和加速器。
现如今,对高层次的多功用计算驱使用SMP作为嵌入式和桌面系统的应用处理器。
2004年,嵌入式和桌面系统市场在价格—性能—MHZ中碰了壁。
作为回应的是,研发人员开始采用很有潜力的解决方法,这种方法利用SMP处理来避免了以下缺陷:
●高MHZ耗费能力。
增加处理器的时钟频率在能量消耗上有二次的影响。
MHz的加倍不仅使切换逻辑所需的动态能量加倍,而且也需要更高的操作电压,该电压以频率的平方次增加。
更高的频率也加重了设计的复杂性,极大地增加了处理器需要的逻辑量。
●提取ILP很复杂且成本高。
用硬件完成ILP的提取极大地提高了硅芯片面积和设计复杂度的成本,进一步增加了能量消耗。
●可编程的多独立处理器不方便、没效率。
当研发人员用更多的处理器时,常由于不同的架构,软件复杂度增加,消除了设计上的方便性。
2004年中期,PC生产商和芯片制造商已经发表几个声明,宣称桌面处理器的终结,支持多核心SMP处理器的使用,主要是Inter奔腾处理器中超线程的使用。
那是,ARM宣布其ARM11MPCore多处理器内核是帮助解决面向性能可测性需求的主要方法。
引进了ARM11MPCore,对ARMv6架构的一系列增强措施为进一步支持先进的SMP操作系统提供了支持。
在向支持更丰富的SMP操作系统过程中,ARM应用了这些增强措施,在跨越所有为嵌入式软件提供坚实基础的、基于ARMv6架构的处理器中,ARMv6K或者AOS(forAdvancedOSSupport)是享负盛名的。
ARM11多处理器也面临SMP系统设计的两个主要瓶颈:
●内部处理器与新一代ARMGIC综合体之间的通信
●高速缓存与智能内存通信系统SCU综合体的一致性
ARM多处理的准备
为了全面认识通用计算机采用多处理器硬件平台的优势,ARM有必要提供一个带有丰富指令集的、连贯缓冲而又对称的软件平台。
ARM发现对目前ARMv6架构的几个关键增强措施能极大提高查找性能。
增强型原指令
研究人员可使用ARMv6的存取装载指令器来执行基于交换和基于比较交换的旗语来控制临界数据的访取。
在SMP的传统服务计算机领域里,然而,已经存在使用lock-free同步技术优化SMP代码的软件设备。
X86架构和其能为开发人员用来比较和交换的原指令已居主导地位。
在Lock-free规则中,很多研发人员喜欢使用Intelcmpxchg8b指令,因为它能自动交换和比较8位数据。
具有代表性的是,这涉及4字节的有效载荷,以及4个字节用于区分有效载荷版本----会有相同数值的被称为A-B-A问题。
ARM专用器使用数据地址而非数据值来提供原子数,以使在不遭遇A-B-A问题前提下规则能自动交换数据。
然而,开发这个需要重写很多现存的两字专用代码。
最终,ARM使用多样的有效负载区域—包含8个字节,增加了用于执行装载存储指令,由此确保退出多线程代码的便捷性。
对局部数据的改善
当操作系统处理SMP平台上越来越多的典型线程应用时,就必须先考虑性能优先于当前执行的线程的具体状态。
这就关系到,例如,知道线程在哪个CPU上执行,访取一个具体线程的内核结构,并使线程能访取至本地存储。
AOS增强措施添加一些有助于改善SMP性能的寄存器。
Cpu数量:
采用标准的ARM系统协处理器接口,处理器上的软件就能执行简单、无需访取内存的指令来确定它在哪个处理器上执行。
研发人员用这个作为进入内核架构的索引。
上下文寄存器:
当提供对线程专有数据的访取时,SMP操作系统处理来自内核的关键请求。
ARMv6K扩展架构定义了额外的三个系统协处理器寄存器,当OS发现合适的目标时就可以使用这些寄存器。
每个寄存器都有不同的访取等级:
●用户和特权读写访取
●用户只读,特权访取读写
●只允许特权读写访取
对这些寄存器的详细使用是OS专属的。
在Linux内核和GNU工具链中,ARM应用的二进制接口已指派这些寄存器能够支持线程本地存储。
一个线程可用TLS在不丢失任何通用寄存器的情况下快速访取线程专用内存。
为了在C和C++中支持TLS,新关键字thread已用来定义和声明一个变量。
尽管官方语言没有扩展,但是很多编译器编写者支持使用这些关键字。
这种方法定义和声明的变量会自动分配给每个线程:
__threadinti;
__threadstructstates;
extern__threadchar*p;
新发布的NPTL作为Linux2.6的内核的一部分,支持TLS是很重要的需求必备条件。
这个可移植操作系统接口线程库比老版本Linux的提供重要的性能改善。
能耗敏感引脚上锁
另一个SMP系统花费就是,当处理器必须访取共享数据时要求先同步。
在多数SMP同步机制中的最低抽象层里,引脚上锁软件技术用内存中的一个数值作为锁。
如果内存装载含有预定义的数值,OS就认为共享数据锁住了,否则未上锁。
在任何软件访取共享资源之前,它必须有锁----并且一个自动操作必须使用该锁。
当软件完成访取资源时,必须释放这个锁。
在SMPOS中,处理器经常在另一个处理器上锁时必须等待。
自旋锁获得命名,因为它在持续尝试获取该锁时通过使处理器进行一个紧密循环来完成等待。
近来的减少总线内容的好办法在处理器不尝试取锁时增加一个滞后循环。
在任何一种情况下,在一个能耗敏感的嵌入式系统中这些无用的周期很显然浪费能量。
AOS扩展包含一个新的指令对,在处理器等待开锁时让其进入睡眠状态,因此消耗较少的能量。
当锁接触时,ARM11多处理器利用这些指令在下一个周期通知正在等待的处理器,而不是采用请求一个滞后循环的方法。
这就产生了节省能量和更有效的引脚上锁执行机制。
图4显示了引脚上锁的样例和ARM Linux2.6内核中的解锁代码
图4
弱序内存一致性
ARMv6架构为不同的内存区域定义了丰富的内存一致模式。
在ARM11多处理器中,自旋锁代码用连贯缓存内存来存储锁值。
作为一个多处理器,ARM11MPCore是第一个完全向编程人员展示弱序内存的处理器。
这个多处理器利用三条指令来控制弱序内存的副作用:
●wmb().这个Linux宏创建一个写内存屏障,多处理器可以用它在屏障周围的写序列中存放一个标记。
比如,自旋锁要先于解锁执行以确保在释放自旋锁前有效载荷数据的完全写入,因此这项操作也要在任何其他处理器获得锁之前。
为了确保更高的执行级别,屏障没必要通过刷新数据来延迟处理器。
而是通知存取装载单元并在大多数情况下继续执行。
●rmb().也来自Linux内核,这个宏也放置了一个读内存屏障,在读操作获得锁之前阻止对有效载荷的推测型读取。
这样做尽管在ARMv6中是合法的,弱序内存的层次使得很难确保软件的正确性。
因此,ARM11多处理器仅仅执行没推测性的先读操作。
当存在那种可能性的时候那读操作就不需要了,就像自旋锁的例子——有一个分支指令介于teqeq指令和任何一个读有效载荷之间—先读操作还没发生。
所以,对ARM11MPCore多处理器,这个宏可被定义为空。
●DSB(DrainStoreBuffer).ARM架构包含一个只对处理器可见的缓冲器。
当运行单处理机软件时,处理器运行并发读操作从该缓冲器扫描数据。
但是,在多处理器中,这个缓冲器对来自其他的处理器的读操作是不可见的。
DSB将这个缓冲器放在L1高速缓冲中。
在ARM11每两个处理器之间都有连贯L1缓存的多处理器中,刷新操作只需在另一个处理器读数据之前进行到L1内存系统。
在自旋锁解锁代码中,处理器令DSB立即优先于SEV(SetEvent)指令以使任何一个处理器都能为即将唤醒的锁读取一个正确的数值。
ARM11 MPCORE多处理器
ISA的适宜性不是唯一影响多处理器传送SMP可测量性预测能力的因素。
如果这些可测量性预测没能很好执行,SMP设计的两个方面就会限制最佳性能并增加与提供SMP服务有关的能耗:
●缓存连贯性。
研发人员经常提供带有连贯缓存的单映像SMP操作系统,以使它将数据放在缓冲中来保持性能。
在ARM11多处理器中,每个CPU有自己的指令和L1数据缓存。
存在一致性方案常用附加的信号扩充系统来控制和监测其他CPU的缓存。
在嵌入式系统中,系统总线时钟比CPU的时钟要慢。
因此,除了在处理器和其缓存间设置一个瓶颈状态外,更重要的是这个方案增加了通信负担和由此而来的高耗能。
ARM11MPCore通过在每两个处理器间执行一个智能的SCU来解决这些问题。
对CPU频率的操作,这个配置也为CPU缓存间数据的直接移动提供了快速通道。
●内置处理器的通信。
SMP操作系统需要在两个CPU之间进行通信,有时在无需访取内存情况下能最好地进行通信。
系统也必须经常用自旋锁来规范内部处理器间的通信,而这些自旋锁是同步对保护资源访取的。
其他的SMP操作系统两个CPU间的通信无需访取内存就能很好地完成。
系统也经常必须同步。
这机制中的一个利用设备的中断系统在远程处理器上产生活动。
这些软件初始化的内部处理器中断经常使用中断系统,而这中断系统是为外围的I/O设备而不是另一个CPU设计的。
图5显示了ARM11MPCore是如何与核心内的新ARMGI0C一起使用来使中断系统的访取和作用更紧密更有效。
ARM设计GIC来优化SMPOS中的IPI关键框架的代价。
中断子系统
一个很关键的在SMP中使用IPI的例子涉及多线程的应用,这个应用影响处理器中的某种状态,而这个处理器是和该应用进程的线程所运行的处理器是硬件不一致的。
当应用进程分配虚拟内存时就会发生以上情形。
为了保持这一致性,操作系统必须把内存转换表应用到其他所有的处理器。
这个例子里,操作系统经常把转换表应用到它的处理器,并用低争论私有外围设备总线来写GIC中的中断控制寄存器,这个寄存器可以让其他的所有处理器产生中断。
其他的处理器就可以用这个中断的ID来决定它们需要更新内存转换表。
GIC也用丰富的软件定义指令模式来规范每个处理器的中断。
除了应用动态负载平衡外,SMP操作系统也经常动态地平衡中断处理负载。
其操作系统可用预处理器给本地私有外围设备总线命名别名来为任何特殊的中断快速改变目的CPU。
图5
另一个很流行的中断分配的途径是给一个已定义的处理器组发送中断。
MPCore将第一个处理器用于接收中断。
这个灵活的访取使得GIC技术很适合跨越ARM处理器范围。
这个标准,进一步简化了软件如何与中断控制器的相互作用。
检测控制单元
MPCore的SCU是一个智能控制块,它主要用来控制每两个相关处理器间的数据缓存一致性。
为了阻止来自探测和操作每个内存更新上的高速缓存时带来的能耗和性能影响,SCU为每一个高速缓存管线保留一个物理地址标记的副本。
保持该数据本地有效可让SCU限制有高速缓存管线的处理器的缓存操作。
处理器与优化的MESI协议版本保持缓存一致。
采用MESI,一些公共操作,例如A=A+1,在共享数据上执行时就会产生很多状态转换。
为帮忙改善性能并进一步减少为保持连贯性产生的能耗,SCU中的智能系统为迁移管道监管系统。
如果一个处理器有一条修改管道,同时另一个处理器读后进行写操作,SCU就认为这个区域将来会经历同样的操作。
当这样的操作又一次开始时,SCU将会自动将高速缓存管道移至不可用状态,而不是首先移至共享状态。
这种优化措施也导致处理器在不干扰外存操作的情况下将高速缓存管道直接转移到其他的处理器。
在两个处理期间直接复制共享数据的能力为编程人员优化软件提供了重要作用。
当定义处理器共享的数据结构时,编程人员应确保合适的队列及结构的压缩,从而可产生管道迁移。
如果编程人员用队列来分配处理器上的工作项时,他们要保证队列有适宜的长度和宽度,以使当运行着的处理器运行工作项时,它会再次通过缓存-缓存的传输机制来传输信息。
为帮助实现这种优化,MPCore传统的L1高速缓存和SCU中包含了针对很多操作的硬件指令。
ARMv6KISA可视为重要的多处理器感知指令集。
依据低能耗设计的基础,该架构以及在ARM11MPCore中的应用能为高性能设计带来很少的能耗。
这些全新的设计展示了改变人们怎样运用技术的潜力。
随着每年超过15亿AMR处理器的销售,一个巨大的市场握在ARM开发代码的研发人员手中。
参考:
1.D.Seal,ARMArchitectureReferenceManual,2nded.,Addison-WesleyProfessional,2000.
2.A.Slossetal.,ARMSystemDeveloper’sGuide,Mor-ganKauffman,2004.
JohnGoodacre在ARM公司中是名项目主管,负责多处理器。
其兴趣涵盖嵌入式多处理设计的硬软件的所有方面。
Goodacre被纽约大学计算机科学院授予理科学士学位。
联系请用jobn.goodacre@
AndrewN.Sloss是ARM公司的学术工程师。
其研究兴趣涵盖异常处理方法、嵌入式系统和操作系统结构。
Sloss获得了了赫特福德大学的计算机科学理科学士学位。
他也是英国计算机科学协会的特约工程师及会员。
联系请用andrew.sloss@
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 并行 架构 ARM 指令