【发布时间】:2015-09-06 23:52:06
【问题描述】:
我试图了解使用 MPI 进行并行处理的阻塞和非阻塞消息传递机制之间的区别。假设我们有以下阻塞代码:
#include <stdio.h>
#include <string.h>
#include "mpi.h"
int main (int argc, char* argv[]) {
const int maximum_message_length = 100;
const int rank_0= 0;
char message[maximum_message_length+1];
MPI_Status status; /* Info about receive status */
int my_rank; /* This process ID */
int num_procs; /* Number of processes in run */
int source; /* Process ID to receive from */
int destination; /* Process ID to send to */
int tag = 0; /* Message ID */
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
MPI_Comm_size(MPI_COMM_WORLD, &num_procs);
/* clients processes */
if (my_rank != server_rank) {
sprintf(message, "Hello world from process# %d", my_rank);
MPI_Send(message, strlen(message) + 1, MPI_CHAR, rank_0, tag, MPI_COMM_WORLD);
} else {
/* rank 0 process */
for (source = 0; source < num_procs; source++) {
if (source != rank_0) {
MPI_Recv(message, maximum_message_length + 1, MPI_CHAR, source, tag,
MPI_COMM_WORLD,&status);
fprintf(stderr, "%s\n", message);
}
}
}
MPI_Finalize();
}
每个处理器执行其任务并将其发送回 rank_0(接收器)。 rank_0 将运行从 1 到 n-1 个进程的循环并按顺序打印它们(如果当前客户端尚未发送其任务,则循环中的步骤可能不会继续)。如何修改此代码以使用MPI_Isend 和MPI_Irecv 实现非阻塞机制?我是否需要删除接收器部分(rank_0)中的循环并为每个客户端明确声明 MPI_Irecv(..),即
MPI_Irecv(message, maximum_message_length + 1, MPI_CHAR, source, tag,
MPI_COMM_WORLD,&status);
谢谢。
【问题讨论】:
-
在打印消息时,您还想对接收过程进行一些排序吗?
-
@haraldkl OP 的代码中没有任何保证按原样编写的消息无论如何都会以任何顺序接收,所以我假设没有。
-
不,顺序无关紧要
-
@NoseKnowsAll 是的,在 OPs 代码中有一个强加的顺序,因为阻塞的 recvs 必须按照循环的顺序执行。
标签: c parallel-processing mpi openmpi message-passing