通过MPI_发送/接收发送和接收多个元素

通过MPI_发送/接收发送和接收多个元素,mpi,Mpi,我开始学习MPI。我刚刚开始做一个简单的例子:我有一个矩形,它被分成两个子框。假设每个盒子里有N/2个粒子,加起来就是N个粒子。我使用两个进程/核心来完成这项工作。第一芯处理第一子框,第二芯处理第二子框。在此期间,粒子从一个子框交叉到另一个子框。我确信我必须使用MPI_发送和MPI_接收来完成这项工作。但我不明白的是,如果每次都有多个粒子从一个核穿过另一个核,我如何有效地使用MPI_Send/Recv或MPI_Sendrecv?我忘了说我不知道每次穿过的粒子数。抱歉,如果问题太简单/愚蠢。有很多

我开始学习MPI。我刚刚开始做一个简单的例子:我有一个矩形,它被分成两个子框。假设每个盒子里有N/2个粒子,加起来就是N个粒子。我使用两个进程/核心来完成这项工作。第一芯处理第一子框,第二芯处理第二子框。在此期间,粒子从一个子框交叉到另一个子框。我确信我必须使用MPI_发送和MPI_接收来完成这项工作。但我不明白的是,如果每次都有多个粒子从一个核穿过另一个核,我如何有效地使用MPI_Send/Recv或MPI_Sendrecv?我忘了说我不知道每次穿过的粒子数。抱歉,如果问题太简单/愚蠢。

有很多选择:

您可以做一些简单的事情,例如使用MPI_ALLTOALL在所有子框之间交换粒子数。然后使用点对点通信来通信实际粒子。 您可以使用邻里集体,仅使用MPI\u NEIGHBOR\u ALLTOALL与您的邻居通信 您可以在所有邻居之间使用点对点非阻塞通信来交换粒子的数量和内容。 您可以使用MPI_PROBE来确定发送给您的粒子数,如果没有发送任何粒子,则会以某种方式传达这一想法。
所以,是的,这是可能的。有很多选择。不过,您可能需要了解更多有关MPI的信息才能使用它们。

您将粒子数据打包到一个连续的数组中,并一次发送所有数据。感谢您的回复@hristoilev。。。。事实上,我有两个以上的子框…我希望我能为两个以上的子框做这件事。有太多的并行分子动力学软件包,如NAMD、LAMMPS、DL_POLY_4等,它们使用空间域分解技术。因此,是的,您可以为两个以上的子框执行此操作:。。。在MPI中,发送空的零计数消息是完全合法的,因为消息以某种方式传达了如果没有粒子被发送的想法。当MPI_GET_COUNT的返回值用于循环计数器或其他东西时,甚至不必编写特殊的逻辑来处理这种情况,这会起作用。无论什么对OP有效。关键是有很多选择。非常感谢你们的回答。。我很惊讶地看到堆栈溢出是多么惊人!!