MPI - 从任务 0(根)接收多个 int

Way*_*int 1 mpi

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

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

任何意见,将不胜感激。谢谢

sus*_*att 5

我假设你在 C++ 中工作,尽管你的问题没有说。不管怎样,让我们​​看看 MPI_Send 的参数:

MPI_SEND(buf, count, datatype, dest, tag, comm)
Run Code Online (Sandbox Code Playgroud)

第二个参数指定要发送的数据项数。这个调用基本上意味着“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);
Run Code Online (Sandbox Code Playgroud)

这将在 开始时开始读取内存values,并继续读取直到读取 10MPI_INTEGER秒。

对于在进程之间分配数字的情况,这就是您使用 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);
Run Code Online (Sandbox Code Playgroud)

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