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); }
原文地址:https://www.cnblogs.com/HelloGreen/p/8763083.html
时间: 2024-10-14 01:05:43