您的位置:首页 > 其它

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

2015-03-09 11:50 260 查看
阻塞通信:消息发送方的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)  //释放用于通信的缓冲区</span>


缓冲通信模式主要考虑的是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环境 传递一个额外的信息,告诉接受动作已经“就绪”,相应的可直接了当地执行发送操作.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: