周伟明的专栏

<<软件测试实践>> 已上市

周伟明ID:drzhouweiming
183014次访问,排名363好友1人,关注者10
软件技术爱好及研究者
drzhouweiming的文章
原创 48 篇
翻译 0 篇
转载 0 篇
评论 314 篇
周伟明的公告
一书已上市, 欢迎大家提出意见!
最近评论
drzhouweiming:因为sections语句后面有隐含的barrier
如果要将其变成并行的话,需要使用nowait子句
kuangxiangjie:这种方式和前面那种方式的区别是,两个sections语句是串行执行的,即第二个sections语句里的代码要等第一个sections语句里的代码执行完后才能执行。

您好,我对这句话不是很明白....parallel不是并行的么,怎么在它里面的两个ses会是串行的呢
algcfx:Wow gold
dimire:LZ你好,我参考你的第一个测试程序int main(int argc, char* argv[])
{
#pragma omp parallel for
for (int i = 0; i < 10; i++ )
{
printf("i = %d\n", i);
}
……
dimire:学习了
文章分类
    收藏
      相册
      最近文章
      1、多核新观念-象使用内存一样使用CPU?
      2、多核编程中的任务随机竞争模式的概率分析
      3、OpenMP创建线程中的锁及原子操作性能比较
      4、多核编程中的任务分组竞争模式
      5、称球问题的测试解法
      90%程序员写不出无BUG的二分查找程序?
      C/C++代码检视实例
      多核编程中的负载平衡难题
      多核编程中的锁竞争难题
      微软过桥问题与测试人员素养
      接口关系稳定原理探索
      接口设计定理
      模块分解原理与三权分立
      模块分解原理的探索
      测试驱动需求分析
      筑一座坝治好中国的沙漠
      存档
      软件项目交易
      订阅我的博客
      XML聚合  FeedSky
      订阅到鲜果
      订阅到Google
      订阅到抓虾
      订阅到BlogLines
      订阅到Yahoo
      订阅到GouGou
      订阅到飞鸽
      订阅到Rojo
      订阅到newsgator
      订阅到netvibes

      原创 多核编程中的负载平衡难题收藏

      新一篇: 测试驱动需求分析--需求文档评审实例 | 旧一篇:  90%程序员写不出无BUG的二分查找程序?

       
      多核编程中的负载平衡难题
       作者:周伟明
                                  多核编程的几个难题及其应对策略(难题一)
                                 OpenMP并行程序设计(二)
                                 OpenMP并行程序设计(一)
                                 双核CPU上的快速排序效率
      前面 多核编程中的锁竞争难题 这篇文章中讲过一个多核编程中的串行化的难题,这篇文章中再来讲解一下多核编程中的另外一个难题,就是负载平衡方面的难题。
      多核CPU中,要很好地发挥出多个CPU的性能的话,必须保证分配到各个CPU上的任务有一个很好的负载平衡。否则一些CPU在运行,另外一些CPU处于空闲,无法发挥出多核CPU的优势来。
      要实现一个好的负载平衡通常有两种方案,一种是静态负载平衡,另外一种是动态负载平衡。
      1、静态负载平衡
      静态负载平衡中,需要人工将程序分割成多个可并行执行的部分,并且要保证分割成的各个部分能够均衡地分布到各个CPU上运行,也就是说工作量要在多个任务间进行均匀的分配,使得达到高的加速系数。
      静态负载平衡问题从数学上来说是一个NP完全性问题,Richard M. Karp, Jeffrey D. Ullman, Christos H. Papadimitriou, M. Garey, D. Johnson等人相继在1972年到1983年间证明了静态负载问题在几种不同约束条件下的NP完全性。
      虽然NP完全性问题在数学上是难题,但是这并不是标题中所说的难题,因为NP完全性问题一般都可以找到很有效的近似算法来解决。      
      2、动态负载平衡
             动态负载平衡是在程序的运行过程中来进行任务的分配达到负载平衡的目的。实际情况中存在许多不能由静态负载平衡解决的问题,比如一个大的循环中,循环的次数是由外部输入的,事先并不知道循环的次数,此时采用静态负载平衡划分策略就很难实现负载平衡。
             动态负载平衡中对任务的调度一般是由系统来实现的,程序员通常只能选择动态平衡的调度策略,不能修改调度策略,由于实际任务中存在很多的不确定因素,调度算法无法做得很优,因此动态负载平衡有时可能达不到既定的负载平衡要求。
      3、负载平衡的难题在那里?
             负载平衡的难题并不在于负载平衡的程度要达到多少,因为即使在各个CPU上分配的任务执行时间存在一些差距,但是随着CPU核数的增多总能让总的执行时间下降,从而使加速系数随CPU核数的增加而增加。
             负载平衡的困难之处在于程序中的可并行执行块很多要靠程序员来划分,当然CPU核数较少时,比如双核或4核,这种划分并不是很困难。但随着核数的增加,划分的粒度将变得越来越细,到了16核以上时,估计程序员要为如何划分任务而抓狂。比如一段顺序执行的代码,放到128核的CPU上运行,要手工划分成128个任务,其划分的难度可想而知。
             负载划分的误差会随着CPU核数的增加而放大,比如一个需要16个时间单位的程序分到4个任务上执行,平均每个任务上的负载执行时间为4个时间单位,划分误差为1个时间单位的话,那么加速系数变成 16/(4+1)=3.2,是理想情况下加速系数 4的80%。但是如果放到一个16核CPU上运行的话,如果某个任务的划分误差如果为0.5个时间单位的话,那么加速系数变成16/(1+0.5) = 10.67,只有理想的加速系数16的66.7%,如果核数再增加的话,由于误差的放大,加速系数相比于理想加速系数的比例还会下降。
              负载划分的难题还体现在CPU和软件的升级上,比如在4核CPU上的负载划分是均衡的,但到了8核、16核上,负载也许又变得不均衡了。软件升级也一样,当软件增加功能后,负载平衡又会遭到破坏,又需要重新划分负载使其达到平衡,这样一来软件设计的难度和麻烦大大增加了。
              如果使用了锁的话,一些看起来是均衡的负载也可能会由于锁竞争变得不平衡起来,详细情况请看:http://blog.csdn.net/drzhouweiming/archive/2007/04/10/1559718.aspx
      4、负载平衡的应对策略
             对于运算量较小的软件,即使放到单核CPU上运行速度也很快,负载平衡做得差一些并没有太大影响,实际中负载平衡要考虑的是大运算量和规模很大的软件,这些软件需要在多核上进行负载平衡才能较好地利用多核来提高性能。
             对于大规模的软件,负载平衡方面采取的应对策略是发展划分并行块的宏观划分方法,从整个软件系统层面来进行划分,而不是象传统的针对某些局部的程序和算法来进行并行分解,因为局部的程序通常都很难分解成几十个以上的任务来运行。
             另外一个应对策略是在工具层面的,也就是编译工具能够协助人工进行并行块的分解,并找出良好的分解方案来,这方面Intel已经作出了一些努力,但是还需要更多的努力让工具的功能更强大一些才能应对核数较多时的情况。
       
       
      参考资料:《并行编程模式》Timothy Mattson等著 敖富江译
               《并行计算综论》Jack Dongarra等编著 莫则尧等译
                     《并行程序设计》Barry Wilkinson等著 陆鑫达等译
                     《多核程序设计技术》Shameem Akhter等著 李宝峰等译
               《并行算法实践》 陈国良等编著
       
       

      发表于 @ 2007年04月17日 22:23:00|评论(loading...)|编辑

      新一篇: 测试驱动需求分析--需求文档评审实例 | 旧一篇:  90%程序员写不出无BUG的二分查找程序?

      评论

      #g9yuayon 发表于2007-04-18 01:05:34  IP: 199.246.40.*
      加锁并不是唯一的并行方式,而且现在不管做体系结构的(比如Tom Knight, 比如Intel里研究的80-core的那帮老大)还是程序员(比如Erlang的Joe Armstrong, Unreal的Tim Sweeney, 和现在研究无锁数据结构的一票老大们)都越来越倾向于认为加锁的方法过于复杂且低效。所以反锁竞争未必是需要反复强调的重点。进程内高并发是新问题(进程间高并发都搞了很多年了,我们暂且不论),当然需要新的解决方案,不一定是锁竞争啊。好比现在时速100公里以上的汽车量产了,我们也不用老抱怨刻着马车轮辙的青石板路有碍行驶,对吧?铺石板的工人们,该学习怎么建柏油路,修高速公路了。
      #linuxhaha 发表于2007-04-18 13:38:56  IP: 220.201.38.*
      修高速路说得容易,你用Sparten3做个>50MHz的MCU试试。
      #summersnowgieno 发表于2007-04-18 16:35:50  IP: 131.107.0.*
      不要 把 负载 平衡 问题 看的太复杂~
      其实 解决 起来 还是 一个 分治 的 思路 ~
      真正 的 高手 , 大 巧 弱 拙 , 很多 东西 都是 相通 的~ ^_^
      #chai2010 发表于2007-04-30 14:01:15  IP: 218.106.120.*
      有谁做过MPI容错方面的研究了,
      能给些实际可行的建议啊 。
      #realdreamer 发表于2007-09-25 17:06:41  IP: 61.148.45.*
      关注!
      发表评论  


      当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
      Csdn Blog version 3.1a
      Copyright © 周伟明