在 MPI 中检查 "handshake"?
Check for "handshake" in MPI?
有没有办法在启动 MPI_Send
之前检查非阻塞接收是否被 posted(对于给定的源和标签)?我有这样一种情况,发送者和接收者都不知道他们想发送给谁/从谁那里接收。我的想法是首先 post 在所有选定的接收器上打开 Irecv
。然后,发件人将检查某个等级是否已 post 接收,并且仅在为真时才发送(否则继续)。所有发送成功后,接收方将取消未完成的 Irecv
s。
这目前适用于集体(MPI_COMM_WORLD
)阵列广播;我想知道是否有不同的方法
我想我可以反过来做,用 MPI_Isend
和 MPI_Probe
。在这种情况下,虽然我担心未收到的发送缓冲区会发生什么(并且听说 MPI_Cancel
对发送来说是个坏消息)
感谢您的任何建议。
您可以使用不同的数据传输标签执行 MPI_Irecv
,使用源作为 MPI_ANY
。使用阻塞 MPI_Recv
也可以解决问题。收到消息后(MPI_Test
的标志==1),您可以通过阅读 MPI_Status.MPI_SOURCE
(如果状态参数为 MPI_STATUS_IGNORE
则不可用)来检查实际来源是谁。
如果您没有明确要求传输必须同步,那么使用单方通信可能会更有效率(发件人只需输入它在接收器上的数据。
有没有办法在启动 MPI_Send
之前检查非阻塞接收是否被 posted(对于给定的源和标签)?我有这样一种情况,发送者和接收者都不知道他们想发送给谁/从谁那里接收。我的想法是首先 post 在所有选定的接收器上打开 Irecv
。然后,发件人将检查某个等级是否已 post 接收,并且仅在为真时才发送(否则继续)。所有发送成功后,接收方将取消未完成的 Irecv
s。
这目前适用于集体(
MPI_COMM_WORLD
)阵列广播;我想知道是否有不同的方法我想我可以反过来做,用
MPI_Isend
和MPI_Probe
。在这种情况下,虽然我担心未收到的发送缓冲区会发生什么(并且听说MPI_Cancel
对发送来说是个坏消息)
感谢您的任何建议。
您可以使用不同的数据传输标签执行 MPI_Irecv
,使用源作为 MPI_ANY
。使用阻塞 MPI_Recv
也可以解决问题。收到消息后(MPI_Test
的标志==1),您可以通过阅读 MPI_Status.MPI_SOURCE
(如果状态参数为 MPI_STATUS_IGNORE
则不可用)来检查实际来源是谁。
如果您没有明确要求传输必须同步,那么使用单方通信可能会更有效率(发件人只需输入它在接收器上的数据。