单核CPU的发展限制:
1)利用提高主频提高CPU速度
2)Superscalar(超标量)
3)超流水线
单核CPU现在的发展已经跟不上性能的需求了。
CPU主频在一定程度上代表了计算机的运算速度,但是如今收到生产工艺的限制,CPU主频的提高也受到了限制,所以从提高主频来提高CPU速度效果不是很好。
超标量CPU架构是指在一颗处理器内核中实行了指令级并行的一类并行运算。这种技术能够在相同的CPU主频下实现更高的CPU吞吐量。也就是可以实现在一个时钟周期内,完成多条指令,从而提高性能。
超流水线是改变一条指令的步骤,一般一条指令在5~6步,现在通过超流水线的方式增加步数来提高运行效率。
这三种提高CPU的运行效率都是有一定限制的,并且并不如多核CPU的效果明显。而且如果一味提高单核的运算能力,其散热将是一个非常难以解决的问题。
现在锁着越来越多的高性能计算的需求,例如大型服务器、多媒体游戏、实时嵌入式系统、客户端软件、OS的要求,多核计算将成为发展趋势。
片上多核(CMP)就是将多个计算内核继承在一个处理器芯片中,从而提高计算能力。
对于片上多核,按照计算呢你喝的对等与否,分为同构多核(各核之间地位相同)和异构多核(各核之间地位不相等,一般存在一个主核)。
操作系统对多核处理器的支持方法
1)调度与中断:i)对任务的分配进行优化
Ii)对任务的共享数据优化
Iii)对任务的负载均衡优化
2)输入输出西戎
3)存储管理与文件系统
4)虚拟化系统:平台虚拟化核资源虚拟化
5)典型的支持多核的操作系统
随着多核处理器的应用,也遇到的许多问题。
1)并发性问题
2)CPU饥饿问题
3)任务分解与调度问题
4)节能环保问题
5)扩展性问题
之前的单核处理任务,一般是串行化+分时操作。所以只需要考虑任务的优先级以及分时操作就可以,但是多核编程的时候不仅需要考虑任务之间的优先级,还需要考虑各个任务的分配问题,不能使得多个任务都分配到某一个CPU上,而其余的CPU仍然处于空闲状态,这样就会造成资源的浪费,并且没有实现多核处理器的初衷。加上任务又存在可并行化部分以及不可并行部分,使得多核的编程相对于单核编程比较困难。
在分析多核处理性能时,有一个加速比的指标。
加速比:同一个任务在单处理器系统核并行处理器系统中运行消耗的时间的比率。用来衡量并行系统或程序并行化的性能核效果。
其理想最大值时n(多核处理器核的数量),但现实中的情况是加速比往往小于n
多核竞争与单核多线程编程的区别
1)锁竞争导致的串行化的区别:对于多核处理器,其最大的优势在于多核,也就是多个CPU同时运行,但是如果多个任务都需要用到同一块内存(相对于片上多核而言),那么对于这种情况出现了锁的机制(否则多个任务同时对同一块内存进行修改操作会出现非常恶劣的问题),也就是使得一般某个任务需要用到某块内存空间数据,就将这块数据上锁,使得其他任务在需要这块数据的时候需要等待。这也就导致了多核的串行化问题
2)线程分解与执行的却比:在单核CPU中,对于客户端软件而言,采用多线程方式通常都是创建线程并将其放在后台执行,避免阻塞客户界面操作,提高性能。而在多CPU中,线程的分解将不再局限于此。多核CPU分解多线程是为了让计算非配到多个CPU核上去执行,大幅度提高工作效率。
3)CPU负载问题的区别
4)任务调度策略的区别:在单核中,在这种情况下程序员更多的是考虑任务的优先级;在多核程序中,不单是需要考虑任务的优先级猫也要考虑各个任务的好事,使得负载均衡,提高加速比核CPU效率
5)CPU cache(高速缓存)存储的问题(伪共享问题):这个类似于锁竞争导致的串行化。单核CPU不存在cache存储问题。
6)任务优先级的区别:(单核和双核举例)。存在四个任务,优先级为T4>T3>T2=T1.任务的发生顺序是T1 T2 T3 T4。对于单核而言,是先执行任务1,到任务2也需要执行的时候,因为二者是相同的优先级,所以会分时轮转执行两个任务。到任务3需要执行时,因为任务3优先级高,所以此时任务1 2暂停,优先执行任务3。到任务4需要执行时,因为任务4的优先级大于任务3,所以此时先执行任务4,暂停任务3的执行。当任务4执行完毕后,单核CPU此时就会继续执行任务3,当任务3执行完毕之后,就会对任务1 2 进行分时轮转操作。
7)串行计算与并行及分布式计算的区别: 单核,串行算法;多核,并行或分布式算法。
狭义多核:片上多核,会共享内存,存储器。所以对于全局信息,不需要数据搬迁问题,只需要关注好锁的问题就可以
分布式多核:和片上多核正好相反。需要进行数据通信,才能进行数据的共享。需要考虑计算的平衡和数据存储的平衡
分布式多核的编程可以在片上多核上运行,但是片上多核的程序不能在分布式多核上运行
狭义多核编程与多机分布式编程的区别
1)共享存储与分布式存储的区别
2)分布式计算的区别
3)编程环境上的区别
加速比
W:问题的总计算量。其中,Wp,可并行部分;Ws,串行部分 W=Wp+Ws
P:并行处理器的个数
f:串行分量所占的比例
1-f:并行分量所占的比例
Ts:串行执行的时间
Tp:并行执行的时间
S:加速比
E:多核CPU的效率
Amdahl定律:固定负载(计算总量不变)时的量化标准
S=1/(f+(1-f)/p)=(Ws+Wp)/(Ws+Wp/p) 理论上最大值为(Ws+Wp)/Ws
Gustafson定律:系统优化某不见所获得的系统性能的改善程度,取决于该部件被使用的频率,或所占总执行时间的比例。
实际情况下影响加速比系数的因素:串行计算所占比例、并行计算的开销
并行计算的开销
1)算法开销:并行计算的调度等算法的开销
2)系统开销:在并行计算中,可能需要通信,同步等等,创建线程,线程之间的协调
在一个有所保护操作的程序中,没饿过任务中的计算可以分为
ts表示锁内计算时间,大小由共享资源的操作时间决定,与共享资源类型有关,并且与程序员的程序设计有关
t1:表示Lock操作和Unlock操作耗费的时间。如果CPU的速度固定,则为常量
tp:表示锁外可并行计算部分耗费的时间,大小与具体的应用类型及程序员的分解有关
线程粒度因子:线程内有效计算时间与锁操作时间的比值,反映了一个线程的计算量的大小。Ft=(ts+tp)/t1
锁粒度因子:锁内计算时间与锁操作时间的比值,反应一个线程锁内操作的粒度关系 fk=ts/t1
影响负载平衡主要因素
1)线程划分不均匀
2)线程执行时间不确定
3)CPU的个数
负载平衡的评价指标
负载均匀度 b(n)=各CPU平均使用时间/最大CPU使用时间
串行程序性能优化
1)调用高性能库,比如优化的BLAS,FFTW等
2)选择适当的编译器优化选项
3)合理定义数组维度
4)注意嵌套循环的顺序,尽量改善数据访问的局部性(cache命中率,计组有讲)
5)循环展开
并行程序性能优化
1)减少通信量、提高通信粒度
2)全局通信尽量利用高效集合通信算法
3)负载平衡
4)通信、计算的重叠。通信的时候几乎不适用计算能力,所以二者重叠进行可以有效提高 性能
5)通过引用重复计算来减少通信,以计算换通信。这个数据不用通信传递,可以在目的机 计算出来