我正在解决这个问题。我正在实现循环映射,我有4个处理器,因此一个任务映射在处理器1(根)上,然后另外三个是工作者。我正在使用循环映射,并且我输入了几个整数,例如0-40。我想从每个工人那里接收(在这种情况下,每个工人将是10个整数),做一些计数并保存它。
我正在使用MPI_Send从root发送整数,但我不知道如何从同一进程(root)中接收一些数字。我也发送int,缓冲区大小固定为1,当有数字时,例如12,它会做坏事。如何检查int的长度?
任何建议都将不胜感激。感谢
答案 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。