文章目录
并行处理技术是获取高性能计算的重要手段,计算机系统结构由低向高发展的过程,就是并行处理技术不断发展的过程。与器件的发展对提高计算机性能的作用相比,并行处理技术显得更重要——器件速度的改进受物理条件约束,不可能超过光速,而并行处理技术可以通过资源的重复来实现,其发展基本上是无穷尽的。因此,从这个意义上讲,它有着更为广阔的应用前景,将起到更为重要的作用。
6.1 并行处理技术的基本概念
所谓并行性是指在数值计算、数据处理、信息处理或人工智能求解过程中,可能存在某些可以同时进行运算或操作的部分。开发并行性的目的是,为了能进行并行处理,提高计算机系统求解问题的效率。
并行性的双重含义是指同时性(或并行性)和并发性。所谓同时性是指两个或两个以上的事件在同一时刻发生,而并发性则是指两个或两个以上的事件在同一段时间间隔内发生。
并行处理则是指一种相对于串行处理的信息处理方式,它着重开发计算过程中存在的并发事件。在进行并行处理时,其每次处理的规模大小可能是不同的,这可用并行性粒度来表示。有关并行性粒度大小 G G G 可用以下公式表示(假定系统中共有 P P P 个处理器) :
G = T W T C = ∑ i = 1 P t w i ∑ i = 1 P t c i G = \dfrac{T_W}{T_C} = \dfrac{ \displaystyle\sum^P_{i = 1} t_{wi}} { \displaystyle\sum^P_{i = 1} t_{ci}} G=TCTW=i=1∑Ptcii=1∑Ptwi 式中,分子为所有处理器的计算时间总和,而分母表示所有处理器的通信时间总和。当 T C TC TC 较大时, G G G 就较小,表明处理粒度较细。当处理粒度较细时,显然此时处理器间的通信量将加大,相反当粒度较粗时,通信量就较小。
并行性有不同的等级,而且从不同角度观察时,会有不同的划分方法。程序执行过程通常可划分成以下 5 5 5 个等级——作业级、任务级、程序级(例行程序或子程序)、指令级和指令内的操作级。前 3 3 3 级为粗粒度,主要是通过多处理机或多计算机系统实现,开发手段以软件为主,其中包括并行性算法分析、任务的调度与分配等;而后 2 2 2 级为细粒度,主要是在单处理机中实现,开发手段以硬件为主,其中包括标量流水、超标量流水、超流水和超长指令字等。
并行性的开发途径有时间重叠、资源重复和资源共享。
- 时间重叠:在并行性中引入时间因素。即让多个处理过程在时间上相互错开、重叠地使用同一部件,以赢得速度,如指令的流水执行方式。
- 资源重复:在并行性中引入空间因素。即通过重复设置多个功能部件来提高处理性能或可靠性,如阵列处理机。
- 资源共享:利用软件的方法,让多个用户按一定的时间顺序轮流使用一套资源,以提高系统资源的利用率。
从计算机系统结构的角度出发,根据并行性的三个途径,从计算机系统由低性能向高性能发展过程中可以看出,并行性正从两个不同的角度向同一方向发展。
- 一方面在单处理机上,通过时间重叠、资源重复和资源共享,分别向异构型多处理机系统、同构型多处理机系统和分布式处理系统方向发展。
- 另一方面在多计算机系统中,通过功能专业化、多机互连、网络化等手段,分别向异构型多处理机系统、同构型多处理机系统和分布式多处理机系统的方向发展。
例如,在指令级内部,采用了多个子部件以流水方式执行指令,以提高单台计算机的执行速度。这一思想仍可应用于多台计算机组成的系统,如在高级语言向汇编语言转换过程中,是由编译程序完成翻译的。将翻译的全过程分为编译扫描、编译分析和目标程序生成三个子过程。为了提高效率,可由三台计算机组成流水方式执行。由于这三台计算机结构可以不一样(非对称型),故这样组成的多计算机系统称为异构型多计算机系统。
按照资源重复的思想,既然在一个计算机系统内可由多个相同的处理单元构成阵列处理机,那么用多台系统结构相同的计算机,也可以组成多计算机系统,这种系统结构称为同构型(对称型)多计算机系统。
按照资源共享的思想,单处理机采用多道程序和分时操作,并发展成为分布式多计算机系统。
6.2 SIMD
并行计算机(阵列处理机)
本节将讨论以 SIMD
方式工作、采用资源重复的并行性措施的阵列处理机。由于历史原因,习惯上也将阵列处理机(简称“阵列机”)称为并行处理机。这里首先讨论它的基本结构,然后是它的主要特点,最后简短讨论适合于在阵列机上进行加工的并行算法。
6.2.1 阵列机的基本结构
阵列机通常由一个控制器 CU
、 N N N 个处理器单元 PE
、 M M M 个存储器模块 M
及一个互连网络部件 IN
所组成。由 CU
控制将指令广播给系统中的各个 PE
,而所有活跃的 PE
将以同步方式执行相同的指令(单指令流),它们从相应的存储模块中取得自己所需的数据对象(多数据流)。IN
用来使各个 PE
之间或是 PE
和 M
之间实现方便的通信连接。IN
有时也称为对准 Alignment
或排列 Permutation
网络。有关互连网络的问题,在下一节作进一步讨论。
为了形式化地表示阵列机的特征,可用以下的参数加以描述:
C = ( N , F , I , M ) C= (N, F, I, M) C=(N,F,I,M) 式中, N N N 为 PE
数; F F F 为确定互连网络结构及连接拓扑的互连参数; I I I 为指令集,它能进行标量、向量、数据传送通路操作和网络变换操作等; M M M 为屏蔽方式集合,每一种方式将 PE
集合分为活跃和非活跃两类 PE
的子集。这种描述模型,为评价不同的阵列机结构提供了比较基础。
根据存储器模块是以分布方式存取还是集中方式存取,阵列机可分为两种基本结构:分布式存储器的阵列机和集中共享存储器的阵列机。
1. 分布式存储器的阵列机
分布式阵列机的基本结构如图6.1(a)所示。这种阵列机的主要结构特征如下:
CU
中具有自己的存储器,以存放系统程序和用户程序,此外,它也可存放各个PE
所需的共享数据。CU
的主要功能是对指令译码和判别它应在何处执行。对于标量或控制类指令,CU
本身中含有运算部件可以直接执行;若是向量指令,它就将此指令广播给各个PE
去执行。- 具有 N N N 个相同的处理单元
PE
,它由处理器Pi
和局部存储器Mi
组成。只要数据分配得当,各个Pi
主要将从自己的Mi
中获取数据进行操作。各个PE
将通过IN
实现相互间必要的数据交换,因此,IN
是单向的。 - 各个
PE
同步执行来自CU
的操作命令,但是并不一定每个操作非得所有PE
都参加,CU
将对PE
实行屏蔽控制,只有那些未被屏蔽的活跃PE
才可参加操作。 CU
还控制互连网络IN
,使各个PE
之间通过IN
,实现相互之间必要的数据交换。当相互需要交换数据的两个PE
不直接相连时,就需要经过它们之间的中间PE
来完成连接。
2. 共享存储器的阵列机
图6.2(b)中示出了这种类型的阵列机结构。与图6.2(a)中分布式存储器的阵列机结构比较,区别主要在于:
- 每个
PE
没有局部存储器。存储器模块以集中形式为所有PE
(通过IN
)共享。 - 互连网络受
CU
控制,用来构成PE
和M
之间的数据交换通路。要求互连网络具有同时连接PE
到M
或M
到PE
的双向性。系统中的一个PE
,可以与任何另一个PE
实现数据交换(只要有任何一个存储模块,同时与这两个PE
相连接) 。当两个需交换数据的PE
之间没有共享的存储模块时,可能需要经过多次的传送之后,方可实现交换。
6.2.2 阵列机的主要特点
阵列机是以单指令流多数据流方式工作的,它具有以下特点:
- 它采用资源重复方法引入空间因素,即在系统中设置多个相同的处理单元开发并行性,这与利用时间重叠的流水线处理机是不一样的。此外,它是利用并行性中的同时性、而不是并发性,所有处理单元必须同时进行相同操作。
- 它是以某一类算法为背景的专用计算机。这是由于阵列机中通常都采用简单、规整的互连网络,实现处理单元间的连接操作,从而限定了它所适用的求解算法类别。因此,「对互连网络设计的研究」就成为阵列机研究的重点之一。
- 阵列机的研究必须与并行算法研究密切结合,以便使它的求解算法的适应性更强一些,应用面更广一些。
- 从处理单元来看,由于都是相同的,因而可将阵列机看成是一个同构型并行机。但它的控制器实质上是一个标量处理机,而为了完成I/O操作以及操作系统的管理,尚需一个前端机。因此,实际的阵列机系统是由上述三部分构成的一个异构型多处理机系统。
6.2.3 典型 SIMD
计算机举例
1. ILLIAC-Ⅳ阵列计算机(阵列机)
由美国宝来 Burroughs
公司和伊利诺斯大学在1965年开始研制,并于1972年由宝来公司生产的 ILLIAC-Ⅳ
阵列机,是 SIMD
并行计算机的一个典型代表。它可分为两大部分,即 ILLIAC-Ⅳ
阵列和 ILLIAC-Ⅳ
输入输出系统。实际上,它是由三种类型处理机组成的一个异构多机系统:一是专门用于数组运算的处理单元阵列;二是阵列控制器,它既是处理单元阵列的控制部分,又是一台相对独立的小型标量处理机;三是一台标准的宝来公司的 B6700
计算机,由它担负 ILLIAC-Ⅳ
输入输出系统和操作系统管理功能,如图6.2所示。
(1) ILLIAC-Ⅳ
阵列
ILLIAC-Ⅳ
阵列计算机共有 64 64 64 个 PE
,由控制器 CU
统一控制。系统由一台 B6700
作为宿主机进行管理,每个 PE
有自己的局存 PEM
,容量 2 K 2K 2K 字,字长 64 64 64 位。每个 PE
拥有 4 4 4 个 64 64 64 位寄存器,分别用做累加器、操作数寄存器、数据路由寄存器和通用寄存器。此外,尚有 1 1 1 个 16 16 16 位变址器和 1 1 1 个 8 8 8 位方式寄存器,后者是用来存放 PE
屏蔽信息的。这是一种闭螺线阵列,每个 PE
只能与 4 4 4 个近邻的 PE
直接相连,即PE
与 PEi - 1
,PEi + 1
,PEi - 8
和 PEi + 8
(Mod 64)
4 4 4 个近邻直接相连。
因此,从一个 PE
要将数据达到另一个 PE
时,可能中间要经过若干个其他 PE
转送。传送步数 S ≤ N − 1 S≤\sqrt{N}- 1 S≤N−1 ,这里 N N N 为 PE
数。对于 ILLIAC-Ⅳ
来讲,由于 N = 64 N = 64 N=64 ,故 S ≤ 7 S≤7 S≤7 。例如,从 PE9
到 PE45
的距离以这一路径为最短:PE9 → PE1 → PE57 → PE56 → PE48 → PE47 → PE46 → PE45
ILLIAC-Ⅳ
阵列机的每一个处理单元 PE
有 6 6 6 个可编程序寄存器 RGA, RGB, RGR, RGS, RGX, RGM
以及加/乘算术单元 AU
、逻辑单元 LU
、移位单元 SU
和地址加法器 ADA
等。
RGA
是累加寄存器,存放第一操作数和操作结果。RGB
是操作数寄存器,存放加、减、乘、除等二元操作的第二操作数。RGR
是被乘数寄存器,也是互连寄存器,用于PE
与经过东、西、南、北 4 4 4 个互连通路之一的另一个处理单元之间的数据直接传送。RGS
是通用寄存器,程序用来暂存中间结果。上述这 4 4 4 个寄存器都是 64 64 64 位的。操作数来自以下 4 4 4 个方面:PE
本身的寄存器、PE
的处理单元存储器PEM
,CU
的公共数据总线CDB
,PE
的 4 4 4 个近邻处理单元。RGX
是 16 16 16 位的变址寄存器,它利用地址加法器ADA
修改指令地址,并将形成的有效地址经过存储器地址寄存器MAR
,输入存储器逻辑部件MLU
。RGM
是 8 8 8 位的模式寄存器,RGM
中的E
和E1
位是“活动”标志位,用来控制RGA, RGS
和处理单元存储器PEM
,E
位还控制RGX
。活动标志位的设立,使得我们可以单独控制 64 64 64 个处理单元中的每一个处理单元,只有那些处于活动状态的处理单元,才执行单指令流规定的共同操作。
RGM
的其他 6 6 6 位分别是:F
和F1
位保存运算出错(上溢、下溢)标志,G, H, I, J
位保存测试结果。RGM
经常处于CU
的监督之下,一旦出错,就发出CU
陷阱中断。
处理单元存储器 PEM
分属于每一个处理单元,各有 2048 × 64 2048× 64 2048×64 位存储容量,PEM
的取数时间不大于 350 n s 350ns 350ns 。 64 64 64 个 PEM
联合组成阵列存储器,存放数据和指令。
整个阵列存储器可以接受阵列控制器 CU
的访问,读出 8 8 8 个字的信息块到 CU
的缓冲器中。阵列存储器也可经过 1024 1024 1024 位的总线与 I/O 开关相连。每个 PE
只能直接访问自己的 PEM
。分布在各个 PEM
中的公共数据只能先读至 CU
后,再经 CU
的公共数据总线 CDB
广播到 64 64 64 个处理单元中去。
阵列存储器的另一个特点是它具有双重变址机构:控制器 CU
实现所有处理单元的公共变址,每一个处理单元 PE
还可以单独变址。双重变址机构增加了各处理单元存储器之间数据分配的灵活性。
(2) 阵列控制器
阵列控制器 CU
实际上是一台小型控制计算机,它除了能对阵列的处理单元实行控制以外,还能利用自己的内部资源执行一整套指令,用以完成标量的运算操作。CU
的标量操作与各 PE
的数组操作是时间重叠的。
阵列控制器 CU
同处理单元阵列之间有 4 4 4 条信息通路:
CU
总线。处理单元存储器PEM
经过CU
总线,把指令和数据送往阵列控制器CU
,以 8 8 8 个 64 64 64 位字为一个信息块。这里的指令是指分布存放在PEM
中用户程序的指令,而数据可以是处理所需要的公共数据。指令和数据先被送到CU
,再由CU
的广播功能把它们送到各处理单元。- 公共数据总线
Common Data Bus, CDB
。CDB
是 64 64 64 位总线,用于向 64 64 64 个处理单元同时广播公共数据的通路。例如,作为公共乘数的常数就不必在 64 64 64 个PEM
中重复存放,可以由CU
的某一个寄存器送往各处理单元。另外,指令的操作数和地址部分也要经过CDB
送来。 - 模式位线
Mode Bit Line
。每一个PE
都可以经过模式位线,把它的模式寄存器中的状态送到CU
中来,送来的信息中包括该处理单元的“活动”状态位。从 64 64 64 个PE
送往CU
的模式位,在CU
的累加寄存器中拼成一个模式字,以便在CU
内部执行一定的测试指令,对这个模式字进行测试,并根据测试结果来控制程序的转移动作。 - 指令控制线。处理单元微操作控制信号和处理单元存储器地址、读/ 写控制信号都经过约 200 200 200 条指令控制线,由
CU
送到阵列处理单元PE
和存储器逻辑部件MLU
。
概括起来,阵列控制器 CU
的功能有以下 5 5 5 个方面:
- 对指令流进行控制和译码,执行标量操作指令。
- 向各处理单元发出执行数组操作指令所需的控制信号。
- 产生和向所有处理单元广播公共的地址部分。
- 产生和向所有处理单元广播公共的数据。
- 接收和处理由各
PE
(计算出错时)、系统I/O操作以及主机B6700
所产生的陷阱中断信号。
(3) 输入输出系统
ILLIAC-Ⅳ
输入输出系统由磁盘文件系统 DFS
,I/O分系统和 B6700
组成。磁盘文件系统 DFS
是两套大容量并行读写磁盘系统及其相应的控制器。每套磁盘系统有 13 13 13 台磁盘机,总容量为 1 0 9 10^9 109 位。每台磁盘机有 128 128 128 道,每道有一个磁头,并行读写,数据宽度为 256 256 256 位,最大传输率为 502 × 1 0 6 b i t / s 502 × 10^6 bit/ s 502×106bit/s,平均等待时间为 19.6 m s 19. 6ms 19.6ms 。如果 DFS
的两个通道同时发送或接收数据,则数据宽度为 512 512 512 位,最大传输率可达 1 0 9 b i t / s 10^9 bit/s 109bit/s 。
I/O分系统包括 3 3 3 部分,即输入输出开关 IOS
、控制描述字控制器 CDC
和输入输出缓冲存储器 BIOM
。
IOS
的功能有两个:一是开关功能,用以把DFS
或可能连上的实时装置转接到阵列存储器,进行大批数据的I/O传送;二是作为DFS
和PEM
之间的缓冲,以平衡两边不同的数据宽度。CDC
的功能是对阵列控制器CU
的 I/O 请求进行管理。CU
提出 I/O 请求时,CDC
将使B6700
管理计算机中断,由B6700
响应输入/输出请求,并通过CDC
给CU
送回相应的响应代码,在CU
中设置好必要的控制状态字。然后,CDC
促使B6700
启动PEM
的加载过程,由DFS
向PEM
送入程序和数据。在PEM
加载完毕后,又由CDC
向CU
传送控制信号,使CU
开始执行ILLIAC-Ⅳ
的程序。BIOM
处在DFS
和B6700
之间,是为了使二者之间传送频宽能够匹配。B6700
存储器经CPU
输送数据的频宽是 80 × 1 0 6 b i t / s 80×10^6 bit/s 80×106bit/s ,而DFS
输送数据的频宽是 500 × 1 0 6 b i t / s 500×10^6 bit/s 500×106bit/s ,二者之间相差 6 6 6 倍多。因此,必须设立BIOM
作为B6700
和DFS
之间的缓冲。BIOM
把B6700
的 48 48 48 位字变换为ILLIAC-Ⅳ
的 64 64 64 位字,同时按双字 128 128 128 位的数据宽度输送给DFS
。实际上,BIOM
是用 4 个PEM
做成的,总容量为 8192 × 64 8 192×64 8192×64 位。
B6700 管理计算机的基本组成是:单中央处理器(另一个 CPU
可选), 32 K 32K 32K 字内存(可扩充至 512 512 512 字),经由多路开关控制连接的一批外围设备(包括一台容量为 1012 1012 1012 位的激光外存储器以及 ARPA
网络接口)。B6700
的作用是:管理 ILLIAV-Ⅳ
的全部系统资源,完成用户程序的编译或汇编,为 ILLIAC-Ⅳ
进行作业调度、存储分配、产生输入/输出控制描述字送至 CDC
、处理中断,以及提供操作系统所具备的其他服务。
2. BSP
计算机
BSP
计算机是由美国宝来公司和伊利诺斯大学于1979年制造的,它是共享存储器结构的 SIMD
计算机的典型代表。BSP
并不是一台独立运行的计算机,它是附属于系统管理机的一台后端处理机。
BSP
计算机及系统管理机的组成框图如图6.3所示。它由系统管理计算机 B7700/B7800
和 BSP
处理机两大部分组成,前者可视为后者的前端机。系统管理机负责 BSP
程序编译、与远程终端及网络的数据通信、外围设备管理等,大多数 BSP
作业调度和操作系统活动也是在系统管理机上完成。BSP
处理机由控制处理机、文件存储器、并行存储器模块以及对准网络等组成,如图6.4所示。
(1) 并行处理机
它以 160 n s 160ns 160ns 的时钟周期进行向量计算。所有 16 16 16 个算术单元 AE
对不同的数据组(从并行处理机控制器广播来)进行同一种指令操作。大部分的算术运算能在 2 2 2 个时钟周期 320 n s 320ns 320ns 内完成。BSP
的执行速度最高可达 50 MFLOPS 50\textrm{MFLOPS} 50MFLOPS 。
进行向量运算的数据存储在 17 17 17 个并行存储器模块中。每个模块的容量可达 512 K 512K 512K 字,时钟周期为 160 n s 160ns 160ns 。数据在存储器模块和 AE
之间以每秒 100 100 100 兆字的速率进行传输。 17 17 17 个存储器模块的组织形成了一个无冲突访问存储器,它容许对任意长度以及跳距不足 17 17 17 倍数的向量实现无冲突存取。
16 16 16 个 AE
是以 SIMD
方式、在单一微序列控制下同步工作的。在每个 AE
中,只有最原始的操作才采用硬连线方式,控制字的宽度为 100 100 100 位,除实现浮点操作以外,AE
还有较强的非数值处理能力。浮点加、减和乘都能在两个时钟周期内完成。采用两个时钟周期可使存储器频宽与 AE
进行三元操作(由三个操作数产生一个结果的操作)时的频宽相平衡。浮点除要用 1200 n s 1 200ns 1200ns ,是用 Newton-Raphson
迭代算法产生倒数来实现的。在每个 AE
中设有只读存储器,以给出除法和平方根迭代的第一次近似值。浮点字长为 48 48 48 位,尾数为 36 36 36 位有效值,阶码为 10 10 10 位,以 2 2 2 为底。数的精度可达到十进制 11 11 11 位。AE
在关键部位设置了双字长累加器和双字长寄存器,这就能使双精度运算直接用硬件实现。AE
还可以用软件方法实现三倍精度的算术运算。可以估算得出来,在 BSP
中用FORTRAN来表达很大范围的计算问题中,其速度可达 20 ~ 40 MFLOPS 20~40\textrm{MFLOPS} 20~40MFLOPS 。
BSP
可以对下列四类操作进行并行计算:
① 16 个算术单元实现并行运算;
② 存储器的读取/存取,存储器与算术运算单元间的数据传输;
③ 在并行处理机控制器中的变址值、向量长度和循环控制计算;
④ 线性向量操作描述字在标量处理机中的生成。
(2) 控制处理机
除了用以控制并行处理机以外,还提供了与系统管理机相连的接口。标量处理机则处理存储在控制存储器中的全部操作系统和用户程序的指令。它以 12 MHz 12\textrm{MHz} 12MHz 的时钟频率执行用户程序的串行或标量部分,最高速度可达 1.5 MFLOPS 1.5 \textrm{MFLOPS} 1.5MFLOPS 。
全部的向量指令以及某些成组的标量指令,被送给并行处理机控制器。在经过合格性检查后,控制器将它们转换为微序列,去控制 16 16 16 个 AE
操作。双极型控制存储器的容量为 256 K 256K 256K 字,周期为 160 n s 160 ns 160ns ,每个字长 48 48 48 位另加 8 8 8 位奇偶校验位,提供单错校正双错检测 SECDED
的能力。控制维护单元则是系统管理机与控制处理机其余部分之间的接口,用来进行初始化、监控命令通信和维护。
(3) 文件存储器
一个半导体辅助存储器。BSP
的计算任务文件从系统管理机加载到它上面。然后对这些任务进行排队,由控制处理机加以执行。文件存储器是 BSP
直接控制下惟一的外部设备,而其他的外部设备则都由系统管理机来控制。在BSP
程序执行过程中所产生的暂存文件和输出文件,在将它们送给系统管理机输出给用户之前,是存在文件存储器中的。文件存储器的数据传输率较高,大大地缓解了 I/O 受限问题。
(4) 对准网络
包含完全交叉开关,和用来实现数据从一个源广播至几个目的地、以及当几个源寻找一个目的地时能分解冲突的硬件。这就需要在算术单元阵列和存储器模块之间,具备通用的互连特性。而存储器模块和对准网络的组合功能,则提供了并行存储器的无冲突访问能力。算术单元也利用输出对准网络,实现一些诸如数据压缩和扩展操作、以及快速傅立叶变换算法等专用功能。
在 BSP
中,存储器—存储器型的浮点运算是流水进行的。BSP
的流水线组织由 5 5 5 个功能级组成。 16 16 16 个操作数先从存储器模块中取出,通过输入对准网络送给 AE
进行处理,再将结果经输出对准网络,送给存储器模块存储起来。这几级的操作都是重叠进行的(参见图6.4)。
请注意,在物理上,输入对准和输出对准都是在一个实际对准网络中进行的,这里的划分只是对流水级的功能划分而已。除了在 16 16 16 个 AE
中显示出的空间并行性,以及读取、对准和存储的流水线操作外,AE
中的向量运算还可以同标量处理机中的标量处理重叠起来。这就使得系统既适合于处理长向量和短向量,也能处理单独的标量,系统的功能很强也很灵活。
(5) 质数存储系统
BSP
并行存储器由 17 17 17 个时钟周期为 160 n s 160ns 160ns 的存储模块组成。由于每个周期存取 16 16 16 个字,因此每个字的最大有效存储周期时间为 10 n s 10ns 10ns 。这与算术单元完成浮点加和乘的速率很好地平衡。因为每次运算需要两个变量,算术单元中设有中间寄存器其运算速度为 320 n s / 16 320ns/ 16 320ns/16 次,即 20 n s / 次 20 ns/ 次 20ns/次 。
由于程序和标量都存放在控制存储器中,因此只有数组存取(包括 I/O)才用到并行存储器。这样,对于三元向量来说,因为在两次算术运算中需要用到 3 3 3 个变量,产生 1 1 1 个结果,共访问存储器 4 4 4 次,所以在并行存储器和浮点运算之间的频带保持完全平衡;对于长向量来说,由于中间结果都存在寄存器中,每次运算只需要一个操作数,因此并行存储器有足够的频宽,留给输入和输出信息使用。
6.3 SIMD
并行计算机算法
SIMD
并行计算机是从求解诸如有限差分、矩阵运算、信号处理、线性规划等一系列计算为背景发展起来的。下面以图像平滑算法为例,讲述该算法如何在并行机上实现。
该算法是用来平滑输入图像的灰度级, I I I 和 S S S 分别表示输入和输出图像。假定 I I I 和 S S S 均含有 512 × 512 512×512 512×512 个像素。 I I I 中的每个点是一个 8 8 8 位无符号整数,用来表示 256 256 256 个灰度级——每个像素的灰度级是用来表示像素的黑色程度,以 0 0 0 表示白色,以 255 255 255 表示黑色。平滑后图像中的每个点 S ( i , j ) S(i, j) S(i,j) 是 I ( i , j ) I( i, j) I(i,j) 和它的 8 8 8 个最邻近的像素的灰度级的平均值。 S S S 中的上、下、左、右边线上的像素,由于在 I I I 中的相应像素没有 8 8 8 个邻近像素,因而置为 0 0 0 。
若用具有 1024 1 024 1024 个 PE
的阵列机来实现上述算法,可如图6.5(a)所示那样排列成 32 × 32 32×32 32×32 方阵。在每个 PE
中存储一个 16 × 16 16×16 16×16 的子图像块(整个 I
图像为 512 × 512 512×512 512×512 像素块)。 PE0
中存储行 0 ~ 15 0~15 0~15 和列 0 ~ 15 0~15 0~15 的子图像块,PE1
中存储行 0 ~ 15 0~15 0~15 和列 16 ~ 31 16~31 16~31 的子图像块,依此类推。每个 PE
平滑自己的子图像,而所有 PE
可同时进行平滑操作。在每个 16 × 16 16×16 16×16 子图像的边界处,为了计算已平滑的值,数据必须在 PE
间传送。图6.5(b)中示出了所必须传送的数据。
阵列机的每个 PE
都有类似于单处理单元的数据传送模式。要对 512 × 512 512×512 512×512 图像完成平滑操作,在上述的每块为 16 × 16 16×16 16×16 大小的子图像块上用并行处理方法来完成平滑,则需 16 × 16 = 256 16×16 = 256 16×16=256 次并行的平滑操作。在操作过程中,总共所需的并行数据元素的传送数为 4 × 16 + 4 = 68 4×16 + 4 = 68 4×16+4=68 ——上,下,左,右 4 4 4 边每边需 16 16 16 次,而 4 4 4 个对角上每个需 1 1 1 次,参见图6.5(b)。
对同样大小的图像,若用串行算法来完成,虽然此时不需要进行 PE
间的数据传送,但总共却需要 512 × 512 = 262144 512×512 = 262 144 512×512=262144 次平滑操作。因此,并行算法就比串行算法快 1024 1 024 1024 倍。如果计入 PE
间传送所需时间,并假定每次并行数据传送时间相当于一次平滑操作时间,则改进倍数仍可达到:
262144 / ( 256 + 68 ) = 809 262 144/( 256 + 68) = 809 262144/(256+68)=809 另外,就所占比例而言,数据传送所需时间几乎可以忽略不计。
6.3.1 矩阵加
阵列处理机解决矩阵加是最简单的一维情况。两个 8 × 8 8×8 8×8 的矩阵 A , B A, B A,B 相加,所得的结果矩阵 C C C 也是一个 8 × 8 8×8 8×8 的矩阵。只需把 A , B , C A, B, C A,B,C 居于相应位置的分量存放在同一个 PEM
内,且在全部 64 64 64 个 PE
M 中,让 A , B , C A, B, C A,B,C 的各分量地址均对应取相同的地址 α , α + 1 , α + 2 α,α+ 1, α+ 2 α,α+1,α+2 ,如图6.6所示。
这样,实现矩阵加只需用下列三条
ILLI-AC-Ⅳ
汇编指令:
LDA ALPHA ;全部 (α) 由 PEMi 送 PEi 的累加器 (RGAi)
ADRN ALPHA + 1 ;全部 (α+1) 与 (RGAi) 浮点加, 结果送 (RGAi)
STA ALPHA + 2 ;全部 (RGAi) 由 PEi 送 PEMi 的 (α+2) 单元, 0≤i≤63
从这个例子可以明显看出,阵列处理机的单指令流( 3 3 3 条指令顺序执行)、多数据流( 64 64 64 个元素并行相加) 以及数组并行中的“全并行”工作特点。由于是全部 64 64 64 个处理单元在并行操作,速度就提高为顺序处理的 64 64 64 倍。同时也可以看出,对于具有分布式存储器的阵列处理机,能否发挥其并行性与信息在存储器的分布密切相关。而信息分布算法又与系统结构及所解题目直接相关,因此,存储单元分配算法的设计比较麻烦。
6.3.2 矩阵乘
矩阵乘是二维数组运算,比矩阵加要复杂。设 A , B , C A, B, C A,B,C 为 3 3 3 个 8 × 8 8×8 8×8 的二维矩阵,给定 A A A 和 B B B ,计算 C = A × B C = A×B C=A×B 的 64 64 64 个分量可用公式:
C i j = ∑ k = 0 7 a i k × b k j ( 0 ≤ i ≤ 7 ∧ 0 ≤ j ≤ 7 ) C_{ij} = \sum^7_{k = 0} a_{ik} \times b_{kj}\ (0≤i≤7 \land 0≤j≤7) Cij=k=0∑7aik×bkj (0≤i≤7∧0≤j≤7) 在 SISD
计算机上求解,可执行用FORTRAN语言编写的下列程序:
DO 10 I = 0, 7
DO 10 J = 0, 7
C(I, J) = 0
DO 10 K = 0, 7
10 C(I, J) = C(I, J) + A(I, K) × B(K, J)
需经 I , J , K I, J, K I,J,K 三重循环完成。每重循环执行 8 8 8 次,共需 512 512 512 次乘、加的时间,且每次还要包括执行循环控制判别等其他操作所需的时间。
如果在 SIMD
阵列处理机上运算,可用 8 8 8 个处理单元并行计算矩阵 C ( I , J ) C( I, J) C(I,J) 的某一行或某一列,即将 J J J 循环或 I I I 循环转化成一维的向量处理,从而消去了一重循环。以消去 J J J 循环为例,可执行用FOR-TRAN 语言编写的下列程序:
DO 10 I = 0, 7
C(I, J) = 0
DO 10 K = 0, 7
10 C(I, J) = C(I, J) + A(I, K) × B(K, J)
让 J = 0 ~ 7 J = 0~7 J=0~7 各部分同时在 PE0 ~ PE7
上运算,这样只需 I , K I,K I,K 二重循环,速度可提高 8 8 8 倍,即只需 64 64 64 次乘、加时间。其程序流程图如图6.7所示。
需要说明的是,其执行过程虽与 SISD
的类似,但实际的解决方式是不同的。每次控制部件执行的 PE
类指令表面上是标量指令,实际上已等效于向量指令,如向量取、向量存、向量加、向量乘等,是 8 个 PE
并行地执行同一条指令。每次播送时,利用阵列处理机的播送功能,将处理单元 PEK
中累加寄存器 RGAK
的内容,经控制部件 CU
播送到全部 8 8 8 个处理单元的 RGA
中去。
然而,为了让各个处理单元 PEi
尽可能只访问所带局部存储器 PEMi
,以保证高速处理,就必须要求对矩阵 A , B , C A,B, C A,B,C 各分量在局部存储器中的分布,采用如图6.8所示的方案。
如果把 ILLIAC-Ⅳ
的 64 64 64 个处理单元全部利用起来并行运算,即把 K
循环的运算也改为并行,还可以进一步提高速度,但需要在阵列存储器中重新恰当地分配数据,同时还要使 8 8 8 个中间积 A ( I , K ) × B ( K , J ) A(I, K)×B( K, J) A(I,K)×B(K,J) 能够并行相加(其中, 0 ≤ K ≤ 7 0≤K≤7 0≤K≤7),这就要用到下面的累加和并行算法。即使如此,就 K K K 的并行来说,速度的提高也不是 8 8 8 倍,而只是 8 / log 2 8 8/ \log_2 8 8/log28 ,接近于 2.7 2.7 2.7 倍。
6.3.3 累加和
这是一个将 N N N 个数的顺序相加转为并行相加的问题。为得到各项累加的部分和以及最后的总和,要用到处理单元中的活跃标志位。只有处于活跃状态的处理单元才能执行相应的操作。为叙述方便取 N = 8 N = 8 N=8 ,即有 8 8 8 个数 A ( I ) ( 0 ≤ i ≤ 7 ) A(I) \ (0 \le i \le 7) A(I) (0≤i≤7) 顺序累加。
在 SISD
计算机上可以写成下列FORTRAN程序:
C = 0
DO 10 I = 0, 7
10 C = C + A(I)
这是一个串行程序,需要 8 8 8 次加法时间。在阵列处理机上用成对递归相加算法,只需 l o g 2 8 = 3 log_2 8 = 3 log28