首页 > 其他 > 详细

高性能并行计算-非阻塞式点对点通信

时间:2020-10-20 16:44:09      阅读:27      评论:0      收藏:0      [点我收藏+]
/*MPI进程间点对点非阻塞通信*/
#include "mpi.h" /*MPI头函数,提供了MPI函数和数据类型定义*/
#include <stdio.h>

int main(int argc, char** argv)
{
    int rank;   //进程标识
    int size;   //进程总数
    int senddata;   //待发送数据缓存
    int recvdata;   //待接收数据缓存
    int flag_s, flag_r; //通信状态标志,0为通信未完成,1位通信已完成
    MPI_Status status_s, status_r;  //status object (Status)
    MPI_Request handle_s, handle_r; //MPI request (handle)

    MPI_Init(&argc, &argv);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    MPI_Comm_size(MPI_COMM_WORLD, &size);

    /*初始化数据*/
    senddata = rank + 1;
    recvdata = 0;
    flag_s = 0;
    flag_r = 0;

    if(rank == 0){
        /*----------------------------MPI_Isend详解--------------------------*/

        //功能:
        //  进行点对点非阻塞进程通信(消息发送)
        //参数:
        //int MPI_Isend(const void *buf, int count, MPI_Datatype datatype
        //                    , int dest, int tag,MPI_Comm comm, MPI_Request *request)
        //  MPI_Isend(数据发送缓存地址,数据个数,数据类型,目标进程标识,消息标志
        //              ,通信域,消息发送请求句柄地址)
        MPI_Isend(&senddata, 1, MPI_INT, 1, 0, MPI_COMM_WORLD, &handle_s);  //向1号进程发送消息

        /*----------------------------MPI_Irecv详解--------------------------*/
        //功能:
        //  进行点对点非阻塞进程通信(消息接收)
        //参数:
        //int MPI_Irecv(void *buf, int count, MPI_Datatype datatype, int source
        //                ,int tag, MPI_Comm comm, MPI_Request *request)
        //  MPI_Irecv(数据接收缓存地址,数据个数,数据类型,数据来源进程标识
        //               ,消息标志,通信域,消息接收请求句柄地址)
        MPI_Irecv(&recvdata, 1, MPI_INT, 1, 0, MPI_COMM_WORLD, &handle_r);  //接收1号进程发来的消息

        //flag=0;//采用循环等待的方法等待非阻塞发送的完成
        while (flag_s == 0) {
            /*-------------------------MPI_Test详解-------------------------*/
            //功能:
            //  1.A call to MPI_TEST returns flag = true if the operation 
            //  identified by request is complete
            //  如果当前检测的请求完成的话,返回通信状态标志位为true
            //  2.One is allowed to call MPI_TEST with a null or inactive
            //  request argument. In such a case the operation returns with
            //  flag = true and empty status.
            //  如果检测一个空的或未激活的通信请求,则标志位返回true,检测的
            //  通信状态信息返回空
            //  3.The functions MPI_WAIT and MPI_TEST can be used to complete
            //  both sends and receives
            //  MPI_WAIT和MPI_TEST即可用于检测消息发送状态也可用于消息接收状态
            //参数:
            //  MPI_Test(请求句柄,消息标志,检测的当前请求[发送或接收]的通信状态)
            MPI_Test(&handle_s, &flag_s, &status_s);    //监听消息发送状态,发送完成,返回flag_s为true,否则为false
        }
        //采用循环等待的方法等待非阻塞接收的完成
        while (flag_r == 0) {
            MPI_Test(&handle_r, &flag_r, &status_r);    //监听消息接收状态,接收完成,返回flag_s为true,否则为false
        }
        printf("rank %d send ok,send = %d\n", rank, senddata);
        printf("rank %d recv ok,recv = %d\n", rank, recvdata);
    }
    else if(rank == 1){
            MPI_Isend(&senddata, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, &handle_s);  //向0号进程发送消息
            MPI_Irecv (&recvdata, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, &handle_r); //接收0号进程发来的消息
            //采用循环等待的方法等待非阻塞发送的完成
            while(flag_s == 0){
                MPI_Test(&handle_s, &flag_s, &status_s);    //监听消息发送状态,发送完成,返回flag_s为true,否则为false
            }
            //采用循环等待的方法等待非阻塞接收的完成
            while(flag_r == 0){
                MPI_Test(&handle_r, &flag_r, &status_r);    //监听消息接收状态,接收完成,返回flag_s为true,否则为false
            }
            printf("rank 1 send ok,send = %d\n",senddata);

            printf("rank 1 recv ok,recv = %d\n",recvdata);
    }
    MPI_Finalize(); /*MPI的结束函数*/
    return (0);
}

技术分享图片

高性能并行计算-非阻塞式点对点通信

原文:https://www.cnblogs.com/qianingmeng/p/13846427.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!