MPI对接口说明的一般格式

图6-1 MPI调用的说明格式


讲解
对于有参数的MPI调用,MPI首先给出一种独立于具体语言的说明,对各个参数的性质进行介绍,然后再给出它相对于FORTRAN 77和C的原型说明,在MPI-2中还给出了C++形式的说明。MPI对参数说明的方式有三种,分别是IN、OUT和INOUT。它们的含义分别是:
  • IN(输入):调用部分传递给MPI的参数,MPI除了使用该参数外不允许对这一参数做任何修改
  • OUT(输出):MPI返回给调用部分的结果参数,该参数的初始值对MPI没有任何意义
  • INOUT(输入输出):调用部分首先将该参数传递给MPI,MPI对这一参数引用、修改后,将结果返回给外部调用,该参数的初始值和返回结果都有意义
    如果某一个参数在调用前后没有改变,比如某个隐含对象的句柄,但是该句柄指向的对象被修改了,这一参数仍然被说明为OUT或INOUT。MPI的定义在最大范围内避免INOUT参数的使用,因为这些使用易于出错,特别是对标量参数。
    还有一种情况是MPI 函数的一个参数被一些并行执行的进程用作 IN,而被另一些同时执行的进程用作OUT,虽然在语义上它不是同一个调用的输入和输出,这样的参数语法上也记为INOUT。
    当一个MPI参数仅对一些并行执行的进程有意义而对其它的进程没有意义时,不关心该参数取值的进程可以将任意的值传递给该参数。

    以MPI_INIT为例,

    MPI_INIT()
    独立于语言的说明,对于这一个调用没有参数说明
    int MPI_Init(int *argc, char ***argv)
    C语言的说明,对于C语言调用,需要给出参数argc和argv,注意这里给出的是argc和argv的地址。
    MPI_INIT(IERROR)
    INTEGER IERROR

    FORTRAN77说明部分,对于所有的FORTRAN77调用,都有返回的错误代码IERROR

    在C和FORTRAN77的说明中,对void*和,<type>需要进行特殊说明。
    MPI的库和一般的C和FORTRAN77库在语法上基本上是相同的,但是对于MPI的调用,允许不同的数据类型使用相同的调用,比如对于数据的发送操作,整型、实型、字符型等都用一个相同的调用MPI_SEND,对于这样的数据类型在C和FORTRAN77的原型说明中,分别用void *和 <type>来表示,即用户可根据通信的要求,对不同的数据类型,可以用相同的调用。

    MPI初始化和结束语句
    MPI_INIT()
    int MPI_Init(int *argc, char ***argv)
    MPI_INIT(IERROR)
    INTEGER IERROR



    讲解:
    MPI_INIT是MPI程序的第一个调用,它完成MPI程序所有的初始化工作,所有MPI程序的第一条可执行语句都是这条语句。
    MPI_FINALIZE()
    int MPI_Finalize(void)
    MPI_FINALIZE(IERROR)
    INTEGER IERROR



    讲解:
    MPI_FINALIZE是MPI程序的最后一个调用,它结束MPI程序的运行,它是MPI程序的最后一条可执行语句,否则程序的运行结果是不可预知的。

    MPI如何得到当前进程号和总的进程数
    MPI_COMM_RANK(comm,rank)
    INcomm该进程所在的通信域(句柄)
    OUT rank调用进程在comm中的标识号
    int MPI_Comm_rank(MPI_Comm comm, int *rank)
    MPI_COMM_RANK(COMM,RANK,IERROR)
     INTEGER COMM,RANK,IERROR



    讲解:
    这一调用返回调用进程在给定的通信域中的进程标识号,有了这一标识号,不同的进程就可以将自身和其它的进程区别开来,实现各进程的并行和协作。
    MPI_COMM_SIZE(comm,size)
    INcomm通信域(句柄)
    OUT size通信域comm内包括的进程数(整数)
    int MPI_Comm_size(MPI_Comm comm, int *size)
    MPI_COMM_SIZE(COMM,SIZE,IERROR)
     INTEGER COMM,SIZE,IERROR



    讲解:
    这一调用返回给定的通信域中所包括的进程的个数,不同的进程通过这一调用得知在给定的通信域中一共有多少个进程在并行执行。
  •