第一个性能当然是速度,还有两个:
- 延时:完成指定工作所需要的时间
- 吞吐率:单位时间内完成的工作量
开发并行性通常能改进吞吐率。
开发并行可以隐藏延时,当然并没有真正的减少延时,只是隐藏了延时的代价,因为它“与其等待,不如去计算其余部分”。
并行计算比串行计算要建立更多线程而带来额外开销,建立进程的开销远大于线程,这是因为存储器的分配和初始化非常昂贵。
线程(或进程)间的通信是开销的主要部分。
存储器的带宽也限制了并行计算的速度,比如当CPU读DRAM时可能出现延时(当要加载的数据量很大,cache容不下时,CPU就不得不读取DRAM)。存储器带宽约束不多核计算中的特别问题,这通常受限于芯片的边界。
避免过早的优化:这里要讲90/10规则,即90%的程序执行时间花在10%的代码上。开始时不加任何修饰地编写代码,如果性能需要改进,把执行时间最长的那10%时间识别出来,对其进行重写,重写时也许要使用C语言或汇编语言。
在科学计算中通常采用FLOPS指标,即私刑秒学点数操作(floating-point operations per second)。
极少情况下会出现超线性加速比(superline speedup):使用P个处理器,并行的速度比串行的速度快P倍。基本的解释是并行的计算执行了较少的工作,比如并行执行时数据都驻留在每个处理的cache中,而顺序执行时必须访问存储器。
当核数增张时,核之间的通信延时也会增张。并且RAM和核之间的带宽是有限的。
本文来自博客园,作者:高性能golang,转载请注明原文链接:https://www.cnblogs.com/zhangchaoyang/articles/2311630.html