【问题标题】:Limitation of data exchange using MPI c++使用 MPI c++ 进行数据交换的限制
【发布时间】:2018-05-11 19:34:20
【问题描述】:

我正在编写一个用于数据交换的 MPI C++ 代码,下面是示例代码:

#include <stdio.h>
#include <mpi.h>

int main(int argc, char **argv)
{
    int size, rank;
    int dest, tag, i;
    MPI_Init(&argc, &argv);
    MPI_Comm_size(MPI_COMM_WORLD, &size);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    printf("SIZE = %d RANK = %d\n",size,rank);

    if ( rank == 0 )
    {
        double data[500];
        for (i = 0; i < 500; i++) 
        {
            data[i] = i;
        }
        dest = 1;
        tag = 1;
        MPI_Send(data,500,MPI_DOUBLE,dest,tag, MPI_COMM_WORLD );
    }

    MPI_Finalize();   
    return(0);
}

看起来 500 是我可以发送的最大值。如果数据数量增加到 600,代码似乎停止在“MPI_SEND”处而没有进一步的进展。我怀疑使用 MPI_SEND 传输数据是否有任何限制。有没有大神能解惑一下?

提前致谢,

【问题讨论】:

  • 有一段时间没有使用 MPI,但我的第一个猜测是某些缓冲区已满,Send 等待匹配的 Receive 消耗。
  • 您必须发布匹配的MPI_Recieve!不管它是否为n&lt;=500“运行”——它总是错误的。请查阅 MPI 的介绍材料。
  • @user463035818,不 - 不相关。

标签: c++ mpi


【解决方案1】:

长话短说,你的程序不正确,你很幸运它没有因为少量计数而挂起。

根据 MPI 标准,您不能假设 MPI_Send() 会返回,除非已发布匹配的 MPI_Recv()

从务实的角度来看,“短”消息通常以 Eager 模式发送,MPI_Send() 可能会立即返回。 另一方面,“长”消息通常涉及会合协议,因此会挂起,直到发布匹配的接收。

“小”和“长”取决于几个因素,包括您使用的互连。再说一次,你不能假设MPI_Send() 总是会在你发送足够小的消息时立即返回。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-08
    • 1970-01-01
    • 2014-10-02
    • 1970-01-01
    • 2015-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多