【发布时间】:2013-05-02 22:50:07
【问题描述】:
我正在尝试使用 MPI 形成环形通信,其中我的每个进程都将其结果发送到下一个进程,最后一个进程将结果发送到第 0 个进程。假设我有 4 个进程,那么我的第 0 个进程会将结果发送到第 1 个、第 1 个到第 2 个、第 2 个到第 3 个和第 3 个到第 0 个。
#include "mpi.h"
#include <stdio.h>
#include<stdlib.h>
#define NELEM 1000
int main (int argc, char *argv[])
{
int numtasks, rank, rc, i, dest = 1, tag = 111, source = 0, size;
double *data, result;
void *buffer;
data=(double*)malloc(sizeof(double)*NELEM);
if(data==NULL)
{
printf("Unable to allocate memory\n");
return;
}
MPI_Status status;
MPI_Init (&argc, &argv);
MPI_Comm_size (MPI_COMM_WORLD, &numtasks);
MPI_Comm_rank (MPI_COMM_WORLD, &rank);
for (i = 0; i < NELEM; i++)
data[i] = (double) random ();
if (rank == 0)
source=numtasks-1;
else
source=rank-1;
if(rank==numtasks-1)
dest=0;
else
dest=rank+1;
printf("Rank %d sending data to rank %d\n",rank,dest);
MPI_Send(data, NELEM, MPI_DOUBLE, dest, tag,MPI_COMM_WORLD);
printf("Rank %d send complete\n",rank);
printf("Rank %d receiving data from rank %d\n",rank,source);
MPI_Recv (data, NELEM, MPI_DOUBLE, source, tag, MPI_COMM_WORLD,&status);
printf("Rank %d received data from rank %d\n",rank,source);
MPI_Finalize ();
}
这里的 NELEM 是发送或接收的元素数。 如果我发送少于 100 个元素的 4 个线程,上面的代码可以正常工作,但如果我增加线程数,它将被阻塞。我不明白为什么它会被阻止。我们可以发送的数据大小是否有任何限制。
谢谢
阿杰
【问题讨论】:
-
我想你刚刚遇到了哲学家进餐的问题。
-
这与这里的问题相同:stackoverflow.com/questions/15833947/…,这里给出了答案stackoverflow.com/questions/15833947/…。正如@flup 指出的那样,问题在于每个人都在发送而没有人在接收,这只是常见实现的意外,这适用于小消息。如上面的答案,解决方案是使用
MPI_Sendrecv(),即非阻塞通信。