并行计算MPI(二):MPI阻塞通信

        阻塞通信:消息发送方的send需要接收方的recv配合才能完成。MPI对阻塞通信一些底层函数进行了一些封装,方便我们调用。

        1.标准通信模式:

   MPI_Send(buf, buf_size, MPI_CHAR, process1, tag, MPI_COMM_WORLD);
   MPI_Recv(buf, buf_size, MPI_CHAR, process0, tag, MPI_COMM_WORLD);
        上面两个函数一个用来发送,一个用来接收。分别运行在两个进程(process0和process1)

        (1).发送和接收在双方进程同时启动(理想状态,且在单核CPU时是不可能的):

             数据传输操作立即启动

        (2).发送动作早于接收动作启动:

             发送进程阻塞,等待接受进程执行到MPI_Recv语句,之后开启传输(传输过程中其实是发送进程将数据传到                MPI环境缓存中,接受进程那边进行读取)

        (3).发送动作晚于接受动作启动:

             接受进程启动,等待发送进程的发送语句触发.

       2.缓冲通信模式:

   MPI_Buffer_attach(buf, bufsize);  //定义一个用于通信的缓冲区
   MPI_Bsend(buf1, buf_size1, MPI_CHAR, process1, tag, MPI_COMM_WORLD);
   MPI_Recv(buf2, buf_size2, MPI_CHAR, process0, tag, MPI_COMM_WORLD);
   MPI_Buffer_detach(&buf, &bufsize)  //释放用于通信的缓冲区

         缓冲通信模式主要考虑的是Buffer_deatach的语句在接受语句之前还是之后,因为如果提前释放缓冲区肯定会导致数据丢失。

      3.同步通信模式:

   MPI_Ssend(buf1, buf_size1, MPI_CHAR, process1, tag, MPI_COMM_WORLD);
   MPI_Recv(buf2, buf_size2, MPI_CHAR, process0, tag, MPI_COMM_WORLD);

               发送进程发送一个请求发送消息给接受进程,接受进程准备好后发送一个准许发送许可,发送端据此消息再执行实际的消息发送。

        4.就绪通信模式:

   MPI_Rsend(buf1, buf_size1, MPI_CHAR, process1, tag, MPI_COMM_WORLD);
   MPI_Recv(buf2, buf_size2, MPI_CHAR, process0, tag, MPI_COMM_WORLD);

         和标准,同步通信模式完全一致,这个动作仅仅是向 MPI环境 传递一个额外的信息,告诉接受动作已经“就绪”,相应的可直接了当地执行发送操作.

你可能感兴趣的:(并行计算)