Asynchronous openmpi中的immidate与同步通信

Asynchronous openmpi中的immidate与同步通信,asynchronous,mpi,blocking,openmpi,Asynchronous,Mpi,Blocking,Openmpi,在阻塞和非阻塞操作(在OpenMPI中)的上下文中,我对同步-异步的概念有点混淆: :MPI\u Isend不一定是异步的(所以它可以是同步的?) :MPI Isend()和MPI Irecv()是MPI的异步通信原语 我已经在stackoverflow()上讨论了前面的sync-async-blocking-non-blocking问题,但是没有任何帮助。 据我所知: 立即(MPI_Isend):方法返回并执行下一行->非阻塞 标准/非即时(MPI_Send):对于大消息,它会阻止,

在阻塞和非阻塞操作(在OpenMPI中)的上下文中,我对同步-异步的概念有点混淆:

  • MPI\u Isend
    不一定是异步的(所以它可以是同步的?)

  • :MPI Isend()和MPI Irecv()是MPI的异步通信原语

我已经在stackoverflow()上讨论了前面的sync-async-blocking-non-blocking问题,但是没有任何帮助。 据我所知:

  • 立即
    MPI_Isend
    ):方法返回并执行下一行->非阻塞
  • 标准/非即时
    MPI_Send
    ):对于大消息,它会阻止,直到传输完成
  • A同步操作块()
  • 异步操作是非阻塞()
那么,MPI ISEND是如何和为什么被阻塞的(链接1)和非阻塞的(链接2)? i、 e.这里的异步和同步
MPI Isend
是什么意思

由于MPIS
中的S发送意味着同步(或阻塞),因此在
MPI发送
MPI发送
方面也会出现类似的混淆:-

  • MPI\u Ssend:同步发送块,直到远程进程上接收到数据并确认 由发送方接收
  • MPI\u Issend:表示立即同步发送
而且,ImMedia是非阻塞的, 那么,MPI
IS如何发送beS同步并立即返回I

我想在阻塞和非阻塞OpenMPI通信的异步和同步环境中需要更清晰的描述。
在这方面,一个实际的例子或类比将非常有用。

MPI函数调用何时返回(阻塞与非阻塞)和相应操作何时完成(标准、同步、缓冲、就绪模式)之间有区别

无论操作是否完成,非阻塞调用都会立即返回。该操作在后台或异步继续。除非操作完成,否则阻塞调用不会返回。非阻塞操作由其句柄表示,该句柄可用于执行阻塞等待(
MPI_等待
)或非阻塞测试(
MPI_测试
)以完成

操作完成意味着提供的数据缓冲区不再被MPI访问,因此可以重用。发送缓冲区在消息已全部放在网络上(包括部分消息可能仍由网络设备和/或驱动程序缓冲的情况)或已由MPI实现在某处缓冲后可自由重用。缓冲情况不要求接收器已发布匹配的接收操作,因此不同步-接收可以在稍后发布。阻塞同步发送
MPI_SSEND
不会返回,除非接收器已发布接收操作,因此它会同步两个列组。非阻塞同步发送
MPI_ISSEND
会立即返回,但异步(后台)操作不会完成,除非接收器已发送匹配的接收

阻塞操作相当于紧接着等待的非阻塞操作。例如:

MPI-Ssend(buf、len、MPI-TYPE、dest、tag、MPI-COMM-WORLD);
相当于:

MPI\u请求请求;
MPI_状态;
MPI发送(buf、len、MPI类型、目的地、标记、MPI通信世界和请求);
MPI_等待(&req,&status);
标准发送(
MPI\u send
/
MPI\u ISEND
)在消息构造完成后完成,并且作为其第一个参数提供的数据缓冲区可能会被重用。没有同步保证-消息可能在本地或远程得到缓冲。对于大多数实现,通常有一些大小阈值:当同步发送较长的消息时,达到该大小的消息会得到缓冲。阈值取决于实现

Buffered发送总是将消息缓冲到用户提供的中间缓冲区中,本质上执行更复杂的内存复制操作。阻塞(
MPI\u BSEND
)和非阻塞版本(
MPI\u IBSEND
)之间的区别在于,在缓冲所有消息数据之前,前者不会返回


预发是一种非常特殊的操作。只有在发送方发出发送呼叫时,目标列组已发布接收操作,它才能成功完成。它可以通过消除执行某种握手的需要来减少通信延迟。

作为后续措施,既然您已经解释了
MPI Send
MPI ISend
,那么
MPI Send
发送什么呢?
MPI Send
是所谓的标准发送操作-它要么缓冲消息,要么以与
MPI Send
相同的方式发送消息。与
MPI\u Ssend
不同,它不保证接收方已经开始接收消息,只保证消息已经进入MPI库,并且数据缓冲区可以进一步重用。我试图理解同样的事情,最后为每个发送模式编写了示例,如下所示:。有时,查看实际代码以查看差异是很有用的。