发明名称 一种基于CPU与MIC架构处理器协同计算的负载均衡优化方法
摘要 本发明提供了一种基于CPU与MIC架构处理器协同计算的负载均衡优化方法,涉及计算节点之间、计算节点内CPU与MIC计算设备之间、CPU和MIC计算设备内部各计算内核之间的负载均衡优化方法。具体内容包括:任务划分优化、进程/线程调度优化、线程亲和性优化等。本发明提供的方法适用于CPU与MIC架构处理器协同计算的软件优化,指导软件开发人员科学、有效、系统地对现有CPU与MIC架构处理器协同计算模式的软件进行负载均衡性优化改造,实现软件对计算资源利用的最大化,显著提高软件的计算效率和软件整体性能。
申请公布号 CN103279391A 申请公布日期 2013.09.04
申请号 CN201310234389.1 申请日期 2013.06.09
申请人 浪潮电子信息产业股份有限公司 发明人 吴庆
分类号 G06F9/50(2006.01)I 主分类号 G06F9/50(2006.01)I
代理机构 代理人
主权项 一种基于CPU与MIC架构处理器协同计算的负载均衡优化方法, 其特征在于包括CPU与MIC架构处理器协同计算模式软件的负载均衡优化的层次和CPU与MIC架构处理器协同计算模式软件的负载均衡优化方法,其中:(1)CPU与MIC架构处理器协同计算模式软件的负载均衡优化的层次,下面分别针对三个负载均衡层次,讲述负载均衡优化的方法:A)计算节点之间负载均衡;计算节点之间负载均衡,是指各个计算节点间的计算任务分布基本均衡,避免某节点计算量过大或过小;这里的各计算节点,都是传统CPU与MIC架构处理器构成的混合架构计算节点,节点间以MPI并行的方式并行计算,节点间的负载均衡与传统纯CPU集群上的负载均衡一致,采用静态负载均衡和动态负载均衡的方法;B)计算节点内CPU与MIC计算设备之间负载均衡,是指计算节点内CPU与MIC计算设备之间负载均衡,是CPU与MIC设备之间计算任务基本均衡,由于CPU与MIC处理器的计算能力不等,因此CPU与MIC之间分配的计算量也不能相同,CPU与MIC之间的负载均衡最好的方式是采用动态负载均衡的方法,包括:C)CPU和MIC计算设备内部各计算内核之间负载均衡,是指CPU和MIC计算设备内部各计算内核之间负载均衡,是指CPU和MIC设备的各个计算内核之间的计算任务分布均衡;实现负载均衡有两种方案:静态负载均衡和动态负载均衡,其中:A) 静态负载均衡静态负载均衡需要人工将工作区域分割成多个可并行的部分,并保证分割成的各个部分工作量能够均衡地分布到各个进程、线程乃至处理器上运行,也就是说工作量在多个任务之间均衡地进行分配,使并行程序的加速性能最高;B) 动态负载均衡动态负载均衡是在程序运行过程中动态分配计算任务以达到负载均衡的目的,软件实践中存在着很多无法通过静态负载均衡方式解决的情形,主要表现为计算任务具有随机性、实时性,无法事无进行预判,动态负载均衡的系统总体性能比静态负载均衡要好,但代码实现上更复杂;基于CPU与MIC架构处理器协同计算模式软件的负载均衡优化的方法有:[1]任务划分:对于任务划分的应用程序,在CPU与MIC之间的负载均衡采用动态负载均衡的优化方法,假设有N个任务,一个节点内有两个MIC卡,即三个设备,1个CPU和2个MIC,动态负载均衡的方法是每个设备先获取一个任务进行计算,计算之后立即获取下一个任务,不需要等待其他设备,直到N个任务计算完成,这种方式只需要设定一个主进程,负责给各个计算进程分配任务;任务划分优化;是指任务划分优化,是基于数据或任务并行模式的计算任务分配方式优化,从而使各并行处理单元的计算任务实现均衡;[2]数据划分:由于需要一次性在设备上分配内存空间,因此,对于数据划分的应用程序,无法采用动态负载均衡,而需要采用静态数据划分方法,静态的数据划分方式使异构设备间的负载均衡变得困难,有时甚至无法实现,对于一些迭代应用程序,采用学习型的数据划分方法,包括让CPU和MIC分别做一次迭代相同计算量的计算,然后通过各自的运行时间计算出CPU与MIC的计算能力比例,然后再对数据进行划分;[3]进程/线程调度优化;是指进程/线程调度优化,进程或线程是并行处理的软件层次的执行单元,是并行计算的载体,进程或线程的最优化调度,直接关系到软件的整体性能;C) CPU和MIC计算设备内部各计算内核之间负载均衡CPU和MIC计算设备内部各计算内核之间负载均衡,又可称为设备内的负载均衡,采用OpenMP中的三种负载均衡策略:(a)schedule(static [,chunk]):静态调度,线程每次获得chunk个迭代次数,并以轮询的方式进行,如果不指明chunk,则以平均分配的方式进行,这是默认的调度方式;(b)schedule(dynamic [,chunk]):动态调度,动态地将迭代分配到各个线程,使用chunk参数时,每次分配给线程的迭代次数为指定的chunk次,不使用chunk参数时将迭代逐个分配到各个线程;(c)schedule(guided [,chunk]):导引调度是一种可指导的启发式自适应调度方法,开始时每个线程分配到较大的迭代块,之后分配到的迭代块会逐渐递减,迭代块的大小会按指数下降到指定的chunk大小,如果没有指定chunk参数,那么迭代块大小最小降到1;d)线程亲和性优化负载均衡,其实质是分配到进程/线程上的任务负荷要相对均衡,并实现“能者多劳”,使得每个线程尽可能都处于忙碌状态,最后同时退出,但是线程并不是凭空存在的,线程最终需要分配到处理器的计算核心上执行,线程分配到各处理核心执行的过程,就是线程调度,将各计算线程均衡调度到不同的处理器核心上,使得每个处理核心的工作负荷相当,实现各计算核间的负载均衡;进程和线程的亲和性是指可以将进程或者线程强制限制在可用的CPU子集上运行的特性,简单地说,CPU亲和性就是进程要在某个给定的CPU上尽量长时间地运行而不被迁移到其他处理器的倾向性,它一定程度上把进程/线程在多处理器系统上的调度策略暴露给系统程序员;软亲和性意味着进程并不会在处理器之间频繁迁移,而硬亲和性则意味着进程需要在您指定的处理器上运行,进程/线程亲和性设置让开发人员编程实现CPU硬亲和性,这意味着应用程序显式地指定进程在哪个或哪些处理器上运行;在 Linux 内核中,所有的进程/线程都有一个相关的数据结构,称为task_struct,这个结构非常重要,其中与亲和性相关度最高的是 cpus_allowed 位掩码,这个位掩码由n位组成,与系统中的n个逻辑处理器一一对应;如果为给定的进程设置了给定的位,那么这个进程就在相关的 CPU 上运行,因此,如果一个进程能在任何处理器核上运行,并且能够根据需要在处理器核之间进行迁移,那么位掩码就全是 1,实际上,这就是 Linux 中进程的缺省状态;进程/线程亲和性设置实质上就是设置进程/线程数据结构中与处理器核相关的位掩码;(2)线程亲和性的负载均衡优化方法的设计(a)线程只认识逻辑核,因此使用超线程技术的1个物理核也会被视为2个计算核心;(b)需要解决cache利用效率和物理核心负载均衡的矛盾;(c)这种优化方法适用于不能利用全部物理核心或任务局部性很明显的情况;亲和性设置的不同,线程会被分配到不同的逻辑核心上,如果线程间有数据相关,当逻辑核心处于同一物理核心时,线程间通过利用同一物理核心的cache,提高运行速度,然而,该核承担了过多的计算任务而其它核相对“清闲”,又导致计算资源利用率未达到最大化,程序的整体性能并非最优,MIC处理器上的线程亲和性具有scatter、compact和balanced MIC专属3种模式:scatter模式scatter模式将线程优先分配到负载较轻的物理核心上,这种方式能较好地达到负载均衡,但由于相邻线程不处于同一物理核心当中,因此如果相邻线程间有数据共享的话,则不能利用cache进行加速,而在MIC中,虽然能读取其它核心的cache(L2),但会导致可用cache的总体容量减少,而且读取其它核心所属cache的效率比读取本地cahce差;compact模式compact模式将线程按顺序分配至逻辑核心上,这种方式能使相邻线程尽量处于同一物理核心当中,如果相邻线程间有数据共享的话,这种方式能提高cache利用效率,但是,如果相邻线程负载相当且线程总数相对较少时,会造成任务负载高度集中,导致严重的负载不均衡,但是,对于某些比较特殊的任务分配方式,任务分配具有明显的规律性,包括奇数线程负载较轻,偶数线程负载较重,这种线程亲和模式反而能达到较好的负载均衡;balanced模式balanced模式是MIC上特有的模式,与scatter模式类似,也是尽量将线程分配到负载较轻的物理核心,但与之不同的是,balanced模式在兼顾均衡性的同时,也会尽量将相邻线程分配在同一物理核心当中,这种方式在负载均衡和cache利用上做到了一定的平衡;以上三种方式都是静态划分的方式,需要根据程序的实际负载情况,选择合适的线程分配方式,才能达到比较好的效果。
地址 250014 山东省济南市高新区舜雅路1036号
您可能感兴趣的专利