Author: Wes Kendall
发送和接收是 MPI 里面两个基础的概念。MPI 里面几乎所有单个的方法都可以使用基础的发送和接收 API 来实现。在这节课里,我会介绍怎么使用 MPI 的同步的(或阻塞的,原文是 blocking)发送和接收方法,以及另外的一些跟使用 MPI 进行数据传输的基础概念。
注意- 这个网站的提到的所有代码都在GitHub 上面。这篇教程的代码在tutorials/mpi-send-and-receive/code。
MPI 的发送和接收简介
MPI 的发送和接收方法是按以下方式进行的:开始的时候,A 进程决定要发送一些消息给B 进程。A进程就会把需要发送给B进程的所有数据打包好,放到一个缓存里面。因为所有数据会被打包到一个大的信息里面,因此缓存常常会被比作信封(就像我们把好多信纸打包到一个信封里面然后再寄去邮局)。数据打包进缓存之后,通信设备(通常是网络)就需要负责把信息传递到正确的地方。这个正确的地方也就是根据特定秩确定的那个进程。
尽管数据已经被送达到 B 了,但是进程 B 依然需要确认它想要接收 A 的数据。一旦它确定了这点,数据就被传输成功了。进程 A 会接收到数据传递成功的信息,然后去干其他事情。
有时候 A 需要传递很多不同的消息给 B。为了让 B 能比较方便地区分不同的消息,MPI 运行发送者和接受者额外地指定一些信息 ID (正式名称是标签,tags)。当B只要求接收某种特定标签的信息的时候,其他的不是这个标签的信息会先被缓存起来,等到 B 需要的时候才会给 B。
把这些概念记在心里的同时,让我们来看一下 MPI 发送和接收方法的定义。
MPI_Send(void*data,intcount,MPI_Datatypedatatype,intdestination,inttag,MPI_Commcommunicator)
MPI_Recv(void*data,intcount,MPI_Datatypedatatype,intsource,inttag,MPI_Commcommunicator,MPI_Status*status)
尽管一开始看起来参数有点多,慢慢地你会发现其实这些参数还是很好记忆的,因为大多数的 MPI 方法定义是类似的。第一个参数是数据缓