一种多线程程序下多节点并行架构的方法及装置制造方法

文档序号:6535487阅读:226来源:国知局
一种多线程程序下多节点并行架构的方法及装置制造方法
【专利摘要】本发明披露了一种多线程程序下多节点并行架构的方法及装置,其中包括:在原始程序的主函数中创建主、从进程,并获取分别代表主、从进程的信息;在主进程的主函数中保留原始程序的线程开辟、线程绑定线程函数的操作;在主进程的热点线程函数中删除原有的计算代码,增加与子进程通信的代码;在子进程的主函数中删除原程序的主函数内容,增加原始程序的热点线程函数计算部分和与主进程通信部分。本发明通过在现有多线程版本程序框架下加入进程通信,实现多线程框架下多节点并行架构,提高了程序扩展性和性能,从而充分利用了节点间计算资源。
【专利说明】一种多线程程序下多节点并行架构的方法及装置
【技术领域】
[0001]本发明涉及计算机软件优化技术,尤其涉及多线程程序下多节点并行架构的方法
及装置。
【背景技术】
[0002]并行计算广义是指在一个程序中同时执行多个计算任务,通常用于对性能要求极高的场合,例如:气象预报、石油勘探等科学计算领域。并行计算能够充分利用CPU计算资源,因此应用越来越广泛。
[0003]并行计算通常有两种实现方式:多进程和多线程。多线程程序仅能用于单节点(节点指网络中的一个计算设备)并行计算,优势在于线程间通信简单,线程开销小。多进程程序可以用于多节点并行计算,但是节点间通信需要通过网络实现,开销较大。
[0004]通常结合二者的设计方式是框架采用多进程方式,进程内部使用多线程方式,以充分利用多节点和节点内的CPU计算资源。
[0005]多进程程序通常采用消息传递接口(MPI, Message Passing Interface)进行开发。MPI是通用的工业级的进程间通信接口,可以方便地通过消息传递方式在进程间进行通信,并提供了方便的集群多进程运行方式。
[0006]多线程程序可以使用多种方式进行线程间并行计算,例如:0penMP、pThread等。OpenMP是以编译指导语句形式对源程序进行简单修改,即可利用多线程库进行自动的并行,隐藏了很多细节。OpenMP库底层是调用pThread实现的。pThread库是Linux下的底层线程库,Windows下也有对应的线程应用程序接口(API, Application ProgramInterface ),使用pThread库可以手工控制线程运作方式,提供了更加精细的控制。
[0007]但是,如果原始计算程序为多线程程序,欲充分利用多节点计算资源,就必须将其改造为多进程程序。现在采用的方法是将代码大幅重写,将多线程程序框架改为多进程程序框架,费时费力。目前还没有一种方法能快速将多线程程序改造为保留多线程程序框架,计算部分采用多进程架构,以充分利用节点间计算资源。

【发明内容】

[0008]本发明所要解决的技术问题是提供一种多线程程序下多节点并行架构的方法,能够使得多线程程序快速改造为多线程框架下的多进程计算架构。
[0009]为了解决上述技术问题,本发明提供了一种多线程程序下多节点并行架构的方法,包括:
[0010]在原始程序的主函数中创建主、从进程,并获取分别代表主、从进程的信息;
[0011]在主进程的主函数中保留原始程序的线程开辟、线程绑定线程函数的操作;在主进程的热点线程函数中删除原有的计算代码,增加与子进程通信的代码;在子进程的主函数中删除原程序的主函数内容,增加原始程序的热点线程函数计算部分和与主进程通信部分。[0012]进一步地,在该方法步骤之前还包括:
[0013]根据原始程序测得热点线程函数,并通过分析确定热点线程函数能够优化成多进程方式并行架构。
[0014]进一步地,在原始程序的主函数中创建主、从进程,并获取分别代表主、从进程的信息;具体包括:
[0015]在主函数中使用消息传递接口初始化函数创建所述主、从进程,并通过消息传递接口获取进程号函数获取相应的进程号,其中进程号O代表主进程,其余非O进程号代表从进程。
[0016]进一步地,在主进程的热点线程函数中删除原有的计算代码,增加与子进程通信的代码,具体包括:
[0017]在进入主进程的热点线程函数时,主进程向子进程发送包括任务长度,任务数据的任务相关信息;待完成全部信息发送时,主进程进入等待状态,等待子进程返回计算结果O
[0018]进一步地,在子进程的主函数中删除原程序的主函数内容,增加原始程序的热点线程函数计算部分和与主进程通信部分,具体包括:
[0019]由子进程等待主进程发送任务长度的信息,并根据任务长度分配内存空间;
[0020]由子进程等待接收主进程发送任务数据的信息,并将收到的任务数据信息存入分配的内存空间;使用原始程序热点线程函数中计算部分调用的子函数或相应的代码对接收的任务数据进行计算;计算结束将计算结果发送至主进程;重复本步骤直到程序结束。
[0021]为了解决上述技术问题,本发明提供了一种多线程程序下多节点并行架构的装置,包括相互连接的主函数模块和主进程计算模块,其中:
[0022]主函数模块,用于初始化进程参数,针对主进程和从进程运行相应的分支,通过多个子进程接收主进程传输的参与计算的数据并进行计算,将计算结果发送给主进程;
[0023]主进程计算模块,用于将需要计算的数据传递给子进程,并接收子进程的计算结果O
[0024]进一步地,主函数模块通过进程创建模块运行进程初始化函数,初始化进程参数,包括创建线程并绑定线程函数;通过主函数判断模块判断进程属于主进程或从进程,并针对不同进程运行相应的分支;通过子进程计算模块使得多个子进程接收主进程传输的参与计算的数据,并通过调用核心计算模块分别对接收的数据进行计算,并分别将计算结果发送给主进程。
[0025]本发明通过在现有多线程版本程序框架下加入进程通信,实现多线程框架下多节点并行架构,提高了程序扩展性和性能,从而充分利用了节点间计算资源。
【专利附图】

【附图说明】
[0026]图1是本发明的多线程程序下多节点并行架构的方法实施例的流程图;
[0027]图2是现有的原始计算程序组成的装置结构示意图;
[0028]图3是本发明将图2所示的装置改造成的本发明的多线程程序下多节点并行架构的装置实施例的结构示意图。【具体实施方式】
[0029]以下结合附图和优选实施例详细说明本发明的技术方案。应该理解,以下列举的实施例仅用于说明和解释本发明,而不构成对本发明技术方案的限制。
[0030]如图1所示,是本发明的多线程程序下多节点并行架构的方法实施例的流程,包括如下步骤:
[0031]步骤S110,根据原始程序测得热点线程函数,并通过分析确定该热点线程函数能够优化成多进程方式并行架构;
[0032]其中,测得的热点线程函数可以有一个或多个。
[0033]步骤S120,在原始程序的主函数中创建主、从进程,并获取分别代表主、从进程的
信息;
[0034]其中,以MPI为例建立进程,即在主函数中使用MPI初始化函数创建主、从进程,并获取分别代表主从进程的进程号,即通过MPI获取进程号函数获取相应的进程号,其中进程号O表示主进程,其余非O进程号表示从进程。因此,可以通过判断进程号确定主进程与从进程,并在不同的分支中处理不同的情况。
[0035]需要说明的是,建立进程的方式与编程人员使用的方式有关。例如以MPI为例,主、从进程使用同一份源代码,对程序员来说,创建进程是在初始化函数中完成的;但真实的创建进程操作是在程序启动时完成的。由于本发明面向的是程序员,因此这里采用以程序员视角为准,将初始化函数认为是创建进程的操作,即每个进程都有主函数,在主函数内都会通过执行初始化函数创建相应的进程,但是所有进程使用同一份源代码,并根据进程号执行不同的操作。
[0036]步骤S130,在主进程的主函数中保留原始程序的线程开辟、线程绑定线程函数的操作;
[0037]步骤S140,在主进程的热点线程函数中删除原有的计算代码,增加与子进程通信的代码;
[0038]其中,在进入主进程的热点线程函数时,主进程向子进程发送任务长度,任务数据等任务相关信息;待完成全部信息发送时,主进程进入等待状态,等待子进程返回计算结果。
[0039]步骤S150,在子进程的主函数中删除原程序的主函数内容,增加原始程序的热点线程函数计算部分和与主进程通信部分。
[0040]其中,具体步骤为:
[0041]由子进程等待主进程发送任务长度信息,并根据任务长度分配内存空间;
[0042]由子进程等待接收主进程发送任务数据信息,并将收到的任务数据信息存入分配的内存空间;使用原始程序热点线程函数中计算部分调用的子函数或相应的代码对接收的任务数据进行计算;计算结束将计算结果发送至主进程;重复本步骤直到程序结束。
[0043]本发明针对上述方法实施例,相应地还提供了多线程程序下多节点并行架构的装置实施例,其结构是对现有的原始计算程序组成结构进行改进而构成的。
[0044]如图2所示,是一个现有的典型的多线程计算程序组成的装置结构,其中:
[0045]主函数模块210,包含创建线程模块220,通过调用创建线程模块220创建线程并绑定线程函数,计算模块230;[0046]创建线程模块220,用于创建线程并绑定线程函数;
[0047]计算模块230,包括实现并行计算的热点计算函数,与线程绑定为线程函数;
[0048]实际上,无论是否为热点计算函数,均可与线程绑定成为线程函数。在此,是将计算模块230的热点计算函数绑定为线程函数。
[0049]需要说明的是,线程函数可以有多个,并与不同的线程绑定,在下面的实施例中,仅对一个线程函数进行改造,所以对其它函数不再列出。
[0050]核心计算模块240,包含在计算模块230中,通常为一个循环体,形式是通过代码段或子函数完成一次计算工作。
[0051]每次调用核心计算模块240之间没有顺序依赖。即,多次调用核心计算模块240时,没有先后顺序的限制。
[0052]本发明通过对图2所示的装置结构进行改进,构成图3所示装置实施例的结构,包括相互连接的主函数模块310和主进程计算模块330,其中:
[0053]主函数模块310,用于初始化进程参数,针对主进程和从进程运行相应的分支,通过多个子进程接收主进程传输的参与计算的数据并进行计算,将计算结果发送给主进程;
[0054]主进程计算模块330,用于将需要计算的数据传递给子进程,并接收子进程的计算结果。
[0055]在上述装置实施例中,
[0056]主函数模块310通过进程创建模块220运行进程初始化函数,初始化进程参数,包括创建线程并绑定线程函数;通过主函数判断模块320判断进程属于主进程或从进程,并针对不同进程运行相应的分支;通过子进程计算模块340使得多个子进程接收主进程传输的参与计算的数据,并通过调用核心计算模块240分别对接收的数据进行计算,并分别将计算结果发送给主进程。
[0057]下面针对上述方法及装置实施例,给出相应的应用实例,其处理的原始程序伪代码如下:
[0058]
【权利要求】
1.一种多线程程序下多节点并行架构的方法,包括: 在原始程序的主函数中创建主、从进程,并获取分别代表主、从进程的信息; 在主进程的主函数中保留原始程序的线程开辟、线程绑定线程函数的操作;在主进程的热点线程函数中删除原有的计算代码,增加与子进程通信的代码;在子进程的主函数中删除原程序的主函数内容,增加原始程序的热点线程函数计算部分和与主进程通信部分。
2.按照权利要求1所述的方法,其特征在于,在该方法步骤之前还包括: 根据所述原始程序测得热点线程函数,并通过分析确定所述热点线程函数能够优化成多进程方式并行架构。
3.按照权利要求2所述的方法,其特征在于,在原始程序的主函数中创建主、从进程,并获取分别代表主、从进程的信息;具体包括: 在主函数中使用消息传递接口初始化函数创建所述主、从进程,并通过消息传递接口获取进程号函数获取相应的进程号,其中进程号O代表主进程,其余非O进程号代表从进程。
4.按照权利要求3所述的方法,其特征在于,所述在主进程的热点线程函数中删除原有的计算代码,增加与子进程通信的代码,具体包括: 在进入所述主进程的热点线程函数时,主进程向子进程发送包括任务长度,任务数据的任务相关信息;待完成全部信息发送时,主进程进入等待状态,等待子进程返回计算结果O
5.按照权利要求3所述的方法,其特征在于,所述在子进程的主函数中删除原程序的主函数内容,增加原始程序的热点线程函数计算部分和与主进程通信部分,具体包括: 由子进程等待主进程发送所述任务长度的信息,并根据所述任务长度分配内存空间; 由子进程等待接收主进程发送所述任务数据的信息,并将收到的所述任务数据信息存入分配的内存空间;使用原始程序热点线程函数中计算部分调用的子函数或相应的代码对接收的任务数据进行计算;计算结束将计算结果发送至主进程;重复本步骤直到程序结束。
6.一种多线程程序下多节点并行架构的装置,其特征在于,包括相互连接的主函数模块和主进程计算模块,其中: 主函数模块,用于初始化进程参数,针对主进程和从进程运行相应的分支,通过多个子进程接收主进程传输的参与计算的数据并进行计算,将计算结果发送给主进程; 主进程计算模块,用于将需要计算的数据传递给子进程,并接收子进程的计算结果。
7.按照权利要求6所述的装置,其特征在于, 所述主函数模块通过进程创建模块运行进程初始化函数,初始化进程参数,包括创建线程并绑定线程函数;通过主函数判断模块判断进程属于主进程或从进程,并针对不同进程运行相应的分支;通过子进程计算模块使得多个子进程接收主进程传输的参与计算的数据,并通过调用核心计算模块分别对接收的数据进行计算,并分别将计算结果发送给主进程。
【文档编号】G06F9/38GK103744643SQ201410012455
【公开日】2014年4月23日 申请日期:2014年1月10日 优先权日:2014年1月10日
【发明者】沈铂, 张广勇, 卢晓伟, 吴韶华 申请人:浪潮(北京)电子信息产业有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1