一种远程并行程序调试系统中基于树形的消息聚集方法转让专利

申请号 : CN201010524824.0

文献号 : CN102023920B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 伍卫国樊源泉赵海祥王恩东公维锋

申请人 : 西安交通大学浪潮(北京)电子信息产业有限公司

摘要 :

一种远程并行程序调试系统中基于树形的消息聚集方法,首先构建一种树形调试框架,再为树形调试框架中除根结点外的其他结点绑定串行调试工具gdb,然后把调试进程分配到该框架的同一棵子树中,最后根控制器按照该框架逐层把调试命令分发到位于树形调试框架中各个结点的gdb进程,调试操作结束后,由gdb进程所在结点的叶子控制器把调试结果产生的消息返回给其父亲结点调试控制器,该控制器在收到其所有孩子结点返回的消息后,将其聚集成四类消息之一,返回给其父亲结点调试控制器进行聚集,再返回到根控制器并进行聚集,并把聚集后的消息封装成ip数据包发送至客户端,本发明具有系统并发性高、通信量少、响应时间短的优点。

权利要求 :

1.一种远程并行程序调试系统中基于树形的消息聚集方法,其特征在于:包括以下步骤:

第一步,构造树形的调试框架,根据调试进程数n,其中n的取值为:1≤n,构造一棵n+1个结点的树,树的度可以手动设置为c,其中c的取值为:1≤c≤n,按照从0到n-1的顺序依次为每个调试进程分配一个消息传递接口MPI的唯一编号rank,把进程编号rank值为n+1的结点设置为树形调试框架的根结点,即根控制器MainController所在的结点,把位于同一个调试进程集的待调试进程分配到树形调试框架中同一个子树中,树形调试框架中除去根结点和叶子外的每个结点构成中间控制器MidController,其中每个结点的度为r,r的取值为:1≤r≤c,叶子结点即叶子控制器LeafController只接收调试命令并负责并行程序的调试信息收集,然后求出树形调试框架中每个结点的父亲、孩子和子孙结点的进程编号rank,分别将其存放于父结点parent、孩子结点children和后代结点descendents的数据结构中,最后为树形调试框架中除根结点外的每个结点启动一个串行gdb调试进程,而根结点只负责调试命令的转发和调试结果消息的接收聚集;

第二步,调试命令的接收和转发,来自客户端的调试命令首先被发送到树形调试框架的根控制器MainController,根控制器MainController接收到命令后,对命令进行分析,并根据其孩子结点children数据结构中记录的进程编号rank,按照广度优先策略依次把调试命令转发给中间控制器MidController,中间控制器MidController接收到调试命令后,首先把自身的进程编号rank与调试命令中的进程编号rank进行比较:相等,则传递命令给自身绑定的串行调试器gdb进程,串行调试器gdb进程执行该调试命令;不相等,则根据其孩子结点children数据结构中记录的进程编号rank值,按照广度优先的策略依次把调试命令转发给属于其孩子结点children的中间控制器MidController,其余结点采用相同的方法,直到该调试命令转发到位于树形调试框架叶子结点的叶子控制器LeafController,此时,叶子控制器LeafController把各自的调试命令传递给自身绑定的串行调试器gdb进程,以执行调试任务;

第三步,消息的聚集,每个串行调试器gdb执行完各自接收到的调试命令后,会以消息的方式返回调试进程执行的结果,但是这些消息中并没有进程的标识,为了对消息进行区分,使用产生消息数据的那个调试进程的编号作为该条消息的头部标记,这个整数值标记是全局唯一的,用中括号“[]”包括起来放在该消息的头部,以区别于消息正文,如果一个消息正文属于多个进程,则在头部的中括号“[]”里列出每个调试进程的编号,编号间用“,”隔开,语法格式如下:|[process-idj,…,process-idk]*mi_result

其中:符号“|”隔开不同消息,process-idj是调试进程的rank值,mi_result是消息正文,也就是单个调试进程返回的调试结果数据,

在对调试进程执行结果所产生的消息数据进行聚集时,把消息分成四种情况,分别对应四种消息聚集方法:第一类,数据部分完全相同的消息,指所有进程返回的消息完全相同,这类消息在合并的时候,只需保留一条,在此消息前面加上进程号,以表示是哪些进程产生了这个消息;第二类,数据部分不完全相同的消息,指调试结果result里至少有一个调试数据值value不同,其余的调试数据值value都相同,对这类消息处理时,将不同的调试数据值value都列出来,值之间用“,”隔开,在每一个值前面加上中括号“[]”,“[]”中列出该值所属的每一个进程号,进程号之间也用“,”隔开;第三类,数据部分完全不同的消息,此处的不同是指消息不属于第一、第二类的情况,此类消息不进行聚集操作,处理的方法是在每条消息的前面加上该消息所属调试进程的编号,前后两条消息之间用“|”隔开;

第四类,针对多条消息而言,部分属于第一、二类,另一部分属于第三类,处理的方法是组合第二类和第三类的处理方法,把其中相同的消息按照第二类合并,对于完全不同的消息,在其前加上“[]”,“[]”中列出该消息所属的进程号,作为单独的一条消息,前后两条消息之间用“|”隔开;

第四步,调试结果的返回,gdb调试进程执行完调试命令后,由该gdb进程所在结点的叶子控制器LeafController根据其父亲结点parent数据结构中记录的父亲结点parent进程编号rank,向父亲结点parent返回调试结果,父亲结点parent接收到其所有孩子结点children返回的调试结果后,与其自身绑定的调试器返回的结果按照第三步的聚集方法进行消息的聚集操作,然后根据其自身的父亲结点parentparent数据结构中记录的父亲结点parent进程编号rank,向其父亲结点parent返回调试结果,其他结点类似,直到根控制器MainController接收到其所有后代结点descendents返回的调试结果后,按照第三步的聚集方法,对消息进行聚集操作,并把聚集后的消息封装成IP数据包格式,发送至客户端。

说明书 :

一种远程并行程序调试系统中基于树形的消息聚集方法

技术领域

[0001] 本发明属于计算机技术领域,具体涉及一种远程并行程序调试系统中基于树形的消息聚集方法。

背景技术

[0002] 在并行程序调试过程中,数据传输密集,客户端与调试系统之间的通信量会跟随调试进程数目的增加而增大,当调试进程数目达到成百上千后,对于基于客户端/服务器模式的远程调试系统来说,需要传递巨量的消息,这些巨量消息的传递会严重影响系统的响应速度,因此,合理的对消息进行聚集,减少网络通信量,缩短系统的响应时间,是在远程并行调试系统开发过程中需要解决的主要问题。目前,针对并行调试系统中消息聚集的方法主要有度大小固定的树形消息聚集方法。度大小固定的树形消息聚集方法基于树形消息收集框架,框架中每个叶子都驻留一个并行程序的调试进程,各个调试进程独立运行,输出的调试数据由基于树形的调试框架中的聚集器收集打包成消息,聚集器按照自底向上的顺序,依次收集消息,最终汇总到根聚集器,其中聚集器的度固定,每个聚集器收集其孩子的输出消息。首先位于树形调试架构中最底层的聚集器对调试进程输出的结果数据进行分类,并用一个标记来标识每类数据来源,被标记的数据按聚集算法收集打包成消息,当达到容量或超时时,则将打包好的消息向树形调试框架中该聚集器父亲结点的聚集器发送。该方法把输出的消息分为三类:数据部分完全相同的消息(Type1);除了数据部分不同外其他部分相同的消息(Type2);数据部分完全不同的消息(Type3)。聚集算法的主要思想是:对于Type1,多个调试进程输出的结果数据,经过聚集操作,成为一条结果消息;对于Type2,按照min/max对来表示数据,但只表示范围;对于Type3,不对数据表示做处理,直接传递消息。此方法中树形调试框架的度固定为8,每个调试进程分别被绑定到叶子,根结点和分支结点不参与调试,只负责调试结果数据的收集和调试命令的转发。但该方法不能保证同一个调试进程集中的所有进程被分配到同一棵最小子树中,增加了同一进程集中,位于不同子树中的调试进程产生的调试结果数据传输数量,从而增加了并行调试系统的通信量。该方法提出的消息聚集方法中,如果两则消息中的数据存在很大程度不同,但又有相似的部分,则视为Type3消息,但在实际情况中还可以对这种消息类型进行处理,找出其中相同的数据部分进行聚集,从而减少系统内部数据的传输量和系统的响应时间,提高调试的效率。

发明内容

[0003] 为了克服上述技术中存在的缺点,本发明的目的在于提供一种远程并行程序调试系统中基于树形的消息聚集方法,本方法是在树形调试模型的基础之上,对调试进程集中各个进程的分布进行优化,同一个进程集中的调试进程优先分布在树形调试框架的同一棵子树中,另外在树形调试框架中除根结点和叶子外的中间结点同时也绑定串行调试器gdb,以提高系统的并发性,同时把gdb调试进程返回的结果数据分成四类,分别采用四种方法进行聚集,从而能有效地减小消息的大小,减少并行调试系统的通信量,具有系统通信次数少、响应时间短等优点。
[0004] 为了达到上述目的,本发明所采用的技术方案是:
[0005] 一种远程并行程序调试系统中基于树形的消息聚集方法,包括以下步骤:
[0006] 第一步,构造树形的调试框架,根据调试进程数n,其中n的取值为:1≤n,构造一棵n+1个结点的树,树的度可以手动设置为c,其中c的取值为:1≤c≤n,按照从0到n-1的顺序依次为每个调试进程分配一个消息传递接口MPI的唯一编号rank,把进程编号rank值为n+1的结点设置为树形调试框架的根结点,即根控制器MainController所在的结点,把位于同一个调试进程集的待调试进程分配到树形调试框架中同一个子树中,树形调试框架中除去根结点和叶子外的每个结点构成中间控制器MidController,其中每个结点的度为r,r的取值为:1≤r≤c,子结点即叶子控制器LeafController只接收调试命令并负责并行程序的调试信息收集,然后求出树形调试框架中每个结点的父亲、孩子和子孙结点的进程编号rank,分别将其存放于父结点parent、孩子结点children和后代结点descendents的数据结构中,最后为树形调试框架中除根结点外的每个结点启动一个串行gdb调试进程,而根结点只负责调试命令的转发和调试结果消息的接收聚集;
[0007] 第二步,调试命令的接收和转发,来自客户端的调试命令首先被发送到树形调试框架的根控制器MainControl1er,根控制器MainController接收到命令后,对命令进行分析,并根据其孩子结点children数据结构中记录的进程编号rank,按照广度优先策略依次把调试命令转发给中间控制器MidController,中间控制器MidController接收到调试命令后,首先把自身的进程编号rank与调试命令中的进程编号rank进行比较:相等,则传递命令给自身绑定的串行调试器gdb进程,串行调试器gdb进程执行该调试命令;不相等,则根据其孩子结点children数据结构children中记录的进程编号rank值,按照广度优先的策略依次把调试命令转发给属于其孩子结点children的中间控制器MidController,其余结点采用相同的方法,直到该调试命令转发到位于树形调试框架叶子结点的叶子控制器LeafController,此时,叶子控制器LeafController把各自的调试命令传递给自身绑定的串行调试器gdb进程,以执行调试任务;
[0008] 第三步,消息的聚集,每个串行调试器gdb执行完各自接收到的调试命令后,会以消息的方式返回调试进程执行的结果,但是这些消息中并没有进程的标识,为了对消息进行区分,使用产生消息数据的那个调试进程的编号作为该条消息的头部标记,这个整数值标记是全局唯一的,用中括号“[]”包括起来放在该消息的头部,以区别于消息正文,如果一个消息正文属于多个进程,则在头部的中括号“[]”里列出每个调试进程的编号,编号间用“,”隔开,语法格式如下:
[0009] |[process-idj,…,process-idk]*mi_result
[0010] 其中:符号“|”隔开不同消息,process-idj是调试进程的rank值,mi_result是消息正文,也就是单个调试进程返回的调试结果数据,
[0011] 在对调试进程执行结果所产生的消息数据进行聚集时,把消息分成四种情况,分别对应四种消息聚集方法:第一类,数据部分完全相同的消息,指所有进程返回的消息完全相同,这类消息在合并的时候,只需保留一条,在此消息前面加上进程号,以表示是哪些进程产生了这个消息;第二类,数据部分不完全相同的消息,指调试结果result里至少有一个调试数据值value不同,其余的调试数据值value都相同,对这类消息处理时,将不同的调试数据值value都列出来,值之间用“,”隔开,在每一个值前面加上中括号“[]”,“[]”中列出该值所属的每一个进程号,进程号之间也用“,”隔开;第三类,数据部分完全不同的消息,此处的不同是指消息不属于第一、第二类的情况,此类消息不进行聚集操作,处理的方法是在每条消息的前面加上该消息所属调试进程的编号,前后两条消息之间用“|”隔开;第四类,针对多条消息而言,部分属于第一、二类,另一部分属于第三类,处理的方法是组合第二类和第三类的处理方法,把其中相同的消息按照第二类合并,对于完全不同的消息,在其前加上“[]”,“[]”中列出该消息所属的进程号,作为单独的一条消息,前后两条消息之间用“|”隔开;
[0012] 第四步,调试结果的返回,gdb调试进程执行完调试命令后,由该gdb进程所在结点的叶子控制器LeafController根据其父亲结点parent数据结构中记录的父亲结点parent进程编号rank,向父亲结点parent返回调试结果,父亲结点parent接收到其所有孩子结点children返回的调试结果后,与其自身绑定的调试器返回的结果按照第三步的聚集方法进行消息的聚集操作,然后根据其自身的父亲结点parent数据结构中记录的父亲结点parent进程编号rank,向其父亲结点parent返回调试结果,其他结点类似,直到根控制器MainController接收到其所有后代结点descendents返回的调试结果后,按照第三步的聚集方法,对消息进行聚集操作,并把聚集后的消息封装成IP数据包格式,发送至客户端。
[0013] 本发明的有益效果是:
[0014] 由于本发明引入了树形调试框架,对于进程数目为n的并行调试程序,可以将系统复杂度降到O(logbn)(b为树的度),另外,由于中间控制器自身也绑定有调试器,因此可以大大提高系统的并行性;另外本发明在树形调试结构中,把同一调试进程集中的进程分配到同一个子树中,减少了位于调试框架中不同子树中结点之间通信的次数和通信量,从而提高了系统的效率,缩短了系统的响应时间;此外,把树形调试结构中负责具体调试的叶子结点产生的消息被分成四类,分别采用四种方法进行消息的聚集,由于在树形调试框架中,根控制器、中间控制器以及叶子控制器之间传递的消息是聚集后的消息,因此本发明减小了调试系统中的网络通信量,提高了系统的执行效率,具有系统通信次数少,响应时间短的优点。

附图说明

[0015] 附图是本发明的树形调试框架示意图。

具体实施方式

[0016] 下面结合附图对本发明作详细描述。
[0017] 一种远程并行程序调试系统中基于树形的消息聚集方法,包括以下步骤:
[0018] 第一步,参照附图,构造树形的调试框架,根据待调试进程数n,其中n的取值为:1≤n,构造一棵如附图所示n+1个结点的树,树的度数可以手动设置设为c,其中c的取值为:1≤c≤n,按照0到n-1的顺序依次为每个进程分配一个消息传递接口MPI的唯一编号rank,把进程编号rank值为n+1的结点设置为树形调试框架的根结点,即根控制器所在的结点,在附图中对应的是——MainController,它位于直接与客户端通信的计算节点(Root Node)上,把位于同一个调试进程集的待调试进程分配到树形调试框架中同一棵子树中,树形调试框架中除去根结点和叶子结点的每个结点构成中间控制器,附图所示——MidController,其中每个结点的度为r,其中r的取值为:1≤r≤c,叶子结点即叶子控制器只接收调试命令并负责并行程序的调试信息收集,如附图所示——LeafController。然后分别求出树形调试框架中每个结点的父亲、孩子和子孙结点的进程编号rank,分别将其存放于父结点parent、孩子结点children和后代结点descendents的数据结构中,最后为树形调试框架中除根结点外的每个结点启动一个串行调试器gdb调试进程,而根结点只负责调试命令的转发和和调试结果消息的接收、聚集;
[0019] 第二步,调试命令的接收和转发,来自客户端的调试命令首先发送到位于树形调试框架根结点处的根控制器MainController,根控制器MainController接收到命令后,对命令进行分析,然后根据其孩子结点children数据结构中记录的进程编号rank值,按照广度优先的策略,依次把调试命令转发给位于其孩子结点的中间控制器MidController,中间控制器MidController接收到调试命令后,首先会把自身拥有的进程编号rank值与调试命令中的进程编号rank值进行比较:如果相等,则接收该命令,并把命令传递给自身绑定的串行调试器gdb进程,串行调试器gdb进程执行该调试命令;如果不相等,则根据其孩子结点children数据结构中记录的进程编号rank值,按照广度优先的策略依次把调试命令转发给其孩子结点children的中间控制器MidController,其余结点采用相同的方法,直到该调试命令被转发到位于树形调试框架叶子结点的叶子控制器LeafController,此时,叶子控制器LeafController把各自的调试命令传递给自身绑定的gdb进程,以执行调试工作;
[0020] 第三步,消息的聚集,首先定义消息的语法格式,每个串行调试器gdb执行完各自接收到的调试命令后,会以消息的方式返回调试进程执行结果,但是这些消息中并没有进程的标识,为了对消息进行区分,使用产生消息数据的那个调试进程的编号作为该条消息的头部标记,这个整数值标记是全局唯一的,用中括号“[]”包括起来放在该消息的头部,以区别于消息正文,如果一个消息正文属于多个进程,则在头部的中括号“[]”里列出每个调试进程的编号,编号间用“,”隔开,语法格式如下:
[0021] |[process-idj,…,process-idk]*mi_result
[0022] 其中:符号“|”隔开不同消息,process-idj是调试进程的rank值,mi_result是消息正文,也就是单个调试进程返回的直接结果数据;
[0023] 在对调试进程执行结果所产生的消息数据进行聚集时,把消息分成四种情况,分别对应四种消息聚集方法:第一类,数据部分完全相同的消息,指所有进程返回的消息完全相同,这类消息在合并的时候,只需保留一条,在此消息前面加上进程号,以表示是哪些进程产生了这个消息;第二类,数据部分不完全相同的消息,指调试结果result里至少有一个调试数据值value不同,其余的调试数据值value都相同,对这类消息处理时,将不同的调试数据值value都列出来,值之间用“,”隔开,在每一个值前面加上中括号“[]”,“[]”里面列出该值所属的每一个进程号,进程号之间也用“,”隔开;第三类,数据完全不同的消息,此处的不同是指消息不属于第一、第二类的情况,此类消息不进行聚集操作,处理的方法是在每条消息的前面加上该消息所属调试进程的编号,前后两条消息之间用“|”隔开;第四类,针对多条消息而言,部分属于第一、二类,另一部分属于第三类,处理的方法是组合第二类和第三类的处理方法,把其中相同的消息按照第二类合并,对于完全不同的消息,在其前加上“[]”,“[]”中列出该消息所属的进程号,作为单独的一条消息,前后两条消息之间用“|”隔开;
[0024] 第四步,调试结果的返回,gdb调试进程执行完调试命令后,由该gdb进程所在结点的叶子控制器LeafController根据其父亲结点parent数据结构中记录的父亲结点进程编号rank值,向父亲结点parent返回调试结果,父亲结点parent接收到其所有孩子结点children返回的调试结果后,与其自身绑定调试器返回的结果按照第三步的聚集方法进行消息的聚集操作,然后根据其自身的父亲结点parent数据结构中记录的父亲结点parent进程编号rank值,向其父亲结点parent返回调试结果,其他结点类似,直到根控制器MainController接收到其所有后代结点descendents返回的调试结果后,按照第三步的聚集方法进行聚集操作,并把聚集后的消息被封装成IP数据包格式,发送至客户端。
[0025] 附图中:Client表示客户端;Intemet/Intranet表示广域网或内联网;Root node表示调试系统的根计算节点;Node 0~Node n表示0到n台不同计算节点;MainController表示主控制器;MidController表示中间控制器;LeafController表示叶子控制器;MPI P0~MPI Pn表示不同的并行调试程序;GDB表示调试器。