我无法理解 MPI 中阻塞通信和非阻塞通信的概念。两者有何区别?有什么优点和缺点?
阻止通信是使用完成的MPI_Send() and MPI_Recv()。在通信完成之前,这些函数不会返回(即,它们会阻塞)。稍微简化一下,这意味着缓冲区传递给MPI_Send()
可以重复使用,要么是因为 MPI 将其保存在某个地方,要么是因为它已被目的地接收。相似地,MPI_Recv()
当接收缓冲区已充满有效数据时返回。
相反,非阻塞通信是使用MPI_Isend() and MPI_Irecv()。即使通信尚未完成,这些函数也会立即返回(即,它们不会阻塞)。你必须打电话MPI_Wait() or MPI_Test()查看通讯是否完成。
当足够时就使用阻塞通信,因为它更容易使用。非阻塞通信在必要时使用,例如,您可以调用MPI_Isend()
,做一些计算,然后做MPI_Wait()
。这允许计算和通信重叠,这通常会提高性能。
请注意,集体通信(例如,all-reduce)仅在 MPIv2 之前的阻塞版本中可用。 IIRC、MPIv3 引入了非阻塞集体通信。
可以看到 MPI 发送模式的快速概览here.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)