多核编程中的负载平衡难题

  多核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核上,负载也许又变得不均衡了。软件升级也一样,当软件增加功能后,负载平衡又会遭到破坏,又需要重新划分负载使其达到平衡,这样一来软件设计的难度和麻烦大大增加了。

  如果使用了锁的话,一些看起来是均衡的负载也可能会由于锁竞争变得不平衡起来。

  4、负载平衡的应对策略

  对于运算量较小的软件,即使放到单核CPU上运行速度也很快,负载平衡做得差一些并没有太大影响,实际中负载平衡要考虑的是大运算量和规模很大的软件,这些软件需要在多核上进行负载平衡才能较好地利用多核来提高性能。

  对于大规模的软件,负载平衡方面采取的应对策略是发展划分并行块的宏观划分方法,从整个软件系统层面来进行划分,而不是象传统的针对某些局部的程序和算法来进行并行分解,因为局部的程序通常都很难分解成几十个以上的任务来运行。

   另外一个应对策略是在工具层面的,也就是编译工具能够协助人工进行并行块的分解,并找出良好的分解方案来,这方面Intel已经作出了一些努力,但是还需要更多的努力让工具的功能更强大一些才能应对核数较多时的情况。

时间: 2024-10-31 21:18:08

多核编程中的负载平衡难题的相关文章

企业如何实现云计算中的负载平衡?

尽管云计算技术得到迅速采用,但在多云.多个数据中心和混合基础设施上可靠地分配工作负载的能力仍然存在着长期的缺陷.其结果是工作负载分布不均,应用程序性能下降,如果在全球范围内更好地管理工作负载,则可以避免这种情况.人们需要的是更好的全局服务器负载均衡(GSLB). 平衡云计算中的负载 由于智能地分配工作负载是至关重要的,因此负载均衡器(也称为应用交付控制器ADC)在数据输入中被广泛部署.它们的功能是将工作负载分配给后端服务器,从而确保最佳地使用总体服务器容量和更好的应用程序性能. 传统的负载平衡器

综述:云计算中的负载平衡技术

EXISTING LOAD BALANCING TECHNIQUES IN CLOUD COMPUTING: A SYSTEMATIC REVIEW NIDHI JAIN KANSAL AND INDERVEER CHANA This study concludes that all the existing techniques mainly focus on reducing associated overhead, service response time and improving p

企业级负载平衡简介(转)

原文出处: loveis715    在之前的一篇文章<放好你的密码 – 从芝麻金融被攻破说起>中,一位读者在评论中提出了"如果整个过程速度比较慢登录会有问题"这样一条评论.虽然说我对文章的正确性很有把握,但也仍需要仔细思考是否自己哪里没有说清楚.在这个思考过程中,我想起了一个非常值得一说的话题,那就是负载平衡. 在那篇文章中我们说到,要安全地管理好密码,计算密码哈希所使用的迭代次数应该尽可能地大,从而使得单次哈希计算的速度变长,增加恶意人员破解密码的难度.反过来,如果有一

Windows Azure发布对“内部负载平衡”(ILB) 的支持

我们非常高兴地宣布http://www.aliyun.com/zixun/aggregation/13357.html">Azure对"内部负载平衡"(ILB) 的支持.利用内部负载平衡 (ILB),可以通过私有 IP 地址运行高可用服务,而私有 IP 地址只能在云服务或虚拟网络 (VNet) 内访问,因此为该终端提供了额外的安全性.ILB 终端在虚拟网络内使用时,也可从允许一些强大混合场景的内部部署和其他互相连接的 VNet 进行访问. 可通过两种方式使用 ILB 在

Microsoft Azure 负载平衡服务 及创建教程

Microsoft Azure 负载平衡服务 Microsoft Azure 为在其中托管的虚拟机 (IaaS) 和云服务 (PaaS) 提供负载平衡服务.负载平衡支持应用程序伸缩,并且提供应用程序故障恢复以及其他优势. 可以通过以下方式访问负载平衡服务:通过 Microsoft Azure 门户或应用程序的服务模型指定服务上的输入端点.当在 Microsoft Azure 上部署一个具有一个或多个输入端点的托管服务后,它会自动配置 Microsoft Azure 平台提供的负载平衡服务.要充分

Microsoft Azure提供负载平衡服务应用程序示例

Microsoft http://www.aliyun.com/zixun/aggregation/13357.html">Azure 为在其中托管的虚拟机 (IaaS) 和云服务 (PaaS) 提供负载平衡服务.负载平衡支持应用程序伸缩,并且提供应用程序故障恢复以及其他优势. 可以通过以下方式访问负载平衡服务:通过 Microsoft Azure 门户或应用程序的服务模型指定服务上的输入端点.当在 Microsoft Azure 上部署一个具有一个或多个输入端点的托管服务后,它会自动配置

在虚拟基础架构中实现安全性、负载平衡和Anti-collocation规则

在本文中,我们查看设置一个具有高可用性 (HA) 和负载平衡的环境的最常见用例: 负载平衡使您能够将http://www.aliyun.com/zixun/aggregation/13999.html">工作负载分散在多个实例上,从而提高吞吐量和实现冗余. 用例:跨两个运行 Apache HTTP Server 或 IBM HTTP Server 的 Web 服务器的负载平衡.您可以使用自己的 Web 服务器对来自应用服务器的数据执行负载平衡和缓存.注意:不仅可以对 HTTP 执行负载平衡

基于反馈的动态负载平衡调度算法在Hadoop异构环境中的设计与实现

基于反馈的动态负载平衡调度算法在Hadoop异构环境中的设计与实现 南京理工大学  李元洪 本文在介绍云计算的基本概念.体系结构及其应用发展的基础上,分析了云计算模型的实现框架和容错机制.针对云计算Hadoop开源平台,详细分析了其中的分布式文件系统(HDFS, Hadoop Distributed File System)和MapReduce计算模型,并对Hadoop平台下的作业调度技术.FIFO.公平队列和计算能力作业调度算法做了深入的研究. 对Hadoop现有的调度算法在异构环境下的计算性

负载平衡环境下的ASP会话管理(二)

仅当web 范围内的第一次点击进行负载平衡这种方法也称为前端负载平衡,它易于描述,但是有可能不适于执行.为了实现真正的负载平衡,每次请求都要重新平衡用户.但是在大多数情况下,前端负载平衡就已经足够满足大部分这类服务器维护的支持者了. 要实现这个目的,就只允许在范围内的第一次点击通过负载平衡器.每个增加的页面负载都将用户保持在同一个服务器上.这就如同在代码中使用相对路径而不是绝对路径一样简单. < Form action="http://www.myserver.com/mypage.asp