如何使用一些MPI命令(或组合命令)在两个处理器之间交换存储在2d阵列中的数据? 我试图用C++实现超立方体网络的全向操作(即MPIY-ALLASHET)操作。p>

如何使用一些MPI命令(或组合命令)在两个处理器之间交换存储在2d阵列中的数据? 我试图用C++实现超立方体网络的全向操作(即MPIY-ALLASHET)操作。p>,c++,parallel-processing,mpi,C++,Parallel Processing,Mpi,例如,对于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]. (换句话说,每个处理器都从其他所有处理

例如,对于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]. 
(换句话说,每个处理器都从其他所有处理器获取数据)

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


或者如果有人能告诉我任何其他方法来实现所有人对所有人。我将非常感激。非常感谢

MPI中的所有到所有由
MPI\u ALLTOALL
MPI\u 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实现不支持这种“就地”模式。一个显著的例子是openmpi。MPICH2支持它


这里有一种实现方法:

非常感谢。我认为你提到的MPI_全部是执行“所有到所有个性化”操作。我问的操作是“所有到所有操作”,实际上是由MPI_Allgather完成的。您发送的链接“MPICH2 alltoall.c”包含4种算法的实现,这很有帮助。但是作为MPI的初学者,我试图理解它们如何在两个处理器上交换数据。不,
MPI\u ALLGATHER
对所有进程执行聚集。这就像对某个根进程执行常规聚集,然后广播结果——所有进程最终都会得到相同的结果(显然不是您的情况)。使用
MPI\u ALLTOALL
时,每个列组将其缓冲区分散到所有其他列组,同时执行从其他列组接收的片段的收集。仔细阅读MPI 2.2标准,以了解MPI ALLTOALL(V)的作用。仔细思考并阅读文档后,我认为您是对的@赫里斯托利耶夫感谢您的纠正和帮助!我很感激。