MPI计数为零通常是有效的。

8

我今天看到了这个

MPI_ERR_COUNT 无效的计数参数。 计数参数必须为非负数; 计数为零通常是有效的。

什么是计数为零“通常”有效? 这是否意味着它取决于实现?

2个回答

11

我认为你读得太深了。我认为它的意思很简单,即根据用户的实现,从0到任意正整数都是有效计数。很容易想象一个不需要参数的消息标记。

如果消息标记不需要参数,则仅发送零是有效的(实际上,发送多于零可能无效)。您必须记住,没有参数并不等同于没有数据,因为消息标记本身就是“参数”。


简而言之,即使没有有效载荷,接收到消息的事实本身就足以成为信息,例如表示已经达到执行中的某个特定点。 - suszterpatt
但是为什么它不说计数为零始终有效呢?(我同意没有有效负载的消息很有用) - mgilson
2
你是正确的。零始终是有效的。我已经查阅了标准(MPI 2.2标准的3.2.2节)。 - mgilson
1
我认为man手册并不是规范,它只是在告诉程序员:“嘿,程序员先生,请记住,零参数消息也可以是有效的。” - Mahmoud Al-Qudsi

7
这意味着MPI中的任何需要指定消息数据大小的函数都可以接受0,但这并不意味着它会导致正确的应用程序代码。例如,MPI_Send接受0作为计数,并始终发送一个空消息,该消息不携带数据但仍具有信封,并且可以被任何匹配的MPI_Recv接收。另一方面,如果在MPI_Recv中将0指定为计数,则对于已到达的任何匹配非空消息,您将获得消息截断错误。也就是说,0几乎从不是MPI_Recv的有效(从应用程序角度)计数值,尽管对于MPI来说是完全可接受的。由于这样可以编写更对称的代码(例如,没有大量if(count!= 0)...的代码),因此在MPI中广泛接受0。

我不确定我理解 symmetric 代码参数的含义...有时候,消息信封中的信息就足够了(例如用于同步两个进程)。 - mgilson
1
对称指的是代码中没有 if 语句,因此更容易阅读和理解。另一个例子是在非周期性笛卡尔拓扑中使用 MPI_PROC_NULL 来防止边界进程中的特定于排名的逻辑,例如“如果我不是最高排名,则向排名+1发送消息”或“如果我不是排名0,则从排名-1接收消息”。 - Hristo Iliev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接