**摘要:**在实际应用中,影响并行加速比的因素主要是串行计算、并行计算和并行开销三方面。
本文分享自华为云社区《高性能计算(2)——万丈高楼平地起》,作者: 我是一颗大西瓜。
从物理划分上共享内存和分布式内存是两种基本的并行计算机存储方式 除此之外分布式共享内存也是一种越来越重要的并行计算机存储方式。
根据指令的同时执行和数据的同时执行,计算机系统可以分成以下四类:
单处理器单数据就是“单CPU的机器”,它在单一的数据流上执行指令。在SISD中,指令被顺序地执行。
对于每一个“CPU时钟”,CPU按照下面的顺序执行:
这种架构(冯·诺依曼体系)的主要元素有以下:
传统的单处理器计算机都是经典的SISD系统。下图表述了CPU在Fetch、Decode、Execute的步骤中分别用到了哪些单元:
这种模型中,有n个处理器,每一个都有自己的控制单元,共享同一个内存单元。在每一个CPU时钟中,从内存获得的数据会被所有的处理器同时处理,每一个处理器按照自己的控制单元发送的指令处理。在这种情况下,并行实际上是指令层面的并行,多个指令在相同的数据上操作。能够合理利用这种架构的问题模型比较特殊,例如数据加密等。因此,MISD在现实中并没有很多用武之地,更多的是作为一个抽象模型的存在。
SIMD计算机包括多个独立的处理器,每一个都有自己的局部内存,可以用来存储数据。所有的处理器都在单一指令流下工作;具体说,就是有n个数据流,每个处理器处理一个。所有的处理器同时处理每一步,在不同的数据上执行相同的指令。
很多问题都可以用SIMD计算机的架构来解决。这种架构另一个有趣的特性是,这种架构的算法非常好设计,分析和实现。限制是,只有可以被分解成很多个小问题(小问题之间要独立,可以不分先后顺序被相同的指令执行)的问题才可以用这种架构解决。很多超级计算机就是使用这架构设计出来的。例如Connection Machine(1985年的 Thinking Machine)和MPP(NASA-1983).我们在第六章 GPU Python编程中会接触到高级的现代图形处理器(GPU),这种处理器就是内置了很多个SIMD处理单元,使这种架构在今天应用非常广泛。
在费林分类中,这种计算机是最广泛使用、也是最强大的一个种类。这种架构有n个处理器,n个指令流,n个数据流。每一个处理器都有自己的控制单元和局部内存,让MIMD架构比SIMD架构的计算能力更强。每一个处理器都在独立的控制单元分配的指令流下工作;因此,处理器可以在不同的数据上运行不同的程序,这样可以解决完全不同的子问题甚至是单一的大问题。在MIMD中,架构是通过线程或进程层面的并行来实现的,这也意味着处理器一般是异步工作的。这种类型的计算机通常用来解决那些没有统一结构、无法用SIMD来解决的问题。如今,很多计算机都应用了这中间架构,例如超级计算机,计算机网络等。然而,有一个问题不得不考虑:异步的算法非常难设计、分析和实现。
老生常谈,线程和进程的区别和联系:
计算机系统是由一个或多个物理处理器和内存组成,运行的程序会将内存分为两个部分,一部分是共享变量使用的存储区域, 另一部分供各线程的私有变量使用的存储区域。线程绑定是将线程绑定在固定的处理器上, 从而在线程与处理器之间建立一对一的映射关系。如果不进行线程绑定,线程可能在不同的时间片运行在不同的处理器上。我们知道,每个处理器是有自己的多级缓存的,如果线程切来切去,那么cache命中率肯定不高,程序性能也会受到影响。通过线程绑定,程序能够获得更高的cache利用率从而提高程序性能。c++中如何进行线程绑定可以参考https://www.cnblogs.com/wenqiang/p/6049978.html
理论上来说,n个相同的cpu理论上能提供n倍的计算能力。
但是在实际过程中,并行开销会导致总的执行时间无法线性地减少。这些开销分别为:
加速比的定义是顺序程序执行时间除以计算同一结果的并行程序的执行时间
式中,t_sts为一颗CPU程序完成该任务所需串行执行时间;t_ptp为n颗CPU并行执行完成该任务所需时间。由于串行执行时间t_sts为n颗CPU并行执行完成该 和并行执行时间t_ptp有多种定义方式。 这样就产生了五种不同的加速比的定义,即相对加速比、实际加速比、绝对加速比、渐近实际加速比和渐近相对加速比。
在实际应用中,影响并行加速比的因素主要是串行计算、并行计算和并行开销三方面。一般情况下, 并行加速比小于CPU的数量。但是,有时会出现一种奇怪的现象,即并行程序能以串行程序快n倍的速度运行,称为超线性加速比。产生超线性加速的原因在于CPU访问的数据都驻留在各自的高速缓存Cache中, 而高速缓存的容量比内存要小, 但读写速度却远高于内存。
衡量并行算法的另一个主要标准是并行效率,它表示的是多颗CPU在进行并行计算时单颗CPU的平均加速比。
理想并行效率为1表明全部CPU都在满负荷工作。通常情况下,并行效率会小于1, 且随CPU数量的增加而减小。
伸缩性用于度量并行机器高效运行的能力,代表跟处理器数量成比例的计算能力 (执行速度)。如果问题的规模和处理器的数量同时增加,性能不会下降。
阿姆德尔定律广泛使用于处理器设计和并行算法设计。它指出程序能达到的最大加速比被程序的串行部分限制。$S=1/(1-p) $中 1-p1−p 指程序的串行部分。它的意思是,例如一个程序90%的代码都是并行的,但仍存在10%的串行代码,那么系统中即使由无限个处理器能达到的最大加速比仍为9。
古斯塔夫森定律在考虑下面的情况之后得出的:
古斯塔夫森定律指出了加速比S(P)=P-\alpha (P-1)S(P)=P−α(P−1), PP 为处理器的数量, SS 为加速比,\alphaα 是并行处理器中的非并行的部分。作为对比,阿姆德尔定律将单个处理器的执行时间作为定量跟并行执行时间相比。因此阿姆德尔定律是基于固定的问题规模提出的,它假设程序的整体工作量不会随着机器规模 (也就是处理器数量) 而改变。古斯塔夫森定律补充了阿姆德尔定律没有考虑解决问题所需的资源总量的不足。古斯塔夫森定律解决了这个问题, 它表明设定并行解决方案所允许耗费的时间的最佳方式是考虑所有的计算资源和基于这类信息。
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://huaweicloud.blog.csdn.net/article/details/125391805
内容来源于网络,如有侵权,请联系作者删除!