MPICH2 Hydra进程管理框架分析_wgbljl的专栏-程序员宅基地

技术标签: 高性能计算  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

智能推荐

非平衡电桥电阻计算_非平衡电桥的原理和应用 - 范文中心_weixin_39580749的博客-程序员宅基地

实验七 非平衡电桥的原理和应用电桥的的基本原理是通过桥式电路来测量电阻,从而得到引起电阻变化的其它物理量,如温度、压力、形变等,桥式电路在检测技术、传感器技术中的应用非常广泛。根据电桥工作时是否平衡来区分,可将电桥分为平衡电桥与非平衡电桥两种。平衡电桥一般用于测量具有相对稳定状态的物理量,非平衡电桥往往和一些传感器元件配合使用.某些传感器元件受外界环境(压力、温度、光强等)变化引起其内阻的变化,通...

【笔记】树的分治_DQSSS的博客-程序员宅基地

暑假的时候WTH大神就讲过思想了QAQ(顺带Orz Fuckstrom 自悟)树的分治,简单地说,就是把树分为好几个,对于每个递归处理后,再计算整棵树的答案,也就是序列上的分治思想放到了树上。树的分治分为点分治和边分治。点分治,即为把某个点删除后,树分为好多棵,对那些树处理然后计算答案。边分治即割掉边,把树分为两棵,然后进行处理。点分治中被删除的点应该选重心,这样树最多被分logn次,若每次处理当前

你真的知道什么是项目吗?项目的基本概念_逸尘谈PM的博客-程序员宅基地_怎么判断是不是项目

项目的基本概念什么是项目项目源于人类有组织的活动。 随着人类社会的发展, 人类有组织的活动逐步分化为两大类型: 一类是连续不断、 周而复始的活动, 人们称之为 “作业”或“运作”,如企业流水线生产大批产品的活动;另一类是临时性、一次性活动,人们称之为 “ 项目 ” ( Projects)。从古代的都江堰水利工程、现代的三峡工程,到著名的“阿波罗计划”,神州飞船工程等,都是项目!什么是项目?项目是为创造独特的产品、 服务或成果而做的临时性工 作。从广义上定义, 项目是为实现特定目标的-次性

oracle网络配置是干啥的,ORACLE网络配置介绍_e路书香的博客-程序员宅基地

关于oracle的网络配置 之前一直很乱因为其中的几个名字对应有些上头,在这里我颜色标记和对应查询的地方指明出来了,这些都是亲自实验过才说出来的。网络原理:1 客户端通过配置好的ip、端口、服务名 连接 监听程序。2 监听程序通过sid名去连接数据实例。3 数据库实例创建一个服务器进程,然后把服务器进程的地址告诉监听。4 监听在把服务器地址告诉客户端。5 客户端拿着这个地址直接去连接数据库实例,...

数据库系统原理课程设计_俺要走全栈的博客-程序员宅基地_数据库系统课程设计

仅限参考:不要直接拷贝使用。直接拷贝使用、不利于自己的学习进步。加油、加油、加油课程名称: 数据库系统原理课程设计设计题目:图书借阅管理系统。已知技术参数和设计要求:图书借阅管理系统(1)某图书借阅管理系统需要如下信息:读者信息,包括身份证号,姓名,性别,电话号码等。书籍信息,包括书籍ISBN编号,书籍名称,作者,单价,出版社,出版日期,库存数等。书籍种类信息,包括书籍种类编号,书籍种类名称等。其业务规则描述如下:一个读者可借阅多本书籍,但读者借阅的书籍数量不能超过十本,读者借阅书籍时

分布式架构-系统理论_Zane.J的博客-程序员宅基地

目录分布式一致性和CAP理论分布式一致性算法RAFTNWR & Gossip拜占庭将军问题分布式环境中的脑裂和Lease分布式一致性和CAP理论C : 一致性A: 可用性P: 分区容错性分布式系统只能三选二,不能全占分布式一致性算法RaftLeaderFollowerCandidate过半选票成为leader共识算法-拜占庭将军问题分布式环境脑裂和Lease...

随便推点

android 中测量高度和宽度,android获得屏幕高度和宽度(display中getSize(Point)方法使用)..._神神九十九的博客-程序员宅基地

方法一:public static int SCREEN_WIDTH;public static int SCREEN_HEIGHT;//获取屏幕WindowManager wm = (WindowManager) getBaseContext().getSystemService(Context.WINDOW_SERVICE);Display display = wm.getDefaultDis...

html请求头改post,GET/POST请求头_草料老蒋的博客-程序员宅基地

先看看GET是啥样儿的GET /empty_project/inde.jsp HTTP/1.1Host: localhost:8088Connection: keep-aliveUpgrade-Insecure-Requests: 1User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gec...

python 马尔科夫链_简单易学的机器学习算法—马尔可夫链蒙特卡罗方法MCMC_weixin_39563722的博客-程序员宅基地

对于一般的分布的采样,在很多的编程语言中都有实现,如最基本的满足均匀分布的随机数,但是对于复杂的分布,要想对其采样,却没有实现好的函数,在这里,可以使用马尔可夫链蒙特卡罗(MarkovChain Monte Carlo,MCMC)方法,其中Metropolis-Hastings采样和Gibbs采样是MCMC中使用较为广泛的两种形式。MCMC的基础理论为马尔可夫过程,在MCMC算法中,为了在一个指定...

第二次作业_335046781的博客-程序员宅基地

git地址https://github.com/JPL1988git用户名JPL1988学号后5位62131博客链接https://www.cnblogs.com/l123456l/p/10593365.html作业链接https://edu.cnblogs.com/campus/xnsy/SoftwareEngi...

手机运行慢可以刷机吗_一加手机7T(8+128GB) 安卓手机越来越慢,手机越来越卡怎么解决?..._RUI老师的博客-程序员宅基地

众所周知,安卓使用久了,会产生过多的缓存文件,久而久之,影响流畅,增加手机性能负担!平常生活中,我们在玩大型游戏还是会有掉帧卡顿。这种情况下,刷机是个不错的选择,可以提升下性能。安卓手机越来越慢,手机越来越卡怎么解决?刷机的好处:1.可以通过刷优化过的ROM,没有预装官方定制的很多官方软件软件,系统占用运存少,运存比较小的手机可以试试。2.可以解决一部分手机通过恢复出厂设置无法解决的手机触屏失灵...

【论文笔记】与强化学习结合来学习数据操作方法,以实现数据强化和数据加权_weixin_43883815的博客-程序员宅基地

论文题目:Learning Data Manipulation for Augmentation and Weighting来源:NIPS 2019(1)主要思想论文题目是xx,也就是说通过学习数据操作的方法来进行数据增强和加权这篇文章的主要思想可以概括为:将数据集中x-y的对应关系当成一种行为(policy)那训练集中的这种行为就可以与强化学习的reward function进行结合这样,改变reward function就可以当作在奖励不同的policy(不同的预测模型),也就是训练出不同

推荐文章

热门文章

相关标签