您好,欢迎来到中国电子应用网![登录] [免费注册] | 反馈 | 收藏

liuhong的博客

翻译:单芯片的一致多处理——嵌入式应用性能迈出的又一大步

2008-10-11 19:26:25 | 分类: 未分类
MIPS 科技公司
1225 Charleston Road
Mountain View, CA 94043
(650)567-5000
 
 
单处理器与多处理器的对比
 
利用一种给定的实现技术将一个独立处理器的性能提升至可能的极限,绝不是一件容易或有效的事情。较快速的时钟、较深的流水线,以及较大的高速缓存等经过实验的和真正的方法都存在硅片面积和功耗成本的问题,只能彻底陷入递减的回报而得到最后 10% 的性能。在别无选择的时候,还有机会调高时钟并升级电源和冷却子系统;而且在工作量可能分摊给多个处理器时,对总的最高性能的限制就会降低,而且处理单元本身的设计可能变得更加简单和更加有效。
 
人们发现了今天用于 PC、服务器和工作站的这种方法,而这恰恰也是嵌入式系统级芯片(SoC)设计的真谛。事实上,今天的许多嵌入式 SoC 设计都使用了多个处理器,但是它是以一种特定应用或者“松散耦合”的方式实现的。直到最近,软件友好的多处理 SoC 设计选择还受到严格的限制。不过,随着 SoC 设计元件的出现,如 MIPS32® 1004K™ 一致处理系统(CPS),单操作系统条件下的片上对称多处理(SMP)已经成为了一种真正的设计选择,而系统架构师也需要了解其优点和局限性。
 
多种并行路径
 
采用并行处理器需要并行的软件,而“并行编程”是一个为软件工程师们带来某种忧虑的模型,因为并非所有现有代码都是为并行处理平台编写的。但是,并行的软件有若干范例,其中一些是软件设计人员已经十分熟悉的东西,即使他们并不一定认为这些范例是相同的。
 
数据并行算法
 
数据并行算法是解决单个基本计算问题的方法,这是通过使用一个以上的处理器划分数据集而实现的,理想的情况是使用大量的 CPU。大数据集的教科书案例是采用一个大型输入文件或数据阵列,但是在嵌入式系统中,这可能意味着需要高 I/O 和高事件服务带宽。在一些 SoC 架构中,如网络界面端口的多来源的输入数据,每个数据都需要以同样的方式进行处理,它可能被静态地分布到运行相同驱动软件/路由器代码的多个处理器上,以便实现自然的数据并行性。
 
如图 1 的简单例子所示,当多个处理器的电源可能施加在单个数据阵列或单输入流上时,数据并行算法就会“划分并征服”经常要使用的数据。这类算法通常没有达到单处理器的最佳标准,但是可以利用可扩展性来弥补其低效率,以便利用更多的计算带宽。它们可以“弥补其容量”。这些算法已经被认为是并行计算中最可扩展的方法,但是将运行排序程序变成一种数据并行算法有可能价值不高、难以实现或难于接受,这取决于程序具有的特性等因素。
 
 
1 - 数据并行编程模型
(图字)
输入数据   CPU 输出数据   奇数输入   偶数输出   CPU 0  CPU 1  输出数据
 
如果应用中的大量计算工作是以一种相对较小的有规律的计算环路(computational loop)的长期运行来实现的,那么,一个在为现有应用寻找更高性能的系统设计人员将很有可能希望明确地采用数据并行算法。
 
PC、工作站和服务器处理器多核“x86”芯片的出现,催生了新一轮逻辑库和工具套件方面的研究和投资,它可以实现和更轻松地在适当数量的处理器上使用并行算法。其中许多都是开源和便携式嵌入式架构,MIPS 技术这样的架构。对数据并行 C/C++ 以及 FORTRAN 的 gcc 的 OpenMP 扩展成为了标准 GNU 编译程序集合(compiler collection)的一部分。
 
控制并行编程
 
另一个这里要提及的控制并行编程范例,是通过任务来划分一个程序的工作,而不是通过输入来划分。设想一下一家有 100 名工人的汽车工厂,其中的每个人都在组装一辆汽车。这可以看作数据并行算法的 100 种方式。一个控制并行程序就像是一家有 100 个工作台的单条流水线的工厂,每个工作台有一个执行不同任务的工人,其完成的是组装工作 1/100 的任务。图 2 所示为一个两种配置实现方法的简单例子。流水线的方法通常更加有效,但是每个人离多远是有一定限制的,这样才能合理分配组装一辆汽车的工作。科学代码的这种局限性非常明显,人们希望增加成千上万个处理器,但这通常不是消费类应用的适度并行 SoC 架构要讨论的问题。
 
 
图 2 - 控制并行编程模型
(图字)
输入数据   CPU 输出数据   中间数据   输入数据   CPU 0  中间数据   CPU 1  输出数据
 
 
即使不考虑并行处理的问题,软件工程师们也会经常将程序拆成不同的相(phase)。它有助于实现比较容易的编码、调试和由几组程序员进行的维护,而且还可以减少指令存储器和高速缓存上的压力。在许多情况下,控制并行分解的问题已经涉及操作系统(OS)可见的任务水平。在 UNIX 系统上的单命令“cc”调用依次为 C 语言预处理程序、编译程序、汇编程序及连接程序。在一个对称多处理(SMP)多处理器上,其中一些可能与采用前一阶段的输出作为其输入的每个连续程序同时运行,采用的是文件或者是更好的软件“管道”,这些管道一直都具有 UNIX 操作系统的特征,包括 Linux。
 
在分解成为独立运行任务的工作还没有完成时,必须进行一些软件工程设计,以使一项应用的有关操作系统及底层硬件是可见的,并明确地将数据从一个任务传递到另一个任务,这时其“所有权”也从一个相传递到另一个相。但是,在这里应该不需要重新考虑或重写构成相(constituent phase)的算法,因为这通常需要一种数据并行分解。粗粒度任务可以通过文件、插座,或者管道的进程间通信来实现。对于精细粒度的控制,POSIX 线程(即 pthreads)API 已被广泛采用,它得到了各种操作系统的支持,包括 Linux、微软 Windows 和许多实时操作系统。
 
性能越高越需要并行。
 
复杂的模块化多任务处理嵌入式软件系统经常表现出“偶然发现的”并发,如图 3 所示,即使它不是一个设计的目标。该系统的总任务可能包括多任务操作,每个操作都有不同的职责,可满足一系列不同的输入需求。无需分时操作系统,这些任务中的每个都必须在独立的处理器上运行。在一个分时单处理器(uniprocessor)上,任务可以在交替的时间片段上运行。在一个采用 SMP 操作系统的多处理器上,任务可以同时在许多可供使用的处理器上运行。
 
 
 
 
图 3 - 并行的多任务处理
(图字)
任务A  任务B  分时操作系统  CPU 任务A  任务B  SMP 操作系统  CPU 0 CPU 1
 
分布式处理
 
另一种形式的并行处理已经成为司空见惯的事情,以至于它有时甚至不被认为是“并行”的分布式计算,其中的网络客户机/服务器模型是迄今为止最常见的范例。客户机/服务器编程基本上是一种控制流分解的形式。一个程序任务将工作请求连接和发送给系统中的一个或多个专门任务,该系统被指定执行具体的工作,而不是执行所有计算本身。客户机/服务器编程通常是在 LAN 和 WAN 上实现的,SMP SoC 内的任务之间的通信也是遵循同一个范例。人们可以利用片上或无效“环回”网络接口通过 TCP/IP 进行未经修改的客户机/服务器的二进制通信,或者更加有效地利用在存储器中传递数据缓存的本地通信协议。
 
实际上,任何上述技术都可以单独使用,或者结合使用,以利用给定应用的基于 SMP 平台的能力。人们甚至可以构建一种分布式 SMP 服务器的数据并行阵列,其中每个阵列都可以执行一条控制流的流水线。但是,为了有效地实现这个方案,可能需要非常大的工作量和数据集。
 
系统软件的支持非常关键
 
在 SoC 系统中,有可能实现处理器静态物理分解任务的并行性(例如每个输入端口有一个处理器内核),处理器的并行任务的分布可以在硬件中完成。这将降低软件开销和占位面积,但是不能提供灵活性。
 
同样,如果嵌入式应用可以将一个片上互连分解成为静态的客户机和服务器通信,系统连接所需的唯一的系统软件就是执行处理器间共用协议的信息传递代码。信息传递协议可提供某些抽象层,可以用来配置更多或更少的处理器来运行共用基础的应用代码,但是对于任何给定的配置,处理器间的负载平衡就像硬件分区一样无声无息。为了实现更加灵活的并行系统编程,需要在一个共享资源的多处理器系统上完成软件分布的任务。
 
SMP系统的灵活性和适应性
 
顾名思义,SMP 操作系统有一个对系统“对称”的含义。所有<
分享到: 阅读(7086) | 评论(0)
评论
登录后你可以发表评论,请先登录。登录>>
中国电子应用网
copyright@2011