parallel-processing - MPI_Send 在数据量大的环形通信中阻塞

标签 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, 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 是发送或接收的元素数。 如果我用 4 个线程发送少于 100 个元素,上面的代码将工作正常,但如果我增加线程数,它将被阻塞。我不明白为什么它会被阻止。我们可以发送的数据大小是否有任何限制。

谢谢

阿杰

最佳答案

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

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

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

关于parallel-processing - MPI_Send 在数据量大的环形通信中阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16337393/

相关文章:

python - mpi4py 程序的意外输出

c++ - MPI(求和)

c++ MPI广播 vector

c - 使用 MPI_Finalize() 后出现段错误

python - 依赖于 Python 的并行任务处理并发,例如 GNU Make

python - 1 个带有 Gunicorn 的 Web Worker 是否总是意味着只有 1 个进程?

c - 一维数组的 MPI_scatter

algorithm - 并行遍历的树设计

r - 在 Shiny 中使用并行包

c - MPI 总运行时间