MPICH2 Hydra进程管理框架分析_wgbljl的博客-程序员宅基地_mpich hydu怎用

技术标签: 高性能计算  MPICH2  PMI-1  Hydra  

        MPICH2是由Argonne国家实验室维护的开源MPI库,是高性能计算领域使用最为广泛的MPI库之一。本文主要对其中Hydra进程管理框架进行了简要分析,希望可以为相关领域的学者提供帮助。在阅读本文前,读者可以首先参考其官方介绍:http://wiki.mpich.org/mpich/index.php/Hydra_Process_Management_Framework

        Hydra构建了进程管理框架,MPI进程需要经常与该框架进行交互,其交互的语言就是PMI标准,即进程管理接口(Process Management Interface)。因此要全面掌握该框架需要同时了解Hydra和客户端MPI进程两个部分,下面将分别从两个部分展开分析。需要注意的是,文中涉及的内容均以发稿前最新的mpich3.1为准,且使用PMI-1接口。

1. Hydra 进程管理框架

        下图是mpich wiki给出的Hydra结构图:

        从进程拓扑上看,Hydra由一个运行在服务器上的作业加载程序JLE(Job Launching Executable)和多个运行在不同计算节点上的进程管理代理PMP(Process Manager Proxy)组成。之所以称为PMP是因为它基本上具备了PM(Proxy Manager)的所有功能,代理PM并运行在计算节点上负责具体维护本节点上所有进程的状态。换言之,包括MPI进程在内系统进程拓扑是一个倒树状结构,JLE处于树根,负责在各计算节点上创建进程PMP;PMP在本节点上创建一个或多个MPI进程。JLE对应的执行程序就是我们经常使用的作业加载程序mpiexec.hydra;PMP为hydra_pmi_proxy。

        在介绍进程拓扑结构后,我们来看看上图中主要功能模块的作用,按照自底向上的顺序:

      1、I/O Demux Engine

        Demux的字面意思是“解复用器”。顾名思义,Demux 本质上一个消息管理系统,可以监听多个文件描述符的状态,当文件描述符接收到消息后,回调注册的处理函数。

Demux相关的代码位于src\pm\hydra\tools\demux目录下;其主要函数如下所示:

        1)HYDT_dmx_init:根据用户选项指定wait_for_event为HYDT_dmxu_poll_wait_for_event或HYDT_dmxu_select_wait_for_event。

        2) HYDT_dmx_register_fd(int num_fds, int *fd, HYD_event_t events, void *userp, HYD_status(*callback) (int fd, HYD_event_t events, void *userp)):注册描述符处理函数,根据描述符数量“num_fds”,描述符队列指针“fd”,事件类型“events”,回调函数“callback”,将处理函数添加进HYDT_dmxu_cb_list。
        3) HYDT_dmx_deregister_fd:注销函数。
        4) HYDT_dmx_wait_for_event:等待事件并调用事件处理函数,可以为HYDT_dmxu_poll_wait_for_event或HYDT_dmxu_select_wait_for_event。
        5) HYDT_dmx_query_fd_registration:查询指定描述符是否已经被注册。
        6) HYDT_dmx_finalize:结束函数,释放HYDT_dmxu_cb_list结构。
        7) HYDT_dmxi_stdin_valid:检查输入是否有效,使用read函数并设置长度为0判断函数返回值是否为0。
        8) HYDT_dmx_stdin_valid:获得输入有效标志。

      2、Bootstrap

        BSCI-BootStrap Control Interface,即引导控制接口,负责程序的加载和状态的维护,该模块定义在hydra\tools\bootstrap目录下。主要包含两个数据结构:struct HYDT_bsci_info 定义主要状态信息;struct HYDT_bsci_fns 定义主要核心函数,这里主要介绍其中有关启动作业的函数

        HYD_status(*launch_procs) (char **args, struct HYD_proxy * proxy_list, int *control_fd);

        在我们的实验平台中默认使用ssh启动进程,其launsh回调函数指定为HYDT_bscd_common_launch_procs。该函数的主要功能是准备待运行程序的参数,如果发现目标机器为本地节点,则通过fork启动进程;否则通过ssh远程启动进程。两种方式的启动过程均是调用函数HYDU_create_process,差别在于传递该函数的参数不同。例如,在本地创建进程时,参数为:

        ./examples/hellow  

即直接传递MPI程序名称,直接通过fork创建子进程执行程序;

在远程创建进程时,参数为:

         /home/wgb/mpich-3.1/install/bin/hydra_pmi_proxy --control-port server:50687 --rmk user --launcher ssh --demux poll --pgid 0 --retries 10 --usize -2 --proxy-id 1

即通过ssh在远程创建进程管理代理hydra_pmi_proxy,参数为本地地址/端口等信息;待执行MPI程序的信息将在后续通知PMP。

        BootStrap向外提供下列API接口,可以看出所有函数名均以HYDT_bsci开头:

1)HYD_status HYDT_bsci_init(const char *rmk, const char *launcher, const char *launcher_exec, int enablex, int debug);

2)HYD_status HYDT_bsci_launch_procs(char **args, struct HYD_proxy *proxy_list, int *control_fd);
3)HYD_status HYDT_bsci_finalize(void);
4)HYD_status HYDT_bsci_wait_for_completion(int timeout);
5)HYD_status HYDT_bsci_query_node_list(struct HYD_node **node_list);
6)HYD_status HYDT_bsci_query_proxy_id(int *proxy_id);
7)HYD_status HYDT_bsci_query_native_int(int *ret);

8)HYD_status HYDT_bsci_launcher_XXX_init(void);

      3、Process Binding

        用于进程与CPU或Memory绑定的模块,貌似是使用Open MPI的hwloc(Portable Hardware Locality)子模块实现的。

      4、PM和PMP

        PM和PMP完成进程管理的相关功能,PMP执行在计算节点上,完成JLE和MPI进程间的“上传下达”功能。PMP维护了上行通路(upstream)和下行通路(downstream),分别连接了JLE进程和MPI进程。在完成相关初始化后,PMP通过Demux模块等待来自JLE进程和MPI进程的消息。PMP和PM的主要逻辑和数据结构相似。其中enum HYD_pmcd_cmd是两者共用的核心数据结构之一,定义了进程管理需要处理的所有消息类型。

enum HYD_pmcd_cmd {

        INVALID_CMD = 0,        /* for sanity testing */

        /* UI to proxy commands */

        PROC_INFO,  CKPOINT, PMI_RESPONSE,  SIGNAL, STDIN,

        /* Proxy to UI commands */

        PID_LIST,  EXIT_STATUS, PMI_CMD,  STDOUT, STDERR, PROCESS_TERMINATED

    } cmd;

          如注释所示,PROC_INFO至STDIN为JLE向PMP发送的消息类型;PID_LIST至PROCESS_TERMINATED为PMP向JLE发送的消息类型。

         PMP的消息处理函数为HYD_pmcd_pmip_control_cmd_cb(pmip_cb.c):

        PROC_INFO:完成application进程创建过程。首先为应用进程配置环境变量等准备工作,而后调用HYDU_create_process创建进程。

        CKPOINT:检查点功能。

        PMI_RESPONSE:处理来自服务器端的请求或相应,根据消息类型调用HYD_pmcd_pmip_pmi_handle中的回调函数,回调函数列表定义在pmi_v1_handle_fns_foo(pmip_pmi_v1.c)中。

        SIGNAL:向application进程发送进行killpg或kill。

        STDIN:转发来自服务器端的输入数据到MPI进程。

        JLE的消息处理函数为control_cb(pmiserv_cb.c)。

        PID_LIST:接受并保存PMP发送的MPI进程号列表

        EXIT_STATUS:保存MPI进程的退出状态,并清理PMP

        PMI_CMD:调用handle_pmi_cmd处理各类消息,回调函数列表定义在pmi_v1_handle_fns_foo。

        STDOUT、STDERR:处理标准输出流和错误流

        PROCESS_TERMINATED:处理MPI进程退出

      5、User Interface

        UI定义了mpiexec.hydra的入口函数,其所有代码定义在hydra/ui目录下。

2. MPICH PMI接口及其实现

        MPI应用程序通过PMI接口与PMP交互,PMI-1的接口实现均定义在src/pmi/simple目录下。下面简要介绍其中的主要函数:

PMI_Init:初始化PMI相关变量,例如,PMI_fd,PMI_rank等,PMI_fd用于与PMP通信的描述符,PMI_rank即为MPI进程的rank。

PMI_Get_appnum:获得App序号,从0开始。

PMI_Barrier:同步操作,直至等到JLE返回"barrier_out"消息为止。

PMI_KVS_Get_my_name:从JLB获得进程组标识。

PMI_KVS_Put:发布键-值对。

PMI_KVS_Get:获得键相应的值。

3.PMI交互过程实例

        我们一个MPI的发送过程介绍MPI进程通过PMI与PMP和JLB的交互过程。
        实验平台有两个节点一个是服务节点server,一个是计算节点cn0。测试程序会在cn0上派生一个进程P0;在server派生两个进程P1和P2,P0会分别向P1和P2发送一条消息。
        1、MPI进程会向PMP请求进程组标识,格式如下:
              cmd= get_my_kvsname
        2、PMP将返回进程组标识:
              cmd= my_kvsname kvsname= kvs_53934_0// kvs_53934_0是PMIServer设置的进程组的标识,也可以认为是该作业的标识
        3、MPI进程以上述标识为头继续后续操作,之后询问进程映射关系:
              cmd= get kvsname= kvs_53934_0 key= PMI_process_mapping
        4、MPIProxy返回进程映射关系:
              content:cmd= get_result rc= 0msg= success value= (vector,(0,1,1),(1,1,2))
        5、MPI进程会主动向PMP报告进程地址,以P1为例:
               kvsname= kvs_53934_0 key= P1-businesscard value= description#server$port#42070$ifname#192.168.43.10$
        6、PMP负责将本节点所有进程的地址上传到JLE:
              cmd= put P2-businesscard=description#server$port#45975$ifname#192.168.43.10$ P1-businesscard=description#server$port#42070$ifname#192.168.43.10$
        7、这样JLE可以获得所有进程的地址信息,然后再向下广播这些信息,以便各节点进程可以获得其他节点进程的地址:
              cmd= keyval_cache P0-businesscard=description#cn0$port#45884$ifname#192.168.43.20$ P2-businesscard=description#server$port#45975$ifname#192.168.43.10$ P1-businesscard=description#server$port#42070$ifname#192.168.43.10$ 
        8、当MPI进程需要进行通信操作前,会请求本节点的PMP目标进程的地址,以P0->P1为例,P0会发出如下消息:
              cmd= get kvsname= kvs_53934_0key= P1-businesscard
        9、PMP返回结果:

              cmd=get_resultrc=0 msg=success value=description#server$port#42070$ifname#192.168.43.10$

        这样P0获得了P1的机器名(server)和端口号(42070)和IP地址(192.168.43.10),可以启动发送过程。





版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/wgbljl/article/details/24038539

智能推荐

新手小白,常会走进这6个误区,做自媒体建议避免_大 周 网 络的博客-程序员宅基地_那些新手很容易进入的误区

很多新手小白涌入自媒体这个行业,有不少人都是雄心壮志的来,垂头丧气的离开,是因为他们事先没做好全方位的了解,根本没有做互联网的思维就一头扎进来。现在是流量为王的时代(流量=钱),很多人开始选择坚持或者辞职后全职做自媒体创业,想在自媒体行业中闯出一片天地。在缺乏经验、零基础的情况下贸然进入,没有领路人,是要走很多弯路的。大周今天给大家分享几点我自己的经验总结,为了能让你更好的规避1、直接干有不少新手小白都会被割韭菜,他们听说自媒体可以快速赚钱,利用零碎的时间就可赚外快,也没有去自己调查、研究,就一头

关于python出现中文乱码的问题_树叶蓁蓁的博客-程序员宅基地

在unicode中,无论是半角的英文字母,还是全角的汉字,它们都是统一的”一个字符“!同时,也都是统一的”两个字节“,请注意”字符”和”字节”两个术语的不同,“字节”是一个8位的物理存贮单元,而“字符”则是一个文化相关的符号UTF-8就是每次8个位传输数据,而 UTF-16 就是每次16个位。UTF-8就是在互联网上使用最广的一种 unicode 的实现方式,这是为传输而设计的编码,并使编码无国...

python处理表格数据教程_利用Python处理Excel数据_weixin_39627052的博客-程序员宅基地

本文的数据源是朝阳医院2016的销售数据,课程是使用R语言来进行数据处理的,这里尝试采用Python来处理。要求的业务指标是:1)月均消费次数;2)月均消费金额;3)客单价;4)消费趋势这几个指标主要判断了用户端的消费趋势,为了给医院更多的指导,在此基础上进行了一定的扩展,个人增加了两个业务指标,也是为了多熟悉库的使用:5)列出各类药品售出数量的排名。这个指标可以指导医院多存储哪类药品,少存储哪类...

kobo glo原系统设置_whutxxz0208的博客-程序员宅基地_kobo原生系统没书

1. 破解(patch)① 目的可以使阅读界面的footer消失,浏览器可以下载百度云中任何格式的书籍① 傻瓜操作(http://www.mobileread.mobi/forums/showthread.php?t=269574)Z!A、最后的tgz文件在3.19.5761_target文件夹中,若改文件夹无tgz文件说明patch文件更改有错;B、有些选项不能同时选ye

「初级篇」跟我一起学docker(二)--核心概念和安装_zhugeaming2018的博客-程序员宅基地

>>原创文章,欢迎转载。转载请注明:转载自IT人故事会,谢谢!>>原文链接地址:跟我一起学docker(二)–核心概念和安装环境介绍:操作系统:64bit CentOS7docker版本:17.05.0-ce(最新版本)版本新功能:https://github.com/docker/docker/blob/master/CHANGELOG.md安...

领域建模刍议(一):分清问题域和问题解决域_火山石的博客-程序员宅基地

一:领域与领域模型  俗话说,人人心中有一个Hamlet,人人心中也都有一个领域模型的定义。   常见的有:   说法1:我理解的领域是对业务工作进行归类划分,归类的方式是业务工作具有相关的知识,这些所需要的知识构成一个领域,这些知识是业务工作的背景,通过对领域的分析,可以帮助我们挖掘、分析、理解业务工作的本质。 也就是说,领域是为需求分析工作服务的,它的目的是挖掘、分析、

随便推点

php maxInstances,win2008服务器IIS+fastCGI完美设置教程_weixin_39942213的博客-程序员宅基地

帮用户配置服务器,装的WIN2008系统,在WIN2008的IIS7上用FASTCGI调使用PHP-CGI.EXE,默认只有4个进程,这样对于大流量的网站为说进程数不足带来的进程排队现象十分严重,处理方案如下32位系统 http://www.iis.net/Downloads/files/AdminPack/TP2/AdminPack_x86.msi64位系统 http://www.iis.net...

mybatis特殊字符处理_软件老王的博客-程序员宅基地_mybatis 冒号

1. 场景描述在web项目中经常会统计一些信息,会使用到大于小于等字符,但是在mybatis的mpper.xml中是不识别的。2. 解决方案2.1 使用处理标签使用<![CDATA[]]>处理标签,该标签是针对xml文件的,标签的作用就是把标签内容按文本处理。例如:大于:<![CDATA[ > ]]>大于等于:<![CDATA[ >= ]]&...

Android平台下渗透测试工具大集合_sos995的博客-程序员宅基地

[整理]Android平台下渗透测试工具大集合cs24 @工具 2012-08-15 共 29988 人围观,发现 11 个不明物体 收藏该文分享一个google的项目,各种Android下的渗透测试工具。Ad Network Detector (1.2): http://market.android.com/details?id=com.lookout.addet

ifcfg-eth0 配置 _qk_zhu的博客-程序员宅基地

<br />original link http://blog.csdn.net/pheror_abu/archive/2010/05/27/5628737.aspx<br /> <br />转自:http://hi.baidu.com/lei005/blog/item/92df5e8314544a9cf703a648.html<br />/etc/sysconfig/network 包括主机基本网络信息,用于系统启动<br />/etc/sysconfig/network-script/ 此目录下是系统启

int类型数据范围 - 学习_穿素白衫的中少年的博客-程序员宅基地_int类型判断数字区间

1.介绍 弄清楚这个事情,首先要知道,二进制与位的概念 二进制: 就是01010101...组成的一段数字,计算机内部[底层]使用的即二进制,包括储存和传输。 补充: 【计算机使用二进制和现代计算机系统的硬件实现有关。组成计算机系统的逻辑电路通常只有两个状态,即开关的接通与断开。】 二进制的发明者是 戈特弗里德·威廉·莱布尼茨【德国数理哲学大师...

创业公司做数据分析(三)用户行为数据采集系统_weixin_33770878的博客-程序员宅基地

作为系列文章的第三篇,本文将重点探讨数据采集层中的用户行为数据采集系统。这里的用户行为,指的是用户与产品UI的交互行为,主要表现在Android App、iOS App与Web页面上。这些交互行为,有的会与后端服务通信,有的仅仅引起前端UI的变化,但是不管是哪种行为,其背后总是伴随着一组属性数据。对于与后端发生交互的行为,我们可以从后端服务日志、业务数...

推荐文章

热门文章

相关标签