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

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

问题描述:

我开始学习MPI。我刚开始做一个简单的例子:我有一个矩形,它被分成两个子框。我已经说过每个盒子中有N/2个粒子(总计为N个粒子)。我使用两个进程/内核来完成这项工作。第一个核心处理第一个子盒子,第二个核心处理第二个子盒子。在一段时间内,粒子从一个子盒子交叉到另一个子盒子。我相信我必须使用MPI_Send和MPI_Recv来完成这项工作。但我不明白的是,如果每次都有多个粒子跨越(从一个核心到另一个核心),我如何高效地使用MPI_Send/Recv或MPI_Sendrecv?我忘了说我不知道​​每次穿越的粒子数量。对不起如果问题太简单/愚蠢。通过MPI_Send/recv发送和接收多个元素

+1

你将粒子数据打包到一个连续的数组中并一次发送全部 – 2014-10-28 13:12:38

+0

感谢您的回复@HristoIliev ....我实际上有两个以上的子盒子......我希望我可以为两个以上的子盒子做这件事 – 2014-10-28 14:01:02

+0

有很多平行的分子动力学软件包,比如NA MD,LAMMPS,DL_POLY_4等,它们使用空间域分解技术。所以是的,你可以做两个以上的子盒子:) – 2014-10-28 15:41:41

有很多的选择:

  • 你可以做一些简单的像使用MPI_ALLTOALL交换颗粒的数量在所有的子盒。然后使用点对点通信传达实际的粒子。
  • 您可以使用社区集体只与您的邻居通信使用MPI_NEIGHBOR_ALLTOALL
  • 您可以使用所有邻居之间的点对点非阻塞通信来交换粒子的数量和内容。
  • 你可以使用MPI_PROBE来确定正在发送给您(如果不发送粒子以某种方式传达想法的消息颗粒的数量。

所以,是的,这是可能的。有很多你可能需要了解更多关于MPI才能使用它们的任何一个

+1

“...带有一个信息,如果没有粒子被发送的话可以传达想法” - 发送空(零计数)消息在MPI中是完全合法的。当循环计数器中使用'MPI_GET_COUNT'的返回值时,甚至不需要编写特殊的逻辑来处理这种情况。 – 2014-10-28 18:49:45

+0

这将工作。无论为OP运作什么。关键是有很多选择。 – 2014-10-28 20:04:22

+0

非常感谢你们的答案..我很惊讶地看到有多惊人的Stack Overflow! – 2014-10-29 09:45:48