第1章 超级计算简史 摘录

1.2 冯诺依曼计算机架构

几乎所有处理器都以冯诺依曼提出的处理结构为工作基础。在该结构中,处理器从存储器中取出指令、解码,然后执行该指令。

通常,每个指令长32位或者64位。

内存速度和时钟速度的比率是限制CPU和GPU吞吐量的一个重要因素。大多数应用程序属于“内存受限”,而不是“处理时钟或负载受限型”。

CPU厂商试图通过使用缓存(空间局部性)突发内存访问(时间局部性)来解决“内存受限”的问题。

当需要从内存中取数据或指令时,处理器首先查询缓存。如果数据或指令在缓存中,则高速缓存直接将其交给处理器。

典型的现代CPU缓存组成结构:

如果数据不在一级缓存(L1)中,则处理器向二级或三级(L2或L3)缓存发出读取请求。如果缓存中没有此数据,则需要从主存(即内存)中读取。一级缓存的工作速度通常能达到或接近处理器的时钟速度。

在实际程序中,循环程序的数据往往非常大,可能达到M字节大小。即使程序可以存放在缓存中,但数据集往往就存放不下,所以设置了缓存。但是处理器仍然会因为受到内存吞吐率或带宽的限制,而无法发挥其所具有的处理能力。

当处理器从缓存而不是主存中取来一条指令或一个数据时,称为缓存命中(cache hit)。但是随着缓存容量的不断增大,使用更大容量缓存所带来的增速收益却迅速下降。除非有办法将问题的整个数据都装入缓存。

随着缓存容量的增长,用于制造处理器的硅片的物理尺寸也逐渐变大。芯片越大,制造成本越昂贵。

1.3 克雷机

Cray-2 采用分成若干内存条的共享内存架构,这些内存条可以与一个、二个或四个处理器相连,进而发展成为今天服务器的对称多处理器(Symmetrical MultiProcessor)。

1.4 连接机

连接机采用的是单指令多数据(Single Insturction, Multiple Data, SIMD)型并行处理。今天,这种技术有单指令多数据流扩展指令(Streaming SIMD Extensions, SSE)、多媒体扩展(Multi-Media Extension, MME)以及高级矢量扩展(Advanced Vector Extensions, AVE)形式。

不过有一点需要注意,如果将现在CPU采用的粗线程方案迁移至这种采用大规模并行方式处理的机器,处理器之间的同步和通信将是很大问题。

1.5 cell处理器

它的思想是用一个常规处理器作为监管处理器,该处理器与大量的高速流处理器相连。在cell处理器中,常规的PowerPC处理器担任与流处理器和外部处理器的接口。而SIMD流处理器,IBM称其为SPE,则在常规处理器的管理下,处理器数据集。

由于具有独立对话处理器的能力,因此很多问题的求解就可以通过一系列简单的步骤来实现。例如Power PC核可以取来一组待处理的数据,然后将其分配给8个SPE处理。每个SPE所做的处理相同的,即读取一个字节,将其减1,然后存回本地内存。当所有SPE完成工作后,PC核再从每个SPE中取回数据,然后将这组数据写会内存区域。

当连接到一个高速的环形网络时,SPE还可以按顺序排列起来,以执行一个包括多个步骤的流式操作。如下图所示:

这种流或流水线处理方法的问题是,系统运行的最快速度等于最慢的节点的运行速度。SPE也存在带宽以及数据传递至下一阶段的开销。

Power PC核面向8个SPE进行数据的分发和收配,而不是原先的两个,因此主机和SPE间的管理开销以及通信量增加了。

1.6 多点计算

在计算机领域中,经常遇见收益递减规律(The law of diminishing returns)。即使你在一个单一方面投入再多,结果也不会有很大改变。

随着时钟频率的不断增长,集群计算在20世纪90年代开始流行起来。将PC机用以太网交换机连接成整体。

PC集群通常运行linux操作系统的集群版本。在这个版本中,它的每个节点从中央主控节点上获取引导指令和操作系统。

集群计算存在的问题是它的速度受到节点之间通信总量的限制,而这些通信是求解问题所必须的。如果每个数据点都要从所有节点上获取数据,那么你把一个很糟糕的问题交给了集群。

集群设计的一个进步是分布式应用程序。分布式应用程序可以运行在一个许多节点上,而每个节点又由包含许多GPU的许多处理单元组成。分布式应用程序可以运行在一个受集中控制的集群平台上,也可以运行在随机连接在一起、自主控制的机器上。

 

一个GPU内有许多流多处理器(Streaming Multiprocess, SM),他们类似CPU的核。这些SM与共享内存/一级缓存连接在一起,然后又通过SM间互连开关,与二级缓存相连。数据先是存储在全局内存,然后被主机取出来并使用。留一部分自己处理外,主机将剩余的数据通过PCI-E互连开关送另一个GPU的存储空间。PCI-E互连开关的传输速度比任何一个互连网络快很多倍。

 1.8 单核解决方案的消亡

一个CPU的电力功率大约是它时钟频率的3次方。更糟糕的是,如果CPU产生的热量增加,那么即使时钟频率不变,根据硅材料的性质,CPU的功耗也会进一步增加。容易达到功耗墙。

目前已经从持续地提高时钟频率或者通过指令级并行处理技术提高IPC的发展道路,转移到向处理器里添加更多核的发展道路。

1.11.3 CPU的替代选择

主要的并行程序设计扩展语言是MPI和OpenMP。在linux下,还有pthreads。Windows操作系统下还有Windows线程模型和OpenMP。MPI与Pthreads被用作Unix连接接口。

MPI(Message Passing Interface)可能是使用最广泛的消息传递接口。它是基于进程的,通常在各大规模计算实验室得到应用。它实现的并行处理表现为,在集群的各个节点上,派生出成百上千个进程,通常这些进程通过基于网络的高速通信链路。

OpenMP(Open Multi-Processing)是专门面向单个节点或单个计算机系统而设计的并行计算平台。在使用OpenMP时,程序员需要理由利用编译器指令精确写出并行运算指令。然后编译器根据可用的处理器核数,自动将问题分为N部分。但是,CPU内存的访问带宽常常不够大,满足不了所有核连续将数据写入内存或从内存取出数据的要求。

pthreads是一个主要应用在Linux上的多线程应用程序库。同OpenMP一样,pthreads使用线程而不是进程,因为它是设计用来在单个节点实行并行处理的。和OpenMP不同的是,线程管理和线程同步是程序员来负责的。这提供了更多灵活性。

ZeroMQ可以用来开发一个多节点,多GPU的例子。ZeroMQ使用一个跨平台的API来支持基于线程,基于进程和基于网络的通信模型。Linux和Windows都支持ZeroMQ。它是针对分布式计算而设计的,所以连接是动态的,节点失效不会影响它的工作。

Hadoop是谷歌MapReduce框架的一个开源版本。它针对Linux平台。思路是取一个大数据集,然后将其分割或映射(map)成很多小的数据块。然而,并不是将数据发送到各个节点,取而代之的是数据集通过并行文件系统,划分给上百个或者上千个节点。因此,归约步骤是把程序发送到已经包含数据的节点上。

1.11.4 编译指令和库

若使用pthreads替代OpenMP,由于pthreads提供更底层的控制,所以你可以获得更高的性能。但是,对于额外层面的控制,要求程序员掌握更高水平的编程知识,也会带来更高的出错风险,进而对开发进度产生影响。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值