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

时间:2012-10-31 06:27:21

标签: c++ parallel-processing mpi

我正在尝试使用C ++在超立方体网络上实现All-To-All(即MPI_Allgather)操作。

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

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

最终在运行All-To-All之后,数据应该变为

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

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

我虽然算法使用了一些掩码和循环,涉及在两个处理器之间交换数据的步骤,例如,将p0的最后4个元素与p3的前4个元素交换(将p0的最后4个元素发送到p3并发送到第一个p3到p0的4个元素同时)。使用MPI_Send和MPI_Recv无法实现这一点,因为接收器的半数组将在发送数据之前被覆盖。任何人都可以帮助我使用哪些技术来做到这一点?我考虑过使用中间缓冲区,但仍然不确定如何编写发送和接收MPI代码。

或者,如果有人可以告诉我任何其他方式来实现All-to-All。我真的很感激。非常感谢你!

1 个答案:

答案 0 :(得分:1)

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实现不支持这种“就地”模式。一个值得注意的例子是Open MPI。 MPICH2支持它。

以下是实现它的一种方法:MPICH2 alltoall.c