码迷,mamicode.com
首页 > 其他好文 > 详细

OpenMPI源码剖析:网络通信原理

时间:2018-04-09 21:49:28      阅读:625      评论:0      收藏:0      [点我收藏+]

标签:解决   span   for   standard   efi   剖析   用户   lse   user   

MPI中的网络通信的原理,需要解决以下几个问题:

1. MPI使用什么网络协议进行通信?

2.中央数据库是存储在哪一台机器上?

3.集群中如果有一台机器挂掉了是否会影响其他机器?

 

参考: https://aosabook.org/en/openmpi.html

根据MCA, 每个框架下的模块是可变的,例如, btl (字节传输层)框架下有N多个网络协议模块:

技术分享图片

技术分享图片

 技术分享图片

 

技术分享图片

技术分享图片

技术分享图片

技术分享图片

当每个通信域(包括MPI_COMM_WORLD和MPI_COMM_SELF)被创建时,每个可用模块被询问是否需要在新通信域中使用。模块可以拒绝被使用,例如,一个基于共享内存的模块只有当通信域中的所有进程都在相同的物理节点上时,才允许被使用。通信域将会选择最高优先级的模块使用。

当然,这个也是可以让用户更改的

 根据 https://aosabook.org/en/openmpi.html 中介绍的,用户可以通过传入MCA命令行参数去改变运行时的模块

 

再看到位于 c/send.c 文件中的Send函数定义:

#if OMPI_BUILD_MPI_PROFILING
#if OPAL_HAVE_WEAK_SYMBOLS
#pragma weak MPI_Send = PMPI_Send
#endif
#define MPI_Send PMPI_Send
#endif

static const char FUNC_NAME[] = "MPI_Send";


int MPI_Send(const void *buf, int count, MPI_Datatype type, int dest,
             int tag, MPI_Comm comm)
{
    int rc = MPI_SUCCESS;

    MEMCHECKER(
        memchecker_datatype(type);
        memchecker_call(&opal_memchecker_base_isdefined, buf, count, type);
        memchecker_comm(comm);
    );

    if ( MPI_PARAM_CHECK ) {
        OMPI_ERR_INIT_FINALIZE(FUNC_NAME);
        if (ompi_comm_invalid(comm)) {
            return OMPI_ERRHANDLER_INVOKE(MPI_COMM_WORLD, MPI_ERR_COMM, FUNC_NAME);
        } else if (count < 0) {
            rc = MPI_ERR_COUNT;
        } else if (tag < 0 || tag > mca_pml.pml_max_tag) {
            rc = MPI_ERR_TAG;
        } else if (ompi_comm_peer_invalid(comm, dest) &&
                   (MPI_PROC_NULL != dest)) {
            rc = MPI_ERR_RANK;
        } else {
            OMPI_CHECK_DATATYPE_FOR_SEND(rc, type, count);
            OMPI_CHECK_USER_BUFFER(rc, buf, type, count);
        }
        OMPI_ERRHANDLER_CHECK(rc, comm, rc, FUNC_NAME);
    }

    if (MPI_PROC_NULL == dest) {
        return MPI_SUCCESS;
    }

    OPAL_CR_ENTER_LIBRARY();
    rc = MCA_PML_CALL(send(buf, count, type, dest, tag, MCA_PML_BASE_SEND_STANDARD, comm));
    OMPI_ERRHANDLER_RETURN(rc, comm, rc, FUNC_NAME);
}

 

OpenMPI源码剖析:网络通信原理

标签:解决   span   for   standard   efi   剖析   用户   lse   user   

原文地址:https://www.cnblogs.com/HelloGreen/p/8763083.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!