阻塞通信:消息发送方的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环境 传递一个额外的信息,告诉接受动作已经“就绪”,相应的可直接了当地执行发送操作.