首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >MPI_Send()和MPI_Ssend()有什么区别?

MPI_Send()和MPI_Ssend()有什么区别?
EN

Stack Overflow用户
提问于 2013-07-11 07:57:05
回答 1查看 18.7K关注 0票数 22

我知道MPI_Send()是一个阻塞调用,它会一直等待,直到可以安全地修改应用程序缓冲区以便重用为止。为了使发送调用同步(应该与接收方握手),我们需要使用MPI_Ssend()。我想知道这两者之间的区别。假设我需要在进程中发送固定数量的字节,哪个进程需要更长的时间?

对于我来说,代码可以很好地调用MPI_Send(),但是会无限期地等待MPI_Ssend()。可能的原因是什么?

最重要的是,我非常确定在使用MPI_Send()时,数据是在接收过程中接收到的,所以在使用MPI_Ssend()时,这种推断不会导致任何有利于等待握手的事情。

或者,我可以得出一个结论:使用MPI_Send()可以向自身进程发送数据,但不能使用MPI_Ssend()

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-11 20:41:11

两者之间有一个很小但很重要的区别(您可以在3.4节的MPI 3.0 Standard文档中找到它)。对于常规的MPI_SEND,当缓冲区可供重用时,实现将返回到应用程序。这可能是在接收进程实际发送接收之前。例如,当一条小消息被复制到内部缓冲区中,并且不再需要应用程序缓冲区时,可能会发生这种情况。但是,对于可能未在内部缓冲的大型消息,调用可能不会返回,直到将足够的消息发送到不再需要缓冲区的远程进程。

这与MPI_SSEND的不同之处在于,后者将始终等待,直到接收端发布了接收。即使消息很小并且可以在内部缓冲,它仍然会等待,直到消息在另一端开始接收。

例如,MPI_SSEND是一种确保两个进程在执行过程中都达到某个点的方法,而不必执行MPI_BARRIER。如果您的应用程序在同一级别之间进行发送和接收,则执行MPI_SENDMPI_SSEND都是不安全的,因为这两种操作都可能无限期地阻塞。相反,您应该使用MPI_ISENDMPI_IRECV,以便调用将立即返回,并且可以同时完成实际的发送/接收(在对MPI_WAITALL的调用中)。

票数 42
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17582900

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档