我假设您正在使用 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。