The Wayback Machine - https://web.archive.org/web/20221109182315/https://baike.sogou.com/kexue/d10158.htm

并行计算

编辑
IBM的蓝色基因大规模并行超级计算机。

并行计算是一种同时进行许多计算或执行多个进程的算法。[1]大问题通常可以分成小问题,然后可以同时解决。并行计算有几种不同的形式:位级、指令级、数据和任务并行。并行性长期以来被用于高性能计算中,但由于物理约束阻止了频率拓展,因此它得到了更广泛的关注。[2]近年来,计算机的功耗(以及由此产生的热量)已成为人们关注的焦点,[3]并行计算已经成为计算机体系结构中的主导范例,主要是以多核处理器的形式出现。[4]

并行计算与并发计算密切相关——它们经常一起使用,并且经常合并使用,尽管两者是不同的:可能在没有并发的情况下实现并行(例如位级并行)也可能在没有并行的情况下实现并发(例如在单核中央处理器上通过分时进行多任务处理)。[5][6] 在并行计算中,一个计算任务通常被分解成几个(通常是许多)非常相似的子任务,这些子任务可以独立处理,并且在完成后将它们的结果合并在一起。相反,在并发计算中,各种进程通常不处理相关任务;当它们这样处理时(就像分布式计算中的典型情况一样)单独的任务可能具有不同的性质,并且在执行过程中经常需要一些进程间通信。

并行计算机可以根据硬件支持并行性的级别进行粗略分类,多核和多处理器计算机在一台机器中具有多个处理元素,而集群、多处理器和网格使用多台计算机来完成同一任务。专门的并行计算机体系结构有时与传统处理器一起使用,以加速特定的任务。

在某些情况下,并行性对程序员来说是透明的,例如在位级或指令级并行性中,但是显式并行算法,尤其是那些使用并发性的算法,比顺序算法更难编写,[7] 因为并发性引入了几类新的潜在软件错误,其中竞争条件是最常见的。不同子任务之间的通信和同步通常是获得良好并行程序性能的最大障碍。

阿姆达尔定律给出了单个程序并行加速的理论上限。

1 背景编辑

传统上,计算机软件是为串行计算而编写的。为了解决问题,构造算法并将其实现为串行指令流。这些指令在一台计算机的中央处理器上执行。一次只能执行一条指令——该指令完成后,执行下一条指令。[8]

另一方面,并行计算同时使用多个处理元素来解决问题。这是通过将问题分解成独立的部分来实现的,这样每个处理元素可以与其他元素同时执行其算法部分。处理元素可以是多种多样的,包括资源,例如具有多个处理器的单个计算机、多台联网计算机、专用硬件或上述的任意组合。[8] 历史上,并行计算用于科学计算和科学问题的模拟,特别是在自然科学和工程科学中,如气象学。这导致了并行硬件和软件的设计,以及高性能计算。[9]

从20世纪80年代中期到2004年,频率调整是计算机性能提高的主要原因。程序的运行时间等于指令数量乘以每条指令的平均时间。在保持其他所有参数不变的情况下,增加时钟频率可以减少执行指令的平均时间。因此,频率的增加会减少所有计算绑定程序的运行时间。[10]然而,芯片的功耗P由等式P = C × V 2 × F给出,其中C是每个时钟周期切换的电容(与输入变化的晶体管数量成比例),V是电压,F是处理器频率(每秒周期数)。[11]频率的增加会增加处理器的功耗。处理器功耗的增加最终导致英特尔在2004年5月8日取消了其Tejas和Jayhawk处理器,这通常被认为是频率扩展的终结,是占主导地位的计算机架构范例。[12]

为了解决功耗和过热的问题,主要的中央处理单元(CPU或处理器)制造商开始生产具有多核的高能效处理器。核心是处理器的计算单元,在多核处理器中,每个核心都是独立的,可以同时访问相同的内存。多核处理器已经将并行计算带到台式计算机上。因此,串行程序的并行化已成为主流编程任务。2012年,四核处理器成为台式计算机的标准配置,而服务器有10和12个核心处理器。根据摩尔定律,可以预测每个处理器的内核数量将每18-24个月翻一番。这可能意味着,2020年后,典型的处理器将拥有数十或数百个内核。[13]

操作系统可以确保不同的任务和用户程序在可用内核上并行运行。然而,为了让串行软件程序充分利用多核架构,程序员需要重组和并行化代码。应用软件运行时间的加速将不再通过频率缩放来实现,而是程序员需要并行化他们的软件代码,以利用多核架构不断增长的计算能力。[14]

1.1 阿姆达尔(Amdahl)定律和古斯塔夫(Gustafson)森定律

阿姆达尔定律的图示。程序通过并行化的加速会受到其可并行化程度的限制。例如,如果90%的程序可以并行化,无论使用多少处理器,理论上使用并行计算的最大加速将是10倍。

假设一个任务有两个独立的部分,A和B。B部分大约占整个计算时间的25%。 通过努力,人们可以使这部分速度提高5倍,但这只会稍稍缩短整个计算的时间。 相比之下,人们可能只需要执行较少的工作就能使A部分的速度提高两倍。 这将使计算比通过优化B部分快得多,即使B部分的加速比率更大(5倍对2倍)。

最理想的情况是,并行化的加速是线性的——处理元素的数量翻倍应该使运行时间减半,并且第二次加倍应该再次使运行时间减半。然而,很少有并行算法实现最佳加速。对于少量的处理元素,它们中的大多数具有近似线性的加速,对于大量的处理元素,该加速展平为恒定值。

阿姆达尔定律给出了并行计算平台上算法的潜在加速比[15]

 

其中

  • Slatency是整个任务执行延迟的潜在加速比;
  • s是任务的可并行部分的执行延迟的加速比;
  • p是整个任务在并行化之前可并行化部分的执行时间占整个任务执行时间的百分比。

由于Slatency < 1/(1 - p),它表明程序中不能并行化的一小部分将限制并行化的整体加速。解决大型数学或工程问题的程序通常由几个可并行部分和几个不可并行(串行)部分组成。如果程序的不可并行部分占运行时间的10%(p = 0.9),无论增加多少处理器,我们都只能得到不超过10倍的加速比。这给添加更多并行执行单元的有用性设置了上限。“当任务因连续约束而无法分割时,更多努力的应用对进度没有影响。正如不管分配多少妇女,生孩子都需要九个月。”[16]

阿姆达尔定律只适用于问题规模固定的情况。实际上,随着更多的计算资源变得可用,它们往往用于更大的问题(更大的数据集),并且在可并行部分花费的时间通常比固有的串行工作增长得快得多。[17]在这种情况下,古斯塔夫森定律对并行性能给出了一个不那么悲观和更现实的评估:[18]

古斯塔夫森定律的图示。.

 

阿姆达尔定律和古斯塔夫森定律都假设程序串行部分的运行时间与处理器数量无关。阿姆达尔定律假设整个问题的规模是固定的,因此并行完成的总工作量也与处理器数量无关,而古斯塔夫森定律假设并行完成的总工作量随处理器数量线性变化。

1.2 依赖性

理解数据依赖性是实现并行算法的基础。没有任何程序能比最长的依赖计算链(称为关键路径)运行得更快,因为依赖于链中先前计算的计算必须按顺序执行。然而,大多数算法不仅仅由一长串相关计算组成;通常有机会并行执行独立运算。

设Pi和Pj为两个程序段。伯恩斯坦条件[19]描述了两者何时是独立的,何时可以并行执行。对于Pi,设Ii为所有的输入变量,Oi为输出变量,Pj也是如此。Pi和Pj独立,如果两者满足

 

 

 

违反第一条件会引入流依赖性,对应于产生第二段使用的结果的第一段。当第二段产生第一段所需的变量时,第二个条件表示反依赖。第三个也是最后一个条件代表输出依赖:当两个段写入同一个位置时,结果来自逻辑上最后执行的段。[20]

考虑以下函数,这些函数演示了几种依赖关系:

1:function Dep(a,b)
2: c := a * b
3: d := 3 * c
4:end function

在这个例子中,指令3不能在指令2之前执行(或者甚至与指令2并行执行),因为指令3使用来自指令2的结果。它违反了条件1,因此引入了流依赖性。

1:function NoDep(a,b)
2: c := a * b
3: d := 3 * b
4: e := a + b
5:end function

在这个例子中,指令之间没有依赖关系,所以它们都可以并行运行。

伯恩斯坦条件不允许不同进程之间共享内存。为此,必须使用一些方法在访问之间强制排序,例如信号量、障碍或其他一些同步方法。

1.3 条件竞争、互斥、同步和并行减速

并行程序中的子任务通常被称为线程。一些并行计算机体系结构使用更小、更轻的线程版本(称为光纤),而另一些则使用较大版本的线程(称为进程)。然而,“线程”通常被认为是子任务的通用术语。[21] 线程通常需要同步访问对象或其他资源,例如当它们必须更新它们之间共享的变量时。如果不同步,两个线程之间的指令可以以任何顺序交错。例如,考虑以下程序:

线程A 线程B
1A:读变量V 1B:读变量V
2A:变量V加一 2B:变量V加一
3A:写回变量V 3B:写回变量V

如果指令1B在1A和3A之间执行,或者指令1A在1B和3B之间执行,程序将产生不正确的数据。这就是所谓的竞争条件。程序员必须使用锁来提供互斥。锁是一种编程语言结构,它允许一个线程控制一个变量,并防止其他线程读写它,直到该变量被解锁。持有锁的线程可以自由执行其临界区(程序中需要独占访问某个变量的部分),并在完成后解锁数据。因此,为了保证正确的程序执行,可以重写上述程序以使用锁:

线程A 线程B
1A:锁定变量V 1B:锁定变量V
2A:读变量V 2B:读变量V
3A:变量V加1 3B:变量V加一
4A:写回变量V 4B:写回变量V
5A:解锁变量V 5B:解锁变量V

一个线程将成功锁定变量V,而另一个线程将被锁定——直到V再次解锁后才能继续。这保证了程序的正确执行。当线程必须序列化对资源的访问时,锁可能是确保正确执行程序所必需的,但是使用锁会大大降低程序的速度,并可能影响其可靠性。[22]

使用非原子锁锁定多个变量可能导致程序死锁。原子锁一次锁定多个变量。如果它不能锁定所有这些,它也不会锁定其中任何一个。如果两个线程都需要使用非原子锁来锁定相同的两个变量,那么一个线程可能会锁定其中一个变量,第二个线程可能会锁定第二个变量。在这种情况下,两个线程都无法完成,从而导致死锁。[23]

许多并行程序要求它们的子任务同步运行。这需要使用屏障。屏障通常使用锁或信号量来实现。[24]一类被称为无锁和无等待算法的算法完全避免了锁和屏障的使用。然而,这种方法通常难以实现,需要正确设计的数据结构。[25]

并非所有的并行化都会加快速度。通常,当一个任务被分成越来越多的线程时,这些线程花费越来越多的时间相互通信或等待对方访问资源。[26][27]一旦资源争用或通信的开销占用了花费在其他计算上的时间,进一步的并行化(即,将工作负载分成更多的线程)会增加而不是减少完成所需的时间。这个问题称为并行减速,[28]在某些情况下可以通过软件分析和重新设计得到改善。[29]

1.4 细粒度、粗粒度和高度并行

应用程序通常根据其子任务需要同步或相互通信的频率进行分类。如果应用程序的子任务每秒必须进行多次通信,则该应用程序表现出细粒度的并行性;如果它们每秒不多次通信,就会显示出粗粒度的并行性;如果它们很少或从不需要通信,就会显示出高度并行性。高度并行程序被认为是最容易并行化的。

1.5 一致性模型

并行编程语言和并行计算机必须有一个一致性模型(也称为内存模型)。一致性模型定义了如何在计算机内存上进行操作以及如何产生结果的规则。

最早的一致性模型之一是莱斯利•兰波特(Leslie Lamport)的顺序一致性模型。顺序一致性是并行程序的一个特性,其并行执行产生与顺序程序相同的结果。具体地说,如果“任何执行的结果与所有处理器的操作以某种顺序执行的一样,并且每个处理器的操作都以其程序指定的顺序出现在该顺序中”,则程序是顺序一致的。[30]

软件事务内存是一种常见的一致性模型。软件事务内存借鉴了数据库理论中原子事务的概念,并将其应用于内存访问。

从数学上讲,这些模型可以用几种方式来表示。Petri网于1962年引入,是编纂一致性模型规则的早期尝试。后来的数据流理论就是建立在这些基础之上,并创建了数据流体系架构来物理实现数据流理论的思想。从20世纪70年代末开始,诸如通信系统微积分和通信顺序进程之类的进程演算被开发出来,以允许对由交互组件组成的系统进行代数推理。进程演算家族最近的新增功能,如π演算,增加了动态拓扑的推理能力。诸如Lamport的TLA +之类的逻辑以及诸如轨迹和Actor事件图之类的数学模型也被开发用于描述并发系统的行为。

1.6 弗林分类法

Michael J. Flynn为计算机和系统创建了最早的并行(和顺序)分类系统之一,现在被称为弗林分类法。弗林根据程序和计算机是使用一组指令还是多组指令进行操作,以及这些指令是使用一组还是多组数据来对它们进行分类。

单指令单数据(SISD)分类相当于一个完全顺序程序。单指令多数据(SIMD)分类类似于对大数据集重复执行相同的操作。这在信号处理应用程序中很常见。多指令单数据(MISD)是一种很少使用的分类。尽管设计了处理这一问题的计算机体系结构(如脉动阵列),但很少有适合这一类的应用得以实现。多指令多数据(MIMD)程序是目前最常见的并行程序类型。

大卫•帕特森(David A. Patterson)和约翰•轩尼诗(John L. Hennessy)认为,“当然,有些机器是这些类别的混合体,但这种经典模型之所以能够存活下来,是因为它简单、易于理解,并且给出了一个很好的一阶近似值。可能是因为它易于理解,它也是最广泛使用的方案。”[31]

2 并行类型编辑

2.1 位级并行

从20世纪70年代超大规模集成电路(VLSI)计算机芯片制造技术的出现到大约1986年,计算机体系结构的加速由计算机字长(处理器每个周期可以处理的信息量)翻倍驱动。[32]增加字长可以减少处理器对大于字长的变量执行操作时必须执行的指令数量。例如,在8位处理器必须添加两个16位整数的情况下,处理器必须首先使用标准加法指令将每个整数的8个低位相加,然后使用带进位加法指令将8个高位相加,并将低位相加的进位相加;因此,8位处理器需要两条指令来完成单个操作,而16位处理器能够用一条指令来完成操作。

从历史上看,4位微处理器依次被8位、16位、32位微处理器取代。随着32位处理器的引入,这一趋势基本结束,20年来,32位处理器一直是通用计算的标准。直到21世纪初,随着x86-64架构的出现,64位处理器才变得司空见惯。

2.2 指令级并行

没有流水线的标准处理器。完成一条指令需要五个时钟周期,因此处理器可获得降级的标量性能 (IPC = 0.2 < 1).

一种规范的五级流水线处理器。在最佳情况下,完成一条指令需要一个时钟周期,因此处理器可获得标量性能 (IPC = 1).

计算机程序本质上是由处理器执行的指令流。如果没有指令级并行,处理器每个时钟周期只能发出少于一条指令(IPC < 1)。这些处理器被称为子标量处理器。这些指令可以重新排序并组合成组,然后在不改变程序结果的情况下并行执行。这被称为指令级并行。从20世纪80年代中期到90年代中期,指令级并行性的发展主导了计算机体系结构。[33]

所有现代处理器都有多级指令流水线。流水线中的每个阶段对应于处理器在该阶段对该指令执行的不同动作;具有N级流水线的处理器在不同的完成阶段可以有多达N条不同的指令,因此每个时钟周期可以发出一条指令(IPC = 1)。这些处理器被称为标量处理器。流水线处理器的典型例子是RISC处理器,它有五个阶段:指令获取(IF),指令解码(ID),执行(EX),存储器访问(MEM)和寄存器写回(WB)。奔腾4处理器有35级流水线。[34]

一种规范的五级流水线超标量处理器。在最佳情况下,完成两条指令需要一个时钟周期,因此处理器可以获得超标量性能 (IPC = 2 > 1).

大多数现代处理器也有多个执行单元。它们通常将这一特性与流水线操作结合起来,因此每个时钟周期可以发出多条指令(IPC > 1)。这些处理器被称为超标量处理器。只有当指令之间没有数据依赖性时,才能将它们组合在一起。记分牌和Tomasulo算法(类似记分牌算法,但利用寄存器重命名)是实现无序执行和指令级并行的两种最常见的技术。

2.3 任务并行

任务并行性是并行程序的特征,即“可以对相同或不同的数据集执行完全不同的计算”。[35] 这与数据并行形成对比,后者对相同或不同的数据集执行相同的计算。任务并行包括将任务分解成子任务,然后将每个子任务分配给处理器执行。然后,处理器将同时执行这些子任务,并且通常协同执行。任务并行通常不会随着问题的大小而变化。[36]

3 硬件编辑

3.1 存储器和通信

并行计算机中的主内存要么是共享内存(在单个地址空间中的所有处理元素之间共享),要么是分布式内存(其中每个处理元素都有自己的本地地址空间)。[37] 分布式内存是指内存在逻辑上是分布式的,但通常也意味着它在物理上是分布式的。分布式共享内存和内存虚拟化结合了这两种方法,其中处理元件具有自己的本地内存并且可以访问非本地处理器上的内存。访问本地内存通常比访问非本地内存更快。

非统一内存访问(NUMA)体系结构的逻辑视图。一个目录中的处理器访问该目录的内存比访问另一个目录的内存延迟更短。

可以以相等的延迟时间和带宽访问主存储器的每个单元的计算机体系结构被称为统一内存访问(UMA)系统。通常,这只能通过共享内存系统来实现,其中内存不是物理分布的。不具有此属性的系统称为非统一内存访问(NUMA)体系结构。分布式内存系统具有非均匀的内存访问。

计算机系统利用高速缓存——位于处理器附近的小型快速存储器,存储存储器值的临时副本(在物理和逻辑意义上都在附近)。并行计算机系统在多个位置存储相同值的高速缓存方面存在困难,可能会导致程序执行错误。这些计算机需要一个缓存一致性系统,该系统跟踪高速缓存的值并战略性地清除它们,从而确保程序正确执行。总线监听是跟踪正在访问哪些值(因此应该被清除)的最常见方法之一。设计大型、高性能缓存一致性系统是计算机体系结构中的一个难题。因此,共享内存计算机体系结构的扩展不如分布式内存系统。[37]

处理器-处理器和处理器-内存通信可以通过多种方式在硬件中实现,包括共享(多端口或多路复用)内存、交叉开关、共享总线或多种拓扑结构的互连网络,包括星形、环形、树形、超立方体、胖超立方体(一个节点上有多个处理器的超立方体)或n维网格。

基于互连网络的并行计算机需要某种路由,以便能够在没有直接连接的节点之间传递消息。在大型多处理器机器中,用于处理器之间通信的介质可能是分层的。

3.2 并行计算机分类

并行计算机可以根据硬件支持并行的级别大致分类。这种分类大致类似于基本计算节点之间的距离。这些不是相互排斥的;例如,对称多处理器集群相对常见。

多核计算

多核处理器是指在同一芯片上包含多个处理单元(称为“核”)的处理器。该处理器不同于超标量处理器,超标量处理器包括多个执行单元,并且可以在每个时钟周期从一个指令流(线程)发出多个指令;相反,多核处理器可以在每个时钟周期从多个指令流发出多个指令。为索尼PlayStation 3设计的IBM手机微处理器是一款卓越的多核处理器。多核处理器中的每个内核都可能是超标量的——也就是说,在每个时钟周期,每个内核可以从一个线程发出多个指令。

指令流水线(其中英特尔超线程技术最为著名)是伪多核主义的早期形式。能够并发多线程的处理器在同一个处理单元中包括多个执行单元——也就是说,它具有超标量体系结构——并且可以在每个时钟周期从多个线程发出多个指令。另一方面,时间多线程包括同一处理单元中的单个执行单元,并且一次可以从多个线程发出一条指令。

对称多处理

对称多处理器是具有多个相同处理器的计算机系统,这些处理器共享内存并通过总线连接。[38]总线争用防止总线架构扩展。因此,SMP通常不包括超过32个处理器。[39]由于处理器的小尺寸和大高速缓存对总线带宽的要求的显著降低,如果存在足够的存储器带宽,这种对称多处理器非常具有成本效益。[38]

分布式计算

分布式计算机(也称为分布式内存多处理器)是一种分布式内存计算机系统,其中处理元件通过网络连接。分布式计算机具有高度的可扩展性。术语“并行计算”、“并行计算”和“分布式计算”有很多重叠,它们之间没有明显的区别。[40]同一个系统可以同时具有“并行”和“分布式”的特征;典型分布式系统中的处理器并行运行。[41]

集群计算

贝奥武夫集群

集群是一组松散耦合、紧密协作的计算机,因此在某些方面它们可以被视为一台计算机。[42] 集群由通过网络连接的多个独立机器组成。虽然集群中的机器不必对称,但如果不是对称的,负载平衡就更加困难。最常见的集群类型是Beowulf集群,它是在与TCP/IP以太网局域网相连的多台相同商用现成计算机上实现的集群。[43] Beowulf技术最初是由Thomas Sterling and Donald Becker开发的。500强超级计算机中有87%是集群。[44] 其余的是大规模并行处理器,解释如下:

因为网格计算系统(如下所述)可以轻松处理高度并行问题,所以现代集群通常被设计用来处理更困难的问题——需要节点更频繁地相互共享中间结果的问题。这需要高带宽,更重要的是,需要低延迟的互连网络。许多历史上和当前的超级计算机都使用专门为集群计算设计的定制高性能网络硬件,例如克雷双子网络(Cray Gemini network)。[45] 截至2014年,大多数当前的超级计算机使用一些现成的标准网络硬件,通常是Myrinet、InfiniBand或千兆以太网。

大规模并行计算

一个来自IBM蓝色基因大规模并行超级计算机的机柜。

大规模并行处理机是一台带有许多网络处理器的计算机。MPP具有许多与集群相同的特性,但是MPP具有专门的互连网络(而集群使用商用硬件进行联网)。MPP也往往比集群大,通常有“远远超过”100个处理器。[46] 在MPP中,“每个中央处理器都包含自己的内存以及操作系统和应用程序的副本。每个子系统通过高速互连与其他子系统通信。”[47]

IBM的Blue Gene / L是MPP,根据2009年6月的TOP500排名,它是世界上第五快的超级计算机。

网格计算

网格计算是最分布式的并行计算形式。它利用计算机在因特网上通信来解决给定的问题。由于互联网的低带宽和极高的延迟,分布式计算通常只处理高度并行问题。已经创建的许多分布式计算应用程序中,最著名的例子是SETI@home和Folding@home。[48]

大多数网格计算应用程序使用中间件(位于操作系统和应用程序之间的软件,用于管理网络资源和标准化软件接口)。最常见的分布式计算中间件是Berkeley Open Infrastructure for Network Computing (BOINC)。通常,分布式计算软件利用“空闲周期”,在计算机空闲时执行计算。

专用并行计算机

在并行计算中,有一些专门的并行设备仍然是人们感兴趣的领域。虽然不是特定领域的,但它们往往只适用于几类并行问题。

现场可编程门阵列(FPGA)的可重构计算

可重构计算是使用现场可编程门阵列(FPGA)作为通用计算机的协处理器。从本质上说,现场可编程门阵列是一种计算机芯片,可以为给定的任务重新布线。

FPGAs可以用硬件描述语言编程,如VHDL或Verilog。然而,用这些语言编程可能很乏味。一些供应商已经创建了从C到HDL的语言,试图模仿大多数程序员都熟悉的C编程语言的语法和语义。从C语言到HDL语言,最著名的语言是Mitrion-C、pulse-C、DIME-C和Handel-C。基于C++的SystemC的特定子集也可以用于此目的。

AMD决定向第三方供应商开放其超传输技术,这已成为高性能可重构计算的支持技术。[49] 据刚果民主共和国计算机公司首席运营官Michael R. D'Amour说,“当我们第一次走进AMD时,他们称我们为‘插座盗贼’现在他们称我们为他们的伙伴。"[49]

通用图形处理器(GPGPU)

英伟达的 特斯拉图形处理器卡

通用图形处理器(GPGPU)是计算机工程研究的一个新趋势。图形处理器是为计算机图形处理而高度优化的协处理器。[50] 计算机图形处理是一个由数据并行操作——特别是线性代数矩阵操作——主导的领域。

在早期,GPGPU程序使用普通的图形应用程序接口来执行程序。然而,几种新的编程语言和平台已被建立,分别使用Nvidia和AMD发布的编程环境CUDA和Stream SDK在GPU上进行通用计算。其他GPU编程语言包括BrookGPU、PeakStream和RapidMind。Nvidia还发布了特斯拉系列的特定计算产品。技术联盟Khronos集团发布了OpenCL规范,这是一个编写程序的框架,用于编写跨CPU和GPU平台执行的程序。 AMD、Apple、Intel、Nvidia和其他公司都支持OpenCL。

专用集成电路

为处理并行应用,设计了几种专用集成电路(ASIC)方法。[51][52][53]

因为专用集成电路(根据定义)是特定于给定应用程序的,所以它可以针对该应用程序进行完全优化。因此,对于给定的应用程序,专用集成电路往往优于通用计算机。然而,专用集成电路是通过UV光刻技术制造的。这个过程需要一套掩膜组件,这可能非常昂贵。一套掩膜要花100多万美元。[54](芯片所需的晶体管越小,掩模就越贵。)与此同时,随着时间的推移,通用计算的性能提高(如摩尔定律所描述的)往往会在一两代芯片中抵消这些收益。[49]高昂的初始成本,以及被摩尔定律驱动的通用计算所取代的趋势,使得专用集成电路对于大多数并行计算应用不可行。然而,有些已经建成。一个例子是PFLOPS RIKEN MDGREEP-3机器,它使用定制的专用集成电路进行分子动力学模拟。

矢量处理器

Cray-1 是一个矢量处理器。

矢量处理器是一个中央处理器或计算机系统,可以对大量数据执行相同的指令。矢量处理器具有处理数字或向量的线性数组的高级操作。矢量运算的一个例子是A = B × C,其中A、B和C分别是64位浮点数的64元向量。[55] 它们与弗林的SIMD分类法密切相关。[55]

克雷计算机在20世纪70年代和80年代因其矢量处理计算机而闻名。然而,矢量处理器——无论是作为CPU还是作为完整的计算机系统——已经基本消失了。现代处理器指令集确实包括一些矢量处理指令,例如飞思卡尔半导体的AltiVec和英特尔的流式SIMD扩展(SSE)。

4 软件编辑

4.1 并行编程语言

并行编程语言、库、应用编程接口和并行编程模型(如算法框架)已经为并行计算机编程而创建。根据它们对底层内存体系结构(共享内存、分布式内存或共享分布式内存)的假设,通常可以将它们分为几类。共享内存编程语言通过操纵共享内存变量进行通信。分布式内存使用消息传递。POSIX线程和OpenMP是使用最广泛的两种共享内存应用程序接口,而消息传递接口(MPI)是使用最广泛的消息传递系统应用程序接口。[56] 并行程序编程中使用的一个概念是未来概念,即程序的一部分承诺在未来某个时间向程序的另一部分提供所需的数据。

CAPS 企业和Pathscale也在协调他们的工作,使混合多核并行编程(HMPP)指令成为一个称为OpenHMPP的开放标准。基于OpenHMPP指令的编程模型提供了一种语法,可以有效地卸载硬件加速器上的计算,并优化数据进出硬件存储器中的移动。OpenHMPP指令描述了加速器设备(例如图形处理器)上的远程过程调用(RPC),或者更一般地说是一组内核。指令注释C或Fortran代码描述了两组功能:将过程(用代码表示)卸载到远程设备上,以及优化中央处理器主内存和加速器内存之间的数据传输。

消费类GPU的兴起导致了对计算内核的支持,无论是在图形应用程序接口(称为计算着色器)中、专用应用程序接口(如OpenCL)中还是在其他语言扩展中。

4.2 自动并行化

编译器对顺序程序的自动并行化是并行计算的“圣杯”,特别是在上述处理器频率的限制下。尽管编译器研究人员做了几十年的工作,但自动并行化只取得了有限的成功。[57]

主流并行编程语言要么保持显式并行,要么保持(至多)部分隐式,在这种语言中,程序员给出编译器的并行指令。存在一些完全隐式的并行编程语言——SISAL, Parallel Haskell, SequenceL, System C (for FPGAs), Mitrion-C, VHDL和Verilog。

4.3 应用程序检查点

随着计算机系统复杂性的增加,平均故障间隔时间通常会缩短。应用程序检查点是一种技术,计算机系统借此获取应用程序的“快照”——所有当前资源分配和可变状态的记录,类似于核心转储。如果计算机出现故障,可以利用该信息恢复程序。应用程序检查点意味着程序只能从最后一个检查点重新启动,而不是从开始重新启动。虽然检查点在各种情况下都有好处,但它在使用大量处理器的高度并行系统的高性能计算中尤其有用。[58]

5 算法方法编辑

随着并行计算机变得越来越大、越来越快,我们现在能够解决以前运行时间太长而无法运行的问题。生物信息学(用于蛋白质折叠和序列分析)和经济学(用于数学金融)等领域都利用了并行计算。并行计算应用中常见的问题类型包括:[59]

  • 稠密线性代数
  • 稀疏线性代数
  • 光谱方法(如Cooley–Tukey快速傅立叶变换)
  • N体问题如Barnes-Hut模拟)
  • 结构化网格问题(如格子玻尔兹曼方法)
  • 非结构化网格问题(例如在有限元分析中发现的问题)
  • 蒙特卡罗法
  • 组合逻辑(如强力密码技术)
  • 图形遍历(如排序算法)
  • 动态规划
  • 分支和绑定方法
  • 图形模型(例如检测隐马尔可夫模型和构建贝叶斯网络)
  • 有限状态机模拟

6 容错编辑

并行计算也可以应用于容错计算机系统的设计,特别是通过并行执行相同操作的锁步系统。这在一个组件发生故障的情况下提供了冗余,并且如果结果不同,还允许自动检错和纠错。这些方法可以有助于防止由瞬时错误引起的单事件干扰。[60]尽管在嵌入式或专用系统中可能需要额外的措施,但这种方法可以提供一种经济高效的方法,在商用现成系统中实现n模块冗余。

7 历史编辑

伊利亚茨四世,最 "臭名昭著“的超级计算机”.[1]

真正(MIMD)并行性的起源可以追溯到 Luigi Federico Menabrea和他的Charles Babbage发明的分析引擎草图。[62][63][64]

1958年4月,S.Gill(Ferranti)讨论了并行编程以及分支和等待的必要性。同样在1958年,IBM研究人员 John Cocke和Daniel Slotnick首次讨论了并行性在数值计算中的应用。[65]巴勒斯公司在1962年推出了D825,这是一台四处理器计算机,通过交叉开关可以访问多达16个内存模块。[66]1967年,Amdahl和Slotnick在美国信息处理协会联盟会议上发表了一篇关于并行处理可行性的辩论。[65]正是在这场辩论中,阿姆达尔定律被创造出来,用来定义并行加速的极限。

1969年,霍尼韦尔推出了第一个Multics系统,这是一个对称的多处理器系统,能够并行运行多达八个处理器。[65]上世纪70年代卡内基梅隆大学的一个多处理器项目——C.mmp,是首批拥有多个处理器的多处理器之一。第一个带有监听缓存的总线连接多处理器是1984年的Synapse N+1。[63]

SIMD并行计算机可以追溯到20世纪70年代。早期SIMD计算机背后的动机是将处理器控制单元的门延迟分摊到多个指令上。[67]1964年,Slotnick提议为劳伦斯•利弗莫尔国家实验室建造一台大规模并行计算机。[65]他的设计是由美国空军资助的,这是SIMD最早的并行计算项目——ILLIAC IV。[65]其设计的关键是具有相当高的并行性,多达256个处理器,这使得机器能够在后来被称为矢量处理的大型数据集上工作。然而,ILLIAC IV被称为“最臭名昭著的超级计算机”,因为该项目只完成了四分之一,但花费了11年,成本几乎是最初估计的四倍。[61]1976年,当它终于准备好运行它的第一个真正的应用程序时,它的性能超过了现有的商用超级计算机,如Cray-1。

8 生物大脑作为大规模并行计算机编辑

20世纪70年代初,在麻省理工学院计算机科学和人工智能实验室,马文·明斯基(Marvin Minsky)和西摩·派珀特(Seymour Papert)开始发展心理学会理论,该理论将生物大脑视为大规模并行计算机。1986年,明斯基出版了《心智社会》,声称“心智是由许多小代理人组成的,每一个代理人自己都没有心智”。[68]该理论试图解释我们所说的智能是如何成为非智能部分相互作用的产物的。明斯基说,关于这一理论的最大想法来源于他试图创造一种机器的工作,这种机器使用机械臂、摄像机和计算机来建造儿童积木。[69]

类似的模型(也将生物大脑视为大规模并行计算机,即大脑由一组独立或半独立的代理组成)也描述为:

  • Thomas R. Blakeslee,[70]
  • Michael S. Gazzaniga,[71][72]
  • Robert E. Ornstein,[73]
  • Ernest Hilgard,[74][75]
  • Michio Kaku,[76]
  • George Ivanovich Gurdjieff,[77]
  • Neurocluster大脑模型。[78]

参考文献

  • [1]

    ^Gottlieb, Allan; Almasi, George S. (1989). Highly parallel computing. Redwood City, Calif.: Benjamin/Cummings. ISBN 978-0-8053-0177-9..

  • [2]

    ^S.V. Adve et al. (November 2008). "Parallel Computing Research at Illinois: The UPCRC Agenda" Archived 2018-01-11 at the Wayback Machine (PDF). Parallel@Illinois, University of Illinois at Urbana-Champaign. "The main techniques for these performance benefits—increased clock frequency and smarter but increasingly complex architectures—are now hitting the so-called power wall. The computer industry has accepted that future performance increases must largely come from increasing the number of processors (or cores) on a die, rather than making a single core go faster.".

  • [3]

    ^Asanovic et al. Old [conventional wisdom]: Power is free, but transistors are expensive. New [conventional wisdom] is [that] power is expensive, but transistors are "free"..

  • [4]

    ^Asanovic, Krste et al. (December 18, 2006). "The Landscape of Parallel Computing Research: A View from Berkeley" (PDF). University of California, Berkeley. Technical Report No. UCB/EECS-2006-183. "Old [conventional wisdom]: Increasing clock frequency is the primary method of improving processor performance. New [conventional wisdom]: Increasing parallelism is the primary method of improving processor performance… Even representatives from Intel, a company generally associated with the 'higher clock-speed is better' position, warned that traditional approaches to maximizing performance through maximizing clock speed have been pushed to their limits.".

  • [5]

    ^"Concurrency is not Parallelism", Waza conference Jan 11, 2012, Rob Pike (slides) (video).

  • [6]

    ^"Parallelism vs. Concurrency". Haskell Wiki..

  • [7]

    ^Hennessy, John L.; Patterson, David A.; Larus, James R. (1999). Computer organization and design: the hardware/software interface (2. ed., 3rd print. ed.). San Francisco: Kaufmann. ISBN 978-1-55860-428-5..

  • [8]

    ^Barney, Blaise. "Introduction to Parallel Computing". Lawrence Livermore National Laboratory. Retrieved 2007-11-09..

  • [9]

    ^Thomas Rauber; Gudula Rünger (2013). Parallel Programming: for Multicore and Cluster Systems. Springer Science & Business Media. p. 1. ISBN 9783642378010..

  • [10]

    ^Hennessy, John L.; Patterson, David A. (2002). Computer architecture / a quantitative approach (3rd ed.). San Francisco, Calif.: International Thomson. p. 43. ISBN 978-1-55860-724-8..

  • [11]

    ^Rabaey, Jan M. (1996). Digital integrated circuits : a design perspective. Upper Saddle River, N.J.: Prentice-Hall. p. 235. ISBN 978-0-13-178609-7..

  • [12]

    ^Flynn, Laurie J. (8 May 2004). "Intel Halts Development Of 2 New Microprocessors". New York Times. Retrieved 5 June 2012..

  • [13]

    ^Thomas Rauber; Gudula Rünger (2013). Parallel Programming: for Multicore and Cluster Systems. Springer Science & Business Media. p. 2. ISBN 9783642378010..

  • [14]

    ^Thomas Rauber; Gudula Rünger (2013). Parallel Programming: for Multicore and Cluster Systems. Springer Science & Business Media. p. 3. ISBN 9783642378010..

  • [15]

    ^Amdahl, Gene M. (1967). "Validity of the single processor approach to achieving large scale computing capabilities". Proceeding AFIPS '67 (Spring) Proceedings of the April 18–20, 1967, Spring Joint Computer Conference: 483–485. doi:10.1145/1465482.1465560..

  • [16]

    ^Brooks, Frederick P. (1996). The mythical man month essays on software engineering (Anniversary ed., repr. with corr., 5. [Dr.] ed.). Reading, Mass. [u.a.]: Addison-Wesley. ISBN 978-0-201-83595-3..

  • [17]

    ^Michael McCool; James Reinders; Arch Robison (2013). Structured Parallel Programming: Patterns for Efficient Computation. Elsevier. p. 61..

  • [18]

    ^Gustafson, John L. (May 1988). "Reevaluating Amdahl's law". Communications of the ACM. 31 (5): 532–533. CiteSeerX 10.1.1.509.6892. doi:10.1145/42411.42415. Archived from the original on 2007-09-27..

  • [19]

    ^Bernstein, A. J. (1 October 1966). "Analysis of Programs for Parallel Processing". IEEE Transactions on Electronic Computers. EC-15 (5): 757–763. doi:10.1109/PGEC.1966.264565..

  • [20]

    ^Roosta, Seyed H. (2000). Parallel processing and parallel algorithms : theory and computation. New York, NY [u.a.]: Springer. p. 114. ISBN 978-0-387-98716-3..

  • [21]

    ^"Processes and Threads". Microsoft Developer Network. Microsoft Corp. 2018. Retrieved 2018-05-10..

  • [22]

    ^Krauss, Kirk J (2018). "Thread Safety for Performance". Develop for Performance. Retrieved 2018-05-10..

  • [23]

    ^Tanenbaum, Andrew S. (2002-02-01). "Introduction to Operating System Deadlocks". Informit. Pearson Education, Informit. Retrieved 2018-05-10..

  • [24]

    ^Cecil, David (2015-11-03). "Synchronization internals -- the semaphore". Embedded. AspenCore. Retrieved 2018-05-10..

  • [25]

    ^Preshing, Jeff (2012-06-08). "An Introduction to Lock-Free Programming". Preshing on Programming. Retrieved 2018-05-10..

  • [26]

    ^Schwartz, David (2011-08-15). "What is thread contention?". StackOverflow. Retrieved 2018-05-10..

  • [27]

    ^"What's the opposite of "embarrassingly parallel"?". StackOverflow. Retrieved 2018-05-10..

  • [28]

    ^Kukanov, Alexey (2008-03-04). "Why a simple test can get parallel slowdown". Retrieved 2015-02-15..

  • [29]

    ^Krauss, Kirk J (2018). "Threading for Performance". Develop for Performance. Retrieved 2018-05-10..

  • [30]

    ^Lamport, Leslie (1 September 1979). "How to Make a Multiprocessor Computer That Correctly Executes Multiprocess Programs". IEEE Transactions on Computers. C-28 (9): 690–691. doi:10.1109/TC.1979.1675439..

  • [31]

    ^Patterson and Hennessy, p. 748..

  • [32]

    ^Singh, David Culler ; J.P. (1997). Parallel computer architecture ([Nachdr.] ed.). San Francisco: Morgan Kaufmann Publ. p. 15. ISBN 978-1-55860-343-1..

  • [33]

    ^Culler et al. p. 15..

  • [34]

    ^Patt, Yale (April 2004). "The Microprocessor Ten Years From Now: What Are The Challenges, How Do We Meet Them? Archived 2008-04-14 at the Wayback Machine (wmv). Distinguished Lecturer talk at Carnegie Mellon University. Retrieved on November 7, 2007..

  • [35]

    ^Culler et al. p. 124..

  • [36]

    ^Culler et al. p. 125..

  • [37]

    ^Patterson and Hennessy, p. 713..

  • [38]

    ^Hennessy and Patterson, p. 549..

  • [39]

    ^Patterson and Hennessy, p. 714..

  • [40]

    ^Ghosh (2007), p. 10. Keidar (2008)..

  • [41]

    ^Lynch (1996), p. xix, 1–2. Peleg (2000), p. 1..

  • [42]

    ^What is clustering? Webopedia computer dictionary. Retrieved on November 7, 2007..

  • [43]

    ^Beowulf definition. PC Magazine. Retrieved on November 7, 2007..

  • [44]

    ^"List Statistics | TOP500 Supercomputer Sites". www.top500.org (in 英语). Retrieved 2018-08-05..

  • [45]

    ^"Interconnect" Archived 2015-01-28 at the Wayback Machine..

  • [46]

    ^Hennessy and Patterson, p. 537..

  • [47]

    ^MPP Definition. PC Magazine. Retrieved on November 7, 2007..

  • [48]

    ^Kirkpatrick, Scott (2003). "COMPUTER SCIENCE: Rough Times Ahead". Science. 299 (5607): 668–669. doi:10.1126/science.1081623. PMID 12560537..

  • [49]

    ^D'Amour, Michael R., Chief Operating Officer, DRC Computer Corporation. "Standard Reconfigurable Computing". Invited speaker at the University of Delaware, February 28, 2007..

  • [50]

    ^Boggan, Sha'Kia and Daniel M. Pressel (August 2007). GPUs: An Emerging Platform for General-Purpose Computation (PDF). ARL-SR-154, U.S. Army Research Lab. Retrieved on November 7, 2007..

  • [51]

    ^Maslennikov, Oleg (2002). "Systematic Generation of Executing Programs for Processor Elements in Parallel ASIC or FPGA-Based Systems and Their Transformation into VHDL-Descriptions of Processor Element Control Units". Lecture Notes in Computer Science, 2328/2002: p. 272..

  • [52]

    ^Shimokawa, Y.; Fuwa, Y.; Aramaki, N. (18–21 November 1991). "A parallel ASIC VLSI neurocomputer for a large number of neurons and billion connections per second speed". International Joint Conference on Neural Networks. 3: 2162–2167. doi:10.1109/IJCNN.1991.170708. ISBN 978-0-7803-0227-3..

  • [53]

    ^Acken, Kevin P.; Irwin, Mary Jane; Owens, Robert M. (July 1998). "A Parallel ASIC Architecture for Efficient Fractal Image Coding". The Journal of VLSI Signal Processing. 19 (2): 97–113. doi:10.1023/A:1008005616596..

  • [54]

    ^Kahng, Andrew B. (June 21, 2004) "Scoping the Problem of DFM in the Semiconductor Industry Archived 2008-01-31 at the Wayback Machine." University of California, San Diego. "Future design for manufacturing (DFM) technology must reduce design [non-recoverable expenditure] cost and directly address manufacturing [non-recoverable expenditures]—the cost of a mask set and probe card—which is well over $1 million at the 90 nm technology node and creates a significant damper on semiconductor-based innovation.".

  • [55]

    ^Patterson and Hennessy, p. 751..

  • [56]

    ^The Sidney Fernbach Award given to MPI inventor Bill Gropp refers to MPI as "the dominant HPC communications interface".

  • [57]

    ^Shen, John Paul; Mikko H. Lipasti (2004). Modern processor design : fundamentals of superscalar processors (1st ed.). Dubuque, Iowa: McGraw-Hill. p. 561. ISBN 978-0-07-057064-1. However, the holy grail of such research—automated parallelization of serial programs—has yet to materialize. While automated parallelization of certain classes of algorithms has been demonstrated, such success has largely been limited to scientific and numeric applications with predictable flow control (e.g., nested loop structures with statically determined iteration counts) and statically analyzable memory access patterns. (e.g., walks over large multidimensional arrays of float-point data)..

  • [58]

    ^Encyclopedia of Parallel Computing, Volume 4 by David Padua 2011 ISBN 0387097651 page 265.

  • [59]

    ^Asanovic, Krste, et al. (December 18, 2006). "The Landscape of Parallel Computing Research: A View from Berkeley" (PDF). University of California, Berkeley. Technical Report No. UCB/EECS-2006-183. See table on pages 17–19..

  • [60]

    ^Dobel, B., Hartig, H., & Engel, M. (2012) "Operating system support for redundant multithreading". Proceedings of the Tenth ACM International Conference on Embedded Software, 83–92. doi:10.1145/2380356.2380375.

  • [61]

    ^Patterson and Hennessy, pp. 749–50: "Although successful in pushing several technologies useful in later projects, the ILLIAC IV failed as a computer. Costs escalated from the $8 million estimated in 1966 to $31 million by 1972, despite the construction of only a quarter of the planned machine . It was perhaps the most infamous of supercomputers. The project started in 1965 and ran its first real application in 1976.".

  • [62]

    ^Menabrea, L. F. (1842). Sketch of the Analytic Engine Invented by Charles Babbage. Bibliothèque Universelle de Genève. Retrieved on November 7, 2007. quote: "when a long series of identical computations is to be performed, such as those required for the formation of numerical tables, the machine can be brought into play so as to give several results at the same time, which will greatly abridge the whole amount of the processes.".

  • [63]

    ^Patterson and Hennessy, p. 753..

  • [64]

    ^R.W Hockney, C.R Jesshope. Parallel Computers 2: Architecture, Programming and Algorithms, Volume 2. 1988. p. 8 quote: "The earliest reference to parallelism in computer design is thought to be in General L. F. Menabrea's publication in… 1842, entitled Sketch of the Analytical Engine Invented by Charles Babbage"..

  • [65]

    ^Wilson, Gregory V. (1994). "The History of the Development of Parallel Computing". Virginia Tech/Norfolk State University, Interactive Learning with a Digital Library in Computer Science. Retrieved 2008-01-08..

  • [66]

    ^Anthes, Gry (November 19, 2001). "The Power of Parallelism". Computerworld. Archived from the original on January 31, 2008. Retrieved 2008-01-08..

  • [67]

    ^Patterson and Hennessy, p. 749..

  • [68]

    ^Minsky, Marvin (1986). The Society of Mind. New York: Simon & Schuster. p. 17. ISBN 978-0-671-60740-1..

  • [69]

    ^Minsky, Marvin (1986). The Society of Mind. New York: Simon & Schuster. p. 29. ISBN 978-0-671-60740-1..

  • [70]

    ^Blakeslee, Thomas (1996). Beyond the Conscious Mind. Unlocking the Secrets of the Self. pp. 6–7..

  • [71]

    ^Gazzaniga, Michael; LeDoux, Joseph (1978). The Integrated Mind. pp. 132–161..

  • [72]

    ^Gazzaniga, Michael (1985). The Social Brain. Discovering the Networks of the Mind. pp. 77–79..

  • [73]

    ^Ornstein, Robert (1992). Evolution of Consciousness: The Origins of the Way We Think. p. 2..

  • [74]

    ^Hilgard, Ernest (1977). Divided consciousness: multiple controls in human thought and action. New York: Wiley. ISBN 978-0-471-39602-4..

  • [75]

    ^Hilgard, Ernest (1986). Divided consciousness: multiple controls in human thought and action (expanded edition). New York: Wiley. ISBN 978-0-471-80572-4..

  • [76]

    ^Kaku, Michio (2014). The Future of the Mind..

  • [77]

    ^Ouspenskii, Pyotr (1992). "Chapter 3". In Search of the Miraculous. Fragments of an Unknown Teaching. pp. 72–83..

  • [78]

    ^"Official Neurocluster Brain Model site". Retrieved July 22, 2017..

阅读 2076
版本记录
  • 暂无