Parallel processing MPI_发送在大数据量的环形通信中阻塞

Parallel processing MPI_发送在大数据量的环形通信中阻塞,parallel-processing,mpi,Parallel Processing,Mpi,我正在尝试使用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, r

我正在尝试使用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 ();
}
#包括“mpi.h”
#包括
#包括
#定义NELEM 1000
int main(int argc,char*argv[])
{
int numtasks,rank,rc,i,dest=1,tag=111,source=0,size;
双*数据,结果;
空*缓冲区;
数据=(双*)malloc(sizeof(双)*NELEM);
如果(数据==NULL)
{
printf(“无法分配内存\n”);
返回;
}
MPI_状态;
MPI_Init(&argc,&argv);
MPI通信大小(MPI通信世界和numtasks);
MPI通信等级(MPI通信世界和等级);
对于(i=0;i
这里NELEM是发送或接收的元素数。 如果我发送的元素少于100个,上面有4个线程,代码可以正常工作,但如果我增加线程数,它将被阻塞。我不明白为什么它会被阻塞。我们可以发送的数据大小是否有任何限制

谢谢


Ajay

您的所有进程都在尝试发送。但他们不能,因为他们都没有准备好倾听

对于较小的元素大小,我希望消息适合缓冲区


正如Jonathan所建议的,答案是使用或非阻塞通信。

我认为您刚刚遇到了哲学家进餐问题。这与这里的问题相同:,答案在这里给出。正如@flup所指出的,问题在于每个人都在发送,而没有人在接收,这只是普通实现中的一个意外,它适用于小消息。如上所述,解决方案是使用或非阻塞通信。是的。Sendrecv。肯定