gpt4 book ai didi

MPI:使用阻塞发送和接收有什么好处?

转载 作者:行者123 更新时间:2023-12-05 09:17:20 25 4
gpt4 key购买 nike

既然 MPI 也实现了 iRecv 和 iSend,那么使用 Send 和 Recv 有什么好处,它们会阻塞程序的执行,从而导致性能下降?

有问题:mpi: blocking vs non-blocking

他们写

"Blocking communication is used when it is sufficient, since it is somewhat easier to use. Non-blocking communication is used when necessary, for example, you may call MPI_Isend(), do some computations, then do MPI_Wait(). This allows computations and communication to overlap, which generally leads to improved performance."

但是“足够”和“必要”是什么意思呢?

最佳答案

首先,您需要记住,正确的 MPI 应用程序不应期望在匹配接收被发布之前阻塞发送(例如 MPI_Send())返回。例如,如果两个任务需要交换数据,则不正确

MPI_Send(...);
MPI_Recv(...);

因为它可能会死锁。一种选择是手动订购通讯

if (peer < me) {
MPI_Send(...);
MPI_Recv(...);
} else {
MPI_Recv(...);
MPI_Send(...);
}

恕我直言,这会使应用程序更难编写和维护。

另一种选择是使用非阻塞通信,这样您就不必再担心死锁。

MPI_Isend(...);
MPI_Irecv(...);
MPI_Waitall(...);

注意这个简单的例子说明了一个更普遍的问题,这里应该首选 MPI_Sendrecv()

一些 MPI 库实现了一个带有一些互连的进度线程。 (请记住,大多数情况下不会,但这有望改变)。在这种情况下,可以使用非阻塞通信来重叠计算和通信,从而使应用程序更加高效。

MPI_Irecv(...);
// perform some computation that do no require the data to be received
MPI_Wait(...);

如果您的 MPI 库未实现进度线程,则在调用 MPI_Wait() 之前不会开始接收任何消息。

并非所有应用程序都能(简单地)受益于重叠计算和通信。在这种情况下

MPI_Recv(...);

不仅更紧凑,而且可能比非阻塞对应物更高效,因为与

相比,它为 MPI 库的优化留出了额外的空间
MPI_Irecv(...);
MPI_Wait(...);

归根结底,阻塞并不比非阻塞好,反之亦然。也就是说,根据具体情况,一个通常比另一个更合适。

关于MPI:使用阻塞发送和接收有什么好处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48420492/

25 4 0
文章推荐: amazon-web-services - aws cloudformation list-stacks 给我重复的堆栈?
文章推荐: 仅当定义了值时才更新 Python 字典
文章推荐: php - 在 Laravel 中搜索数组
文章推荐: python-3.x - Python Selenium 错误 - 在 (207.1666717529297,25) 处不可点击,因为另一个元素
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com