像“天河一号”这样的巨型计算机的运算速度是纯粹与硬件技术有关还是与软件也有关系?

推荐  (0) | 9人关注关注
5个答案
51 0

当然是两个都有关系啦!今天母星信号不好,闲来无事好好辅导一下地球人吧~

【硬件方面】

首先呢,我们都可以看到的,超级计算机的处理单元的数量是远远超过PC的,比如中国目前的第一超算“天河一号”(下图),他的计算处理系统里包含了7168个计算结点和1024个服务结点。每个计算结点包含2路英特尔CPU和一路英伟达GPU,每个服务结点包含2路飞腾CPU。全系统共计23552个微处理器,其中英特尔至强X5670CPU(2.93GHz、6核)14336个、飞腾-1000CPU(1.0GHz、8核)2048个、英伟达M2050GPU(1.15GHz、14核/448个CUDA核)7168个,CPU核共计102400个,GPU核共计100352个。大家可以看到这个数量的差异。

然后呢,普通的PC的主板上只有一个CPU插槽,一个GPU,假设你有了很多钱,也买了许多个CPU和GPU,想自己组个“超级计算机”玩,那么插在哪呢?超级计算机体系结构可以说和PC机在一开始就不一样。历史上用于超算的体系结构有这么几种:

SMP技术

对称多处理(symmetricalmultiprocessing,SMP)技术是相对非对称多处理技术而言的、应用十分广泛的并行技术.在这种架构中,多个处理器运行操作系统的单一复本,并共享内存和一台计算机的其它资源.所有的处理器都可以平等地访问内存、I/O和外部中断.系统资源被系统中所有CPU共享,工作负载能够均匀地分配到所有可用的处理器之上.目前,大多数SMP系统的CPU是通过共享系统总线来存取数据,实现对称多处理的.在SMP系统中增加更多处理器的两个主要问题是系统不得不消耗资源来支持处理器抢占内存,以及内存同步。
看到这些地方是不是有些熟悉?其实,现代的PC机,大部分也是多核处理器,运用的就是这样的技术,这种技术就像是有一个仓库(内存),大家(CPU)都在仓库里存取东西(I/O),而仓库到大家各自处理区的道路宽度、仓库入口的宽度(总线宽度)是比较有限的,会比较限制速度。要提升速度不仅要堆叠处理器数量,还要对主板的总线设计做很多改进。早期的SMP并不具有很强的计算能力,但是SMP与单机的兼容性较好,是单机系统的升级与增强,因此被广泛运用与商业计算领域。
2006年的Top500(全球超算排名),SMP技术约占7.2%。

MPP

大规模并行处理(mas-sivelyparallelprocessor,MPP)。20世纪90年代MPP系统开始成为高性能
计算机发展的主流.MPP主要由多个微处理器通过高速互联网络构成,每个处理器之间通过消息传递的方式进行通讯和协调.20世纪90年代中后期的一种趋势是将SMP机的优点和MPP的扩展能力结合起来,这一趋势发展成后来的CC-NUMA结构,即分布式共享内存。每个处理器节点都可以访问到所有其它节点的内存,但访问远程内存需要的延迟相对较大.CC-NUMA本身没有在提高性能的角度上进行较大的创新,主要优点是便于程序的开发和与SMP的兼容性.而对于科学计算任务,CCNUMA结构是否优于MPP系统仍存在争议。
2006年的Top500,MPP(包含CC-NUMA)约占22%

Cluster技术

在发展CC-NUMA的同时,集群系统(cluster)也迅速发展起来.类似MPP结构,集群(Cluster)技术是近几年兴起的发展高性能计算机的一项技术.它是一组相互独立的计算机,利用高速通信网络组成一个单一的计算机系统,并以单一系统的模式加以管理.其出发点是提供高可靠性、可扩充性和抗灾难性.一个集群包含多台拥有共享数据存储空间的服务器,各服务器通过内部局域网相互通信.当一台服务器发生故障时,它所运行的应用程序将由其它服务器自动接管.在大多数模式下,集群中所有的计算机拥有一个共同的名称,集群内的任一系统上运行的服务都可被所有的网络客户使用.采用集群系统通常是为了提高系统的稳定性和网络中心的数据处理能力及服务能力。集群的节点一般是可以单独运行的商品化计算机.由于规模经济成本低的原因,集群系统具有比MPP更高的性能/价格比优势.集群系统还继承势.到2000年初(论文是2007年的),集群实际上已经构成了高性能计算机系统的主流.
现在很多公司的计算网络都会使用集群的方法来实现分布式和容灾性。比如google就在各地有数据中心。
2006年的top500,Cluster约占70.8%。

未来的体系结构:网格技术

网格技术有可能成为实现Petaflops的另一条途径.网格是近年来计算机体系结构发展的一个重要方向,其基本思想是通过Internet进行资源共享和协同工作.目前连接到Internet的计算机已经达到1亿台以上,通过互联网可能达到的聚合计算潜力是不可估量的.国际上已经有Globus等组织为网格环境制定标准和参考实现.但是用网格技术实现Petaflops仍需要关键技术上的突破:一方面互联网连接的速度和带宽仍有待提高;另一方面是有效的网格体系模型和计算模型还没有建立.网格的资源是分散和动态的,计算也是一种分散的、动态的过程,传统的并行共享内存或消息传递程序模式不能直接有效地利用。如何科学计算高效使用网格的计算能力是当前一个主要的研究方向。

其他硬件

还包括电源啦,散热啦什么的。


【软件方面】

首先,我们需要明确一点,超算本身强大的计算能力是一种并行计算能力,他可以同时进行几万个运算,但是每一个运算本身的计算速度和高端家用CPU的处理速度并无太大的差别。所以超算其实是针对并行计算任务诞生的。对于一般的串行计算任务,使用超算是极大的浪费,当然,如果有多个串行计算任务,实际上又转化为了并行。

超算在软件方面的优化有:

处理器技术

矢量处理器能在一个命令周期(oneinstruction)处理多项数据,这有别于只能在一个命令周期内处理单一数据的常量处理器。这两种不同处理数据的方法,普遍分别称为‘单指令,多数据’(SIMD)及‘单指令,单数据’(SISD)。矢量处理器最大的优点就是能够在同一个命令周期中对不同的工作进行优化,例如:求一大堆数据的总和及矢量的数量积,更典型的例子就是多媒体应用程序(画像、图像、及声音)与及众多不同总类的科学及工程上的工作。当常量处理器只能针对一组数据于单一命令周期内完全执行提取、解码、执行和写回四个阶段的同时,矢量处理器已能对较大型的数据如相同时间内执行相同动作。这一部分有兴趣的童鞋可以参考https://zh.wikipedia.org/wiki/%E4%B8%AD%E5%A4%AE%E5%A4%84%E7%90%86%E5%99%A8

操作系统

一般的超级电脑都使用Linux操作系统,但在讲求绝对高性能的操作环境时,超级电脑开发人员会动用特别的轻量级核心(LightWeightKernel-LWK),减少中断请求、进程间通信等开销以提高性能。
轻量级核心包括CrayXT3的Catamount,CrayXT4的CNL(ComputeNodeLinux),以及IBM蓝色基因的CNK(ComputeNodeKernel)。

编程环境

信息传递接口及较旧的并行虚拟机(PVM)常用于非共享內存系统(DistributedMemorySystem),而OpenMP常用于共享內存并发系统。
传统上Fortran的编译器可以产生比C或C++更高性能目标代码,所以Fortran仍然被使用作科学编程。

优化编译器

超级电脑需要编译器优化技术以产生优佳的目标代码,现今的优化编译器都对矢量化(Vectorization)、程序循环、存储器层次结构及数据局部性进行优化。
此外,优化编译器都以高层次的中间表示(IntermediateRepresentation)优化程序-包括Open64编译器的WHIRL、[15]IBMXL编译器的Wcode

数学函数库

超算主要运行科学运算等拥有大量矢量及矩阵浮点计算的程序,因此优佳化常用的数学函数会提高运算性能。BLAS函数库使矢量及矩阵浮点计算性能大大提高,而优佳化数学函数库则提高三角函数及平方根等数学运算。

平行文件系统

平行文件系统支持多客户端节点、多文件系统服务器,以及支持平行I/O(如MPI-IO、HDF5);现今流行的平行文件系统包括Lustre和PVFS。

网络技术

超级电脑节点之间的通信一般都需要使用高性能的网络接口,现今大多TOP500的超级电脑使用以太网(44.8%)及InfiniBand(41.8%)。
传统上InfiniBand比以太网有更高的带宽,同时因操作系统调用省略(OperatingSystemBypass)而提供更低的延迟时间(latency);然而2011年思科系统开发VFIO技术于超级电脑和簇应用,使一般的以太网接口也能提供低延迟时间,从而提升以太网在超级电脑的应用层面。


呼~ 好啦,就是这么多!(我才不会告诉你们其实有好多参考文献呢……)

3 0

Jokies本人原创内容严禁转载至新浪、腾讯及百度

2013-06-01 12:31

当然有关系。当硬件性能达到一定的数量级之后,就需要专门的配套软件把硬件资源整合起来,最常见的就是采用虚拟化技术,比如 Hyper-V, VMware Enterprise, Oracle SolarisEpress之类的东东,因为虚拟化技术能够更加弹性地分配计算机资源。
除此之外,针对超级计算机的软件也要在设计上能够管理更多的资源,比如 32位操作系统只能寻址 4GB内存,服务器上共有64GB内存,那就糟糕了。更比如,英特尔的处理器支持硬件虚拟化技术,需要专门的软件才能驱动,一般的Ubuntux86,是没戏的。
总而言之,软件和硬件是相辅相成,互为补充的,单独离开哪一方面,都不能够制造出性能更好的计算机。

2 0
支持者: 易销魂 窗敲雨

有机会接触超级计算机的同学可能不太多。不过,就算是普通的PC机,运算速度同样是跟软硬件都有关的。

CPU(或者GPU)本身有个理论运算速度。比如Intel i7-2600时钟频率3.5GHz,有4个物理核心,每个核心每时钟可执行一次单精度浮点数(C语言里的float)的乘法和一次加法(以下所说的加法也包括减法),每次单精度乘法和加法都可以同时对8对浮点数进行(也就是上面所说的SIMD),总共16次运算,那么理论上它的单精度浮点运算速度可以达到3.5*4*16=224GFLOPS,也就是每秒2240亿次。千元级的GPU的理论单精度浮点运算速度一般都在万亿次以上。

但是这个是CPU单精度浮点运算器满负荷工作时所能达到的速度,而实际上有下面这些问题:

1.程序需要执行的运算并不全是单精度浮点数的加法和乘法运算,两者的比例也不见得是1:1。比如要是除法执行得比较多,那么运算速度就有可能受除法器的速度(一般比加法和乘法慢得多)所限,而不能充分利用加法和乘法器。或者,如果程序在某一步中的加法运算量是乘法的两倍,那么乘法器也会有一半的时间是空着的。

2. 为达到最高的效率,需要用一条SIMD指令同时对8对浮点数进行操作。但是,平时用C/C++/Fortran之类高级语言所写的程序大多还是直接对单个浮点数进行操作的。现在的编译软件并没有那么智能化,只有在一些比较简单的情况下才能自动把数据组织成 8个一组(所谓auto-parallelization),然后编译出一条SIMD指令来对它们进行运算。一般来说,还是需要程序员自己把关键运算模块所用的数据结构组织好,自己选用这样的指令的,不然就只能达到1/8的速度。

3. 虽说每个CPU核心每个时钟周期都可以执行一次加法 ,但这次加法的结果不是在下一个时钟周期里就可以用来执行另一次加法或乘法之类运算的,需要过更久(这个latency对于i7-2600好像是3个时钟周期,总之Intel的手册上有),这是因为加法器也是用流水线的方式来实现的,1个时钟周期只够完成加法运算中的一步,把处理这一步的电路空出来用于接受下一次加法操作,而完成整个加法运算则需要3个时钟周期。因此,如果程序只是在同一个(或者一组)数上进行连加 ,那么3个时钟周期才能执行一次加法,效率又只剩下1/3。为了避免这种情况,可以在剩下2/3的时间里给加法器找些别的有用的事情来做(比如把需要求和的数据分成3组,每组分别用连加的方式求和,最后再把结果加起来)。

4. 加法和乘法运算器能够直接访问的是CPU的寄存器。如果需要访问比较大量的数据,则需要把寄存器中的运算结果转移到一级、二级、 三级缓存直至系统的主内存中,再把新的数据从那些地方读进来。从一、二、三级缓存到系统内存,容量逐渐增大,但读写带宽(单位时间里能读写的数据量,不过这实际上也跟访问方式有关)则越来越低,如果哪一级的带宽占满了,那么运算器再快也是巧妇难为无米之炊。这些缓存以至内存的访问延时也越来越大,到内存一级可达100多个时钟周期,跟前面连加的例子一样,如果在此期间不能执行一些别的有用运算或开始其它的内存访问操作,也同样会影响效率。所以,在写程序的时候,需要尽量保证访问频繁的数据不要太多,在缓存里能放得下,比如在对两个很大的矩阵计算矩阵乘法时,就需要把矩阵分块,使得每一块的大小不超过缓存的大小,这样运算时反复读写的数据都可以放在缓存中,而主内存只需要读写一次(逐块读取原始数据、写入运算结果),节省了带宽。

5. 有些数据连几十个GB的主内存都放不下,需要通过网络或磁盘来访问,那么它们的带宽延时也同样可能影响效率,成为系统的瓶颈。

6. CPU有4个物理核心,那么就需要把程序并行化,让每个核心同时执行一部分计算任务,比如分块矩阵乘法中的某几块。

实际上能达到什么速度,就取决于程序如何克服上面这些困难了。当然,对于有些问题来说,程序写得再好,也会因为内存访问量无法减小或无法并行化之类的理由,而无法充分发挥CPU运算器的速度。所以,软件的作用就是在可能的范围内尽可能充分地使硬件高效地运行,从而达到尽可能高的运算速度。比如,同样是10000x10000的两个矩阵相乘,最简单的程序每计算一个元素就可能要把矩阵的一整列从内存里读一遍,结果内存带宽被占满,而CPU的运算能力根本没有被好好利用,结果就很慢;而经过充分优化的程序(比如atlas),会把矩阵分块以节省内存带宽,然后为了提高CPU的运算效率,再把不同的块分给不同的CPU核心,每一块中的运算再充分使用SIMD指令进行处理,这样最终的运算速度也许可以达到前面那个224GFLOPS的60%-70%(没查过具体数据),也就不错了。当然,写这样一个优化的程序所花的时间,可就比随手几个for写出的多多了。

1 0
支持者: jiangyang123

像“天河一号”这样的拿出来宣传的巨型计算机的运算速度,纯粹是CPU理想条件下的最高运算速度,所以才会给你一个XXXXXX亿次/秒。如果环境复杂了,是不可能给出这种数据的。

1 0

zxtf模式识别硕士

2013-06-06 17:19
支持者: 易销魂

这个问题仅从硬软件技术来看可能不太准确。
实际影响运算速度的应该是这样几个层面的因素:
l 硬件架构,牵涉到处理器、内存、I/O等多个方面;
l 硬件资源的底层管理技术和算法、策略,这部分很难讲是硬件还是软件,有些做成微码,有的在指令集实现时可能优化成微电路;
l 操作系统,这个和上一条有时候界限也不是十分清晰,对于超级计算机,而非工业标准兼容计算机来说,并不是问题;不过,对于特定超级计算机硬件系统,OS未必唯一;
l 编译系统,这个对于同样的硬件和OS上来说,也可能有多种选择,这会对同样高级语言程序的具体实现过程会有不同思路的优化;
l 编程语言,这个和上面的编译系统倒是可能有N对N的复杂对应关系。不过,一般来说,对于超算这个层面,大多数情况还是一一对应的,毕竟兼容性不是超算这个层面的追求;
l 编程技巧和技术当然也是重要因素,这个大家都懂得啦。
分享一个真实事件:
当年“银河1”在中央气象台的首次应用其实比之前的平台慢得多,虽然那玩意儿的测试运算速度远高于之前的平台。后来国防科大的一帮专家赶紧过去会诊,原来之前的气象预报的计算都是基于标量机的,“银河1”这种矢量机跑标量程序就属于自虐行为了。所以,为了维护“银河1”的形象问题(当时也算是政治任务),一帮专家就花了不少时间把所有程序改成矢量化的了。结果是,性能立刻远超预期。(当年银河1系统编译系统的负责人聊天时的分享)

查看更多

添加回答

登录 后回答问题,你也可以用以下帐号直接登录

相关问答

关于我们 加入果壳 媒体报道 帮助中心 果壳活动 家长监控 免责声明 联系我们 移动版 移动应用

©果壳网    京ICP证100430号    京网文[2018] 6282-492号    新出发京零字第朝200003号     京公网安备11010502007133号

违法和不良信息举报邮箱:jubao@guokr.com    举报电话:18612934101    网上有害信息举报专区    儿童色情信息举报专区