CN103744643B - 一种多线程程序下多节点并行架构的方法及装置 - Google Patents
一种多线程程序下多节点并行架构的方法及装置 Download PDFInfo
- Publication number
- CN103744643B CN103744643B CN201410012455.5A CN201410012455A CN103744643B CN 103744643 B CN103744643 B CN 103744643B CN 201410012455 A CN201410012455 A CN 201410012455A CN 103744643 B CN103744643 B CN 103744643B
- Authority
- CN
- China
- Prior art keywords
- function
- subprocess
- thread
- host
- master
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
- 238000000034 method Methods 0.000 title claims abstract description 178
- 230000008569 process Effects 0.000 claims abstract description 147
- 238000004891 communication Methods 0.000 claims abstract description 13
- 230000006870 function Effects 0.000 claims description 93
- 238000004364 calculation method Methods 0.000 claims description 19
- 230000005540 biological transmission Effects 0.000 claims description 6
- 238000004458 analytical method Methods 0.000 claims description 3
- 241000208340 Araliaceae Species 0.000 claims 1
- 235000005035 Panax pseudoginseng ssp. pseudoginseng Nutrition 0.000 claims 1
- 235000003140 Panax quinquefolius Nutrition 0.000 claims 1
- 238000012217 deletion Methods 0.000 claims 1
- 230000037430 deletion Effects 0.000 claims 1
- 235000008434 ginseng Nutrition 0.000 claims 1
- 230000008901 benefit Effects 0.000 abstract description 3
- 230000008859 change Effects 0.000 description 2
- 230000004048 modification Effects 0.000 description 2
- 238000012986 modification Methods 0.000 description 2
- 230000009466 transformation Effects 0.000 description 2
- 230000006399 behavior Effects 0.000 description 1
- 238000006243 chemical reaction Methods 0.000 description 1
- 239000012141 concentrate Substances 0.000 description 1
- 230000001419 dependent effect Effects 0.000 description 1
- 238000013461 design Methods 0.000 description 1
- 238000010586 diagram Methods 0.000 description 1
- 230000005611 electricity Effects 0.000 description 1
- 238000005516 engineering process Methods 0.000 description 1
- 238000011156 evaluation Methods 0.000 description 1
- 239000000203 mixture Substances 0.000 description 1
- 238000011112 process operation Methods 0.000 description 1
- 238000012163 sequencing technique Methods 0.000 description 1
- 239000000126 substance Substances 0.000 description 1
- 238000012360 testing method Methods 0.000 description 1
- 230000000007 visual effect Effects 0.000 description 1
Landscapes
- Stored Programmes (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本发明披露了一种多线程程序下多节点并行架构的方法及装置,其中包括:在原始程序的主函数中创建主、从进程,并获取分别代表主、从进程的信息;在主进程的主函数中保留原始程序的线程开辟、线程绑定线程函数的操作;在主进程的热点线程函数中删除原有的计算代码,增加与子进程通信的代码;在子进程的主函数中删除原程序的主函数内容,增加原始程序的热点线程函数计算部分和与主进程通信部分。本发明通过在现有多线程版本程序框架下加入进程通信,实现多线程框架下多节点并行架构,提高了程序扩展性和性能,从而充分利用了节点间计算资源。
Description
技术领域
本发明涉及计算机软件优化技术,尤其涉及多线程程序下多节点并行架构的方法及装置。
背景技术
并行计算广义是指在一个程序中同时执行多个计算任务,通常用于对性能要求极高的场合,例如:气象预报、石油勘探等科学计算领域。并行计算能够充分利用CPU计算资源,因此应用越来越广泛。
并行计算通常有两种实现方式:多进程和多线程。多线程程序仅能用于单节点(节点指网络中的一个计算设备)并行计算,优势在于线程间通信简单,线程开销小。多进程程序可以用于多节点并行计算,但是节点间通信需要通过网络实现,开销较大。
通常结合二者的设计方式是框架采用多进程方式,进程内部使用多线程方式,以充分利用多节点和节点内的CPU计算资源。
多进程程序通常采用消息传递接口(MPI,Message Passing Interface)进行开发。MPI是通用的工业级的进程间通信接口,可以方便地通过消息传递方式在进程间进行通信,并提供了方便的集群多进程运行方式。
多线程程序可以使用多种方式进行线程间并行计算,例如:OpenMP、pThread等。OpenMP是以编译指导语句形式对源程序进行简单修改,即可利用多线程库进行自动的并行,隐藏了很多细节。OpenMP库底层是调用pThread实现的。pThread库是Linux下的底层线程库,Windows下也有对应的线程应用程序接口(API,Application Program Interface),使用pThread库可以手工控制线程运作方式,提供了更加精细的控制。
但是,如果原始计算程序为多线程程序,欲充分利用多节点计算资源,就必须将其改造为多进程程序。现在采用的方法是将代码大幅重写,将多线程程序框架改为多进程程序框架,费时费力。目前还没有一种方法能快速将多线程程序改造为保留多线程程序框架,计算部分采用多进程架构,以充分利用节点间计算资源。
发明内容
本发明所要解决的技术问题是提供一种多线程程序下多节点并行架构的方法,能够使得多线程程序快速改造为多线程框架下的多进程计算架构。
为了解决上述技术问题,本发明提供了一种多线程程序下多节点并行架构的方法,包括:
在原始程序的主函数中创建主、从进程,并获取分别代表主、从进程的信息;
在主进程的主函数中保留原始程序的线程开辟、线程绑定线程函数的操作;在主进程的热点线程函数中删除原有的计算代码,增加与子进程通信的代码;在子进程的主函数中删除原程序的主函数内容,增加原始程序的热点线程函数计算部分和与主进程通信部分。
进一步地,在该方法步骤之前还包括:
根据原始程序测得热点线程函数,并通过分析确定热点线程函数能够优化成多进程方式并行架构。
进一步地,在原始程序的主函数中创建主、从进程,并获取分别代表主、从进程的信息;具体包括:
在主函数中使用消息传递接口初始化函数创建所述主、从进程,并通过消息传递接口获取进程号函数获取相应的进程号,其中进程号0代表主进程,其余非0进程号代表从进程。
进一步地,在主进程的热点线程函数中删除原有的计算代码,增加与子进程通信的代码,具体包括:
在进入主进程的热点线程函数时,主进程向子进程发送包括任务长度,任务数据的任务相关信息;待完成全部信息发送时,主进程进入等待状态,等待子进程返回计算结果。
进一步地,在子进程的主函数中删除原程序的主函数内容,增加原始程序的热点线程函数计算部分和与主进程通信部分,具体包括:
由子进程等待主进程发送任务长度的信息,并根据任务长度分配内存空间;
由子进程等待接收主进程发送任务数据的信息,并将收到的任务数据信息存入分配的内存空间;使用原始程序热点线程函数中计算部分调用的子函数或相应的代码对接收的任务数据进行计算;计算结束将计算结果发送至主进程;重复本步骤直到程序结束。
为了解决上述技术问题,本发明提供了一种多线程程序下多节点并行架构的装置,包括相互连接的主函数模块和主进程计算模块,其中:
主函数模块,用于初始化进程参数,针对主进程和从进程运行相应的分支,通过多个子进程接收主进程传输的参与计算的数据并进行计算,将计算结果发送给主进程;
主进程计算模块,用于将需要计算的数据传递给子进程,并接收子进程的计算结果。
进一步地,主函数模块通过进程创建模块运行进程初始化函数,初始化进程参数,包括创建线程并绑定线程函数;通过主函数判断模块判断进程属于主进程或从进程,并针对不同进程运行相应的分支;通过子进程计算模块使得多个子进程接收主进程传输的参与计算的数据,并通过调用核心计算模块分别对接收的数据进行计算,并分别将计算结果发送给主进程。
本发明通过在现有多线程版本程序框架下加入进程通信,实现多线程框架下多节点并行架构,提高了程序扩展性和性能,从而充分利用了节点间计算资源。
附图说明
图1是本发明的多线程程序下多节点并行架构的方法实施例的流程图;
图2是现有的原始计算程序组成的装置结构示意图;
图3是本发明将图2所示的装置改造成的本发明的多线程程序下多节点并行架构的装置实施例的结构示意图。
具体实施方式
以下结合附图和优选实施例详细说明本发明的技术方案。应该理解,以下列举的实施例仅用于说明和解释本发明,而不构成对本发明技术方案的限制。
如图1所示,是本发明的多线程程序下多节点并行架构的方法实施例的流程,包括如下步骤:
步骤S110,根据原始程序测得热点线程函数,并通过分析确定该热点线程函数能够优化成多进程方式并行架构;
其中,测得的热点线程函数可以有一个或多个。
步骤S120,在原始程序的主函数中创建主、从进程,并获取分别代表主、从进程的信息;
其中,以MPI为例建立进程,即在主函数中使用MPI初始化函数创建主、从进程,并获取分别代表主从进程的进程号,即通过MPI获取进程号函数获取相应的进程号,其中进程号0表示主进程,其余非0进程号表示从进程。因此,可以通过判断进程号确定主进程与从进程,并在不同的分支中处理不同的情况。
需要说明的是,建立进程的方式与编程人员使用的方式有关。例如以MPI为例,主、从进程使用同一份源代码,对程序员来说,创建进程是在初始化函数中完成的;但真实的创建进程操作是在程序启动时完成的。由于本发明面向的是程序员,因此这里采用以程序员视角为准,将初始化函数认为是创建进程的操作,即每个进程都有主函数,在主函数内都会通过执行初始化函数创建相应的进程,但是所有进程使用同一份源代码,并根据进程号执行不同的操作。
步骤S130,在主进程的主函数中保留原始程序的线程开辟、线程绑定线程函数的操作;
步骤S140,在主进程的热点线程函数中删除原有的计算代码,增加与子进程通信的代码;
其中,在进入主进程的热点线程函数时,主进程向子进程发送任务长度,任务数据等任务相关信息;待完成全部信息发送时,主进程进入等待状态,等待子进程返回计算结果。
步骤S150,在子进程的主函数中删除原程序的主函数内容,增加原始程序的热点线程函数计算部分和与主进程通信部分。
其中,具体步骤为:
由子进程等待主进程发送任务长度信息,并根据任务长度分配内存空间;
由子进程等待接收主进程发送任务数据信息,并将收到的任务数据信息存入分配的内存空间;使用原始程序热点线程函数中计算部分调用的子函数或相应的代码对接收的任务数据进行计算;计算结束将计算结果发送至主进程;重复本步骤直到程序结束。
本发明针对上述方法实施例,相应地还提供了多线程程序下多节点并行架构的装置实施例,其结构是对现有的原始计算程序组成结构进行改进而构成的。
如图2所示,是一个现有的典型的多线程计算程序组成的装置结构,其中:
主函数模块210,包含创建线程模块220,通过调用创建线程模块220创建线程并绑定线程函数,计算模块230;
创建线程模块220,用于创建线程并绑定线程函数;
计算模块230,包括实现并行计算的热点计算函数,与线程绑定为线程函数;
实际上,无论是否为热点计算函数,均可与线程绑定成为线程函数。在此,是将计算模块230的热点计算函数绑定为线程函数。
需要说明的是,线程函数可以有多个,并与不同的线程绑定,在下面的实施例中,仅对一个线程函数进行改造,所以对其它函数不再列出。
核心计算模块240,包含在计算模块230中,通常为一个循环体,形式是通过代码段或子函数完成一次计算工作。
每次调用核心计算模块240之间没有顺序依赖。即,多次调用核心计算模块240时,没有先后顺序的限制。
本发明通过对图2所示的装置结构进行改进,构成图3所示装置实施例的结构,包括相互连接的主函数模块310和主进程计算模块330,其中:
主函数模块310,用于初始化进程参数,针对主进程和从进程运行相应的分支,通过多个子进程接收主进程传输的参与计算的数据并进行计算,将计算结果发送给主进程;
主进程计算模块330,用于将需要计算的数据传递给子进程,并接收子进程的计算结果。
在上述装置实施例中,
主函数模块310通过进程创建模块220运行进程初始化函数,初始化进程参数,包括创建线程并绑定线程函数;通过主函数判断模块320判断进程属于主进程或从进程,并针对不同进程运行相应的分支;通过子进程计算模块340使得多个子进程接收主进程传输的参与计算的数据,并通过调用核心计算模块240分别对接收的数据进行计算,并分别将计算结果发送给主进程。
下面针对上述方法及装置实施例,给出相应的应用实例,其处理的原始程序伪代码如下:
应用本发明上述装置实施例,使用MPI编程接口对上述原程序进行多节点并行化改进。
首先测试和分析程序,得知tFunc1占用了最多的程序运行时间,且其中的calcFunc函数多次运行之间没有依赖,可以并行执行。tFunc2占用的程序运行时间较少,故不予对其进行进程化改写。
然后对主函数(main)进行改写,增加初始化进程函数MPI_init和MPI_Finalize函数,分别对应MPI库的初始化和退出。
在MPI_init函数后,使用MPI函数获取进程的rank号(即进程号),每个进程会获取不同的rank号,通过判断rank号是否为0,判断主从进程(为0为主进程,非0为从进程);并执行相应的主从进程分支。
如果rank号是0,则将原程序的main函数中的开辟线程的代码——Create_Threads(tFunc1)和Create_Threads(tFunc2)复制到rank=0的主进程分支当中。
如果rank号不是0,则为子进程,需要执行计算任务。首先使用MPI函数接收任务长度,任务长度与子进程数量有关,即tFunc1函数中循环次数N的一部分,例如,子进程数量为K,任务长度M可能为N/K。然后根据M的数量开辟内存。然后从主进程接收任务数据到新开辟的内存中。使用原程序中的计算函数calcFunc()进行计算,此时外层循环的次数不是N而是M。计算后使用MPI函数将数据传回主进程。
主进程需要执行原程序中的tFunc1。这里对tFunc1函数改造如下:
首先计算任务分配方式,例如M=N/K。计算M有多种方式,本例以M=N/K为例。以从节点数K循环,使用MPI函数将任务数和任务数据分发至从节点。再次循环K次,使用MPI函数从从节点接收数据并汇总。
tFunc2保持不变。
程序启动时,使用MPI程序的启动方式,进行多进程方式运行。
最终得到新程序伪代码如下:
本领域的技术人员应该明白,上述的本发明的各模块或各步骤可以用通用的计算装置来实现,它们可以集中在单个的计算装置上,或者分布在多个计算装置所组成的网络上。并且,它们可用计算装置可执行的程序代码来实现,从而可将它们存储在存储装置中由计算装置来执行,或者将它们分别制作成各个集成电路模块,或者将它们中的多个模块或步骤制作成单个集成电路模块来实现。这样,本发明不限制于任何特定的硬件和软件结合。
虽然本发明所揭露的实施方式如上,但所述的内容只是为了便于理解本发明而采用的实施方式,并非用以限定本发明。任何本发明所属技术领域内的技术人员,在不脱离本发明所揭露的精神和范围的前提下,可以在实施的形式上及细节上作任何的修改与变化,但本发明的专利保护范围,仍须以所附的权利要求书所界定的范围为准。
Claims (7)
1.一种多线程程序下多节点并行架构的方法,包括:
在原始程序的主函数中创建主、从进程,并获取分别代表主、从进程的信息;
在主进程的主函数中保留原始程序的线程开辟、绑定线程函数的操作;在主进程的热点线程函数中删除原有的计算代码,增加与子进程通信的代码;在子进程的主函数中删除原程序的主函数内容,增加原始程序的热点线程函数计算部分和与主进程通信部分。
2.按照权利要求1所述的方法,其特征在于,在所述在原始程序的主函数中创建主、从进程,并获取分别代表主、从进程的信息的步骤之前还包括:
根据所述原始程序测得热点线程函数,并通过分析确定所述热点线程函数能够优化成多进程方式并行架构。
3.按照权利要求2所述的方法,其特征在于,在原始程序的主函数中创建主、从进程,并获取分别代表主、从进程的信息;具体包括:
在主函数中使用消息传递接口初始化函数创建所述主、从进程,并通过消息传递接口获取进程号函数获取相应的进程号,其中进程号0代表主进程,其余非0进程号代表从进程。
4.按照权利要求3所述的方法,其特征在于,所述在主进程的热点线程函数中删除原有的计算代码,增加与子进程通信的代码,具体包括:
在进入所述主进程的热点线程函数时,主进程向子进程发送包括任务长度,任务数据的任务相关信息;待完成全部信息发送时,主进程进入等待状态,等待子进程返回计算结果。
5.按照权利要求3所述的方法,其特征在于,所述在子进程的主函数中删除原程序的主函数内容,增加原始程序的热点线程函数计算部分和与主进程通信部分,具体包括:
由子进程等待主进程发送任务长度的信息,并根据所述任务长度分配内存空间;
由子进程等待接收主进程发送任务数据的信息,并将收到的所述任务数据信息存入分配的内存空间;使用原始程序热点线程函数中计算部分调用的子函数或相应的代码对接收的任务数据进行计算;计算结束将计算结果发送至主进程;重复本步骤直到程序结束。
6.一种多线程程序下多节点并行架构的装置,其特征在于,包括相互连接的主函数模块和主进程计算模块,其中:
主函数模块,用于初始化进程参数,针对主进程和从进程运行相应的分支,通过多个子进程接收主进程传输的参与计算的数据并进行计算,将计算结果发送给主进程;
主进程计算模块,用于将需要计算的数据传递给子进程,并接收子进程的计算结果。
7.按照权利要求6所述的装置,其特征在于,
所述主函数模块通过进程创建模块运行进程初始化函数,初始化进程参数,包括创建线程并绑定线程函数;通过主函数判断模块判断进程属于主进程或从进程,并针对不同进程运行相应的分支;通过子进程计算模块使得多个子进程接收主进程传输的参与计算的数据,并通过调用核心计算模块分别对接收的数据进行计算,并分别将计算结果发送给主进程。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410012455.5A CN103744643B (zh) | 2014-01-10 | 2014-01-10 | 一种多线程程序下多节点并行架构的方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410012455.5A CN103744643B (zh) | 2014-01-10 | 2014-01-10 | 一种多线程程序下多节点并行架构的方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN103744643A CN103744643A (zh) | 2014-04-23 |
CN103744643B true CN103744643B (zh) | 2016-09-21 |
Family
ID=50501663
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201410012455.5A Active CN103744643B (zh) | 2014-01-10 | 2014-01-10 | 一种多线程程序下多节点并行架构的方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN103744643B (zh) |
Families Citing this family (12)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20160072908A1 (en) * | 2014-09-09 | 2016-03-10 | James Dinan | Technologies for proxy-based multi-threaded message passing communication |
CN104391742B (zh) * | 2014-11-11 | 2019-03-01 | 小米科技有限责任公司 | 应用优化方法和装置 |
CN104572283B (zh) * | 2015-01-06 | 2017-12-05 | 曾小荟 | 一种暂停与恢复mpi并行应用程序运行的方法 |
CN105138409B (zh) * | 2015-08-25 | 2019-03-05 | 西南交通大学 | 基于多进程的铁路列车运行图编制***及方法 |
CN105930219B (zh) * | 2016-04-22 | 2019-02-05 | 浙江工业大学 | 一种自定义的多线程管控的通信方法 |
CN106209996A (zh) * | 2016-06-27 | 2016-12-07 | 网易(杭州)网络有限公司 | 通信处理方法和装置 |
CN106850628A (zh) * | 2017-02-09 | 2017-06-13 | 南京邮电大学 | 一种基于mpi的广域高性能计算网络优化方法 |
CN108804383B (zh) * | 2018-05-30 | 2022-04-12 | 深圳大学 | 基于度量空间的支撑点并行枚举方法及装置 |
CN110175071B (zh) * | 2019-04-09 | 2021-07-30 | 南昌嘉研科技有限公司 | 一种多线程程序架构方法及架构*** |
CN111124685A (zh) * | 2019-12-26 | 2020-05-08 | 神州数码医疗科技股份有限公司 | 大数据处理方法、装置、电子设备和存储介质 |
CN111158918B (zh) * | 2019-12-31 | 2022-11-11 | 深圳大学 | 支撑点并行枚举负载均衡方法、装置、设备及介质 |
CN111367659B (zh) | 2020-02-24 | 2022-07-12 | 苏州浪潮智能科技有限公司 | 一种Kubernetes中节点的资源管理方法、设备以及介质 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1289962A (zh) * | 1999-09-23 | 2001-04-04 | 国际商业机器公司 | 在多线程计算环境中建立跨越多个进程的通信程序 |
CN1954293A (zh) * | 2004-04-02 | 2007-04-25 | 西姆毕恩软件有限公司 | 计算装置中的进程间通信 |
US7370156B1 (en) * | 2004-11-04 | 2008-05-06 | Panta Systems, Inc. | Unity parallel processing system and method |
-
2014
- 2014-01-10 CN CN201410012455.5A patent/CN103744643B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1289962A (zh) * | 1999-09-23 | 2001-04-04 | 国际商业机器公司 | 在多线程计算环境中建立跨越多个进程的通信程序 |
CN1954293A (zh) * | 2004-04-02 | 2007-04-25 | 西姆毕恩软件有限公司 | 计算装置中的进程间通信 |
US7370156B1 (en) * | 2004-11-04 | 2008-05-06 | Panta Systems, Inc. | Unity parallel processing system and method |
Also Published As
Publication number | Publication date |
---|---|
CN103744643A (zh) | 2014-04-23 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN103744643B (zh) | 一种多线程程序下多节点并行架构的方法及装置 | |
CN105956021B (zh) | 一种适用于分布式机器学习的自动化任务并行的方法及其*** | |
Hinrichsen et al. | Actris: Session-type based reasoning in separation logic | |
DE102020110688A1 (de) | Hardware-agnostischer compiler für tiefgehende neuronale netze | |
CN106663010A (zh) | 执行基于图的程序规范 | |
CN103488775B (zh) | 一种用于大数据处理的计算***及计算方法 | |
CN112148455B (zh) | 一种任务处理方法、设备及介质 | |
US20110314238A1 (en) | Common memory programming | |
CN106687918A (zh) | 编译基于图的程序规范 | |
US20130227529A1 (en) | Runtime Memory Settings Derived from Trace Data | |
US20130232495A1 (en) | Scheduling accelerator tasks on accelerators using graphs | |
CN106687920A (zh) | 管理任务的调用 | |
CN103377035A (zh) | 针对粗颗粒度流应用的流水并行化方法 | |
CN112463375B (zh) | 一种数据处理的方法和装置 | |
CN106687919A (zh) | 管理用于控制任务的状态 | |
CN104216767A (zh) | 多线程之间访问共享数据的方法及装置 | |
CN107633125A (zh) | 一种基于带权有向图的仿真***并行性识别方法 | |
CN111198754B (zh) | 一种任务调度方法及装置 | |
Jeon et al. | Parallel exact inference on a CPU-GPGPU heterogenous system | |
CN112948066A (zh) | 一种基于异构资源的Spark任务调度方法 | |
CN115269204A (zh) | 一种用于神经网络编译的内存优化方法及装置 | |
Odendahl et al. | Split-cost communication model for improved MPSoC application mapping | |
CN103412739A (zh) | 一种基于地震数据处理的数据传输方法及*** | |
CN105511867A (zh) | 一种优化模式自动生成方法及优化装置 | |
Feljan et al. | Task allocation optimization for multicore embedded systems |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant |