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

时间:2011-03-05 17:35:14

标签: mpi

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

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

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

1 个答案:

答案 0 :(得分:4)

我会假设您使用的是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

这将在MPI_INTEGER开始时开始读取内存,并继续阅读,直到读完10 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_Send执行此操作的方法:

{{1}}

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