【问题标题】:MPI - receive multiple int from task 0 (root)MPI - 从任务 0(根)接收多个 int
【发布时间】:2011-03-05 17:35:14
【问题描述】:

我正在解决这个问题。我正在实现循环映射,我有 4 个处理器,所以一个任务映射到处理器 1(根)上,然后另外三个是工人。我正在使用循环映射,并且我有几个整数作为输入,例如0-40。我希望从每个工人那里接收(在这种情况下,每个工人将是 10 个整数),做一些计数并保存它。

我正在使用 MPI_Send 从根发送整数,但我不知道如何从同一进程(根)接收一些数字。当有数字时,我也发送缓冲区大小固定为 1 的 int,例如12、会做坏事。如何检查 int 的长度?

任何建议将不胜感激。谢谢

【问题讨论】:

    标签: mpi


    【解决方案1】:

    我假设您正在使用 C++,尽管您的问题没有说明。无论如何,让我们看看 MPI_Send 的参数:

    MPI_SEND(buf, count, datatype, dest, tag, comm)
    

    第二个参数指定要发送多少数据项。这个调用基本上意味着“buf 指向内存中的一个点,其中有count 个值,它们都是datatype 类型,一个接一个:发送它们”。这使您可以发送整个数组的内容,如下所示:

    int values[10];
    for (int i=0; i<10; i++)
        values[i] = i;
    MPI_Send(values, 10, MPI_INTEGER, 1, 0, MPI_COMM_WORLD);
    

    这将从values 的开头开始读取内存,并继续读取直到读取了 10 个MPI_INTEGERs。

    对于您在进程之间分配数字的情况,这就是您使用 MPI_Send 的方式:

    int values[40];
    for (int i=0; i<40; i++)
        values[i] = i;
    for (int i=1; i<4; i++)  // start at rank 1: don't send to ourselves
        MPI_Send(values+10*i, 10, MPI_INTEGER, i, 0, MPI_COMM_WORLD);
    

    然而,这是分布式计算中如此常见的操作,以至于 MPI 为其赋予了自己的功能,MPI_Scatter。 Scatter 完全符合您的要求:它采用一个数组并将其平均分配给调用它的所有进程。这是一个collective communication 调用,这是一个稍微高级的话题,所以如果你只是在学习 MPI(听起来像你),那么请随意跳过它,直到你能熟练使用 MPI_Send 和 MPI_Recv。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-20
      • 2020-02-12
      • 1970-01-01
      • 2019-05-21
      • 2015-12-11
      相关资源
      最近更新 更多