【发布时间】:2018-09-10 21:31:35
【问题描述】:
我正在阅读有关 MPI 阻止发送和接收的信息,有些事情我不确定。
在进行一些研究时,我发现了 MPI 阻止发送和接收的 example(第 6-7 页)
#include "mpi.h"
#include <stdio.h>
#include <stdlib.h>
#define MASTER 0
int main (int argc, char *argv[])
{
int numtasks, taskid, len, partner, message;
char hostname[MPI_MAX_PROCESSOR_NAME];
MPI_Status status;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &taskid);
MPI_Comm_size(MPI_COMM_WORLD, &numtasks);
/* need an even number of tasks */
if (numtasks % 2 != 0) {
if (taskid == MASTER)
printf("Quitting. Need an even number of tasks: numtasks=%d\n", numtasks);
} else {
if (taskid == MASTER)
printf("MASTER: Number of MPI tasks is: %d\n",numtasks);
MPI_Get_processor_name(hostname, &len);
printf ("Hello from task %d on %s!\n", taskid, hostname);
/* determine partner and then send/receive with partner */
if (taskid < numtasks/2) {
partner = numtasks/2 + taskid;
MPI_Send(&taskid, 1, MPI_INT, partner, 1, MPI_COMM_WORLD);
MPI_Recv(&message, 1, MPI_INT, partner, 1, MPI_COMM_WORLD, &status);
} else if (taskid >= numtasks/2) {
partner = taskid - numtasks/2;
MPI_Recv(&message, 1, MPI_INT, partner, 1, MPI_COMM_WORLD, &status);
MPI_Send(&taskid, 1, MPI_INT, partner, 1, MPI_COMM_WORLD);
}
/* print partner info and exit*/
printf("Task %d is partner with %d\n",taskid,message);
}
MPI_Finalize();
}
我想知道的事情:
- 一半的进程在接收之前发送,为什么会发生这种情况?
- 如果都是先发后收,会怎样?
【问题讨论】:
-
这是 ping-pong 消息的示例 - 一半会阻塞并等待接收任何内容,另一半将开始发送。收到消息后,他们的角色互换
-
那么如果我理解正确的话,万一都是先发送后接收,那么执行消息交换会花费更长的时间?
-
嗯,不知道为什么你认为它更长。假设您有 10 个进程。数字 0 将发送到数字 5、1 到 6、2 到 7、3 到 8 和 4 到 9。这些是阻塞发送,0、1、2、3、4 将分别等待消息真正发送到 5、6 ,7,8,9。接收者将在阻塞 Recv() 调用中等待,一旦他们收到消息,他们就会通过阻塞并转到自己的 Send() - 5 将发送回 0、6 到 1、7 到 2、8 到 3 ,9比4。乒乓球。在此处查看带有 2 个节点的示例:mpitutorial.com/tutorials/mpi-send-and-receive
标签: mpi