如何使用某些MPI命令(或组合命令)之间在两个处理器之间交换2D数组中存储的数据



我正在尝试使用C 在超立方体网络上实现全能(即mpi_allgather)操作。

例如,对于n(即处理器数)= 8,我将初始数据存储为

p0: [00, 01, 02, ..., 07]; 
p1: [10, 11, 12, ..., 17],
...
... 
p7: [70, 71, 72, ..., 77]. 

最终在运行全能之后,数据应成为

p0: [00, 10, 20, ..., 70], 
P1: [01, 11, 21, ..., 71],
..., 
p7: [07, 17, 27, ..., 77]. 

(换句话说,每个处理器都从其他所有人那里获取数据)。

i虽然使用一些掩码和循环,涉及两个处理器之间交换数据的步骤,例如,在P3的前4个元素交换P0的最后4个元素(将P0的最后4个元素发送到P3并首先发送同时,P3至P0的4个元素)。使用MPI_SEND和MPI_RECV无法实现这一目标,因为接收器的半数组在发送数据之前将被覆盖。谁能帮助我采用什么技术来做到这一点?我考虑过使用中间缓冲区,但仍然不确定如何编写发送和接收MPI代码。

或者如果有人可以告诉我其他任何实施全能的方法。我真的很感激。非常感谢您!

MPI中的全能是由MPI_ALLTOALLMPI_ALLTOALLV执行的。常规电话需要两个不同的缓冲区以发送和接收数据。MPI标准还为两个操作定义了一个"适当的"选项。在您的情况下,此代码应该这样做:

double p[8];
MPI_Alltoall(MPI_IN_PLACE, 1, MPI_DOBLE,  // send count and datatype are ignored
             p, 1, MPI_DOUBLE,
             MPI_COMM_WORLD);

不幸的是,某些MPI实现不支持此"实现"模式。一个值得注意的例子是开放的MPI。mpich2支持它。

这是实现它的一种方法:mpich2 alltoall.c

最新更新