Tags OpenMPI:使用标记:这些标记可用于创建虚拟通道吗?

Tags OpenMPI:使用标记:这些标记可用于创建虚拟通道吗?,tags,openmpi,Tags,Openmpi,我在不同的地方问过这个问题,包括OpenMPI邮件列表。到目前为止,我运气不好。因此,如果有人能帮忙,我将不胜感激,不管这个问题看起来有多愚蠢 问题: 考虑运行在两个不同处理器上的两个进程A和B。没有别的 进程运行。进程A有两条消息要发送,M1(大小:大,标记T1)和 M2(1字节,标记T2)。进程B使用MPI_Probe选择性地过滤和 接收消息。是否保证进程B仍然可以接收消息M2, 当它没有MPI_Recv消息M1时?考虑进程A先发送M1。 所有进程都是单线程的 此外,OpenMPI是否确保来

我在不同的地方问过这个问题,包括OpenMPI邮件列表。到目前为止,我运气不好。因此,如果有人能帮忙,我将不胜感激,不管这个问题看起来有多愚蠢

问题:

考虑运行在两个不同处理器上的两个进程A和B。没有别的 进程运行。进程A有两条消息要发送,M1(大小:大,标记T1)和 M2(1字节,标记T2)。进程B使用MPI_Probe选择性地过滤和 接收消息。是否保证进程B仍然可以接收消息M2, 当它没有MPI_Recv消息M1时?考虑进程A先发送M1。 所有进程都是单线程的

此外,OpenMPI是否确保来自同一来源的两条不同消息 是否可以按任何顺序接收带有相同标签的标签

基本上,我想了解OpenMPI的系统缓冲区是否发挥了任何作用:如果一条消息设法填满了它,那么来自同一来源但带有另一个标记的另一条消息可能永远不会被接收到。对吗

非常感谢你的建议


Devendra

我在Open MPI用户列表中回复了您,但也将在此处发布,以防其他人发现它有用。我相信Jeff Squyres已经在OpenMPI邮件列表上回答了您的问题,或者至少暗示了可能的问题。MPI消息按发送顺序接收,但仅在特定(标记、通信器)元组中接收。这基本上意味着:

  • 在同一个通信器中,如果带有不同的标签,您可能会收到无序的消息
  • 如果在不同的上下文(通信者)中进行通信,则携带相同标签的消息可能会被无序接收
但问题是:如果发送操作尚未发布,则无法接收消息。如果有两个连续的发送操作,则必须确保第一个操作不会永远阻塞。标准的MPI发送操作
MPI_send
可以以各种方式实现(标准没有具体说明如何实现),但在大多数MPI实现中,它的行为类似于非常小的消息的缓冲发送和较大消息的同步发送。如果发件人进程中有以下两个呼叫:

MPI_发送(大数据、大计数、MPI_INT、dest、tag1、MPI_通信世界);
MPI_发送(smalldata、smallcount、MPI_INT、dest、tag2、MPI_COMM_WORLD);
可能发生的情况是,第一次MPI_发送实际上表现为同步发送,即,除非在接收器端发布匹配的接收操作,否则它不会返回。假设您的接收器代码为:

MPI_探测器(src、tag2、MPI_通信世界和状态);
MPI_Recv(大数据、大计数、MPI_INT、src、tag1、MPI_通信世界和状态);
这很可能是死锁,因为
MPI\u Probe
是一个阻塞调用,即在发布匹配的发送之前,它不会返回,即必须执行第二次
MPI\u发送
,这只会在第一次发送返回后发生,但除非执行接收器中的
MPI\u Recv
,否则不会发生这种情况。。。我想你明白了

要防止死锁,您可以修改发件人的代码以使用非阻塞发送:

MPI\u请求请求;
MPI Isend(大数据、大计数、MPI INT、目标、tag1、MPI通信世界和请求);
MPI_发送(smalldata、smallcount、MPI_INT、dest、tag2、MPI_COMM_WORLD);
MPI\u等待(&req,MPI\u状态\u忽略);

使用非阻塞操作,send调用立即返回,操作在后台继续,因此第二次send将立即执行。现在将有两条待处理的消息,它们可以以任何顺序接收,因为它们带有不同的标签。

非常感谢!我没听清杰夫的回答,而且太简洁了。这更有用!不客气。有点遗憾的是,官方和长期运行的邮件列表正被Web2.0技术所掩盖,但这似乎是未来。。。