MPI_Isend/MPI_Irecv 在啥条件下等待其关联的完成调用 (MPI_Wait/MPI_Test) 开始数据传输?

Posted

技术标签:

【中文标题】MPI_Isend/MPI_Irecv 在啥条件下等待其关联的完成调用 (MPI_Wait/MPI_Test) 开始数据传输?【英文标题】:Under what conditions does MPI_Isend/MPI_Irecv wait for its associated completion call (MPI_Wait/MPI_Test) to start data transmission?MPI_Isend/MPI_Irecv 在什么条件下等待其关联的完成调用 (MPI_Wait/MPI_Test) 开始数据传输? 【发布时间】:2021-05-15 01:50:18 【问题描述】:

this 帖子中的一位 cmets 简要提及

该标准允许实现将实际数据传输推迟到等待/测试调用。

MPI_Isend/MPI_Irecv 的数据传输是否总是延迟到相关的完成调用(MPI_Wait/MPI_Test 或其变体)被调用?如果不是,什么条件会影响这一点?

【问题讨论】:

该标准不保证消息异步进行。一些 MPI 实现具有一个进度线程来实现这一点。在MPI_Isend() 的情况下,可以在急切模式下发送消息。一般来说,当调用 MPI 子例程时,会进行通信。 @GillesGouaillardet 感谢您提供此信息。我正在努力寻找有关如何在急切模式下调用MPI_Isend() 的信息。你能给我建议吗? 渴望与非渴望是一种实现选择。一个经验法则是在 Eager 模式下仅发送“小”消息,但不能保证。 我明白了,但MPI_Test() 是强制MPI_Isend 以急切模式发送(同时仍保持非阻塞)的唯一方法吗?比如,Eager 模式的实现会是 MPI_Isend 紧跟在 MPI_Test 之后吗? MPI_Test() 不会强制发送,它会进行通信。大多数其他 mpi 子例程也这样做,例如 MPI_Wait()MPI_Recv() 甚至 MPI_Send() 等等。 【参考方案1】: MPI_Wait 用于等待单次通信完成 MPI_Waitall 用于等待通信列表完成 MPI_TestMPI_Testall 在非阻塞通信中使用,以检查通信是否完成,而不要求它们完成。

使用MPI_Isend,您必须将每个数据点的值作为单独的变量存储在数组中

这是因为在调用MPI_Waitall 之前,可以随时发送数据。 这意味着在此时间间隔内不得更改/覆盖数据或超出范围。 这与MPI_Send 不同,后者在MPI_Send 完成之前缓冲和/或实际发送要发送的数据。

MPI_Irecv 也是如此,尽管这在您想要拥有数据时更加明显。

注意

在 MPI_Testall 中,只有当所有通信都完成时,该标志才会为真。

【讨论】:

以上是关于MPI_Isend/MPI_Irecv 在啥条件下等待其关联的完成调用 (MPI_Wait/MPI_Test) 开始数据传输?的主要内容,如果未能解决你的问题,请参考以下文章

ARC 会在啥条件下保留该对象?

CCmdTarget::OnFinalRelease 在啥条件下被调用?

HttpClient.DefaultRequestHeaders.ExpectContinue。 ExpectContinue 服务于啥目的以及在啥条件下将其设置为 true 或 false。

在啥情况下可以使用指针混合?

Response.Redirect(url); 会在啥情况下,不跳转页面?

I2C总线的SDA.SCL用示波器测量没有波形,请问要在啥条件下才可以测量到波形?