【问题标题】:MPI count of zero is often validMPI 计数为零通常是有效的
【发布时间】:2012-05-11 07:19:44
【问题描述】:

我今天遇到this

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

计数为零是什么意思通常有效?这是否意味着它依赖于实现?

【问题讨论】:

    标签: c fortran mpi


    【解决方案1】:

    我认为你读得太多了。我认为这只是意味着根据 user 实现,从 0 开始的任何随机正整数都是有效计数。不难想象一个不需要参数的消息标签。

    如果消息标签不需要参数,那么只发送零是有效的(事实上,发送更多可能是无效的)。您必须记住,没有参数与没有数据不同,因为消息标签本身就是一个“参数”。

    【讨论】:

    • +1。简而言之,即使没有有效负载,接收到消息的事实本身也可以提供足够的信息,例如表示已到达某个执行点。
    • 但是为什么不说零计数总是有效的呢? (我同意没有有效负载的消息很有用)
    • 你是对的。零始终有效。我查看了标准(MPI 2.2 标准的第 3.2.2 节)
    • 我看到的是手册页不是规范。它只是在说“哦,程序员先生,请记住,零参数消息也可以是有效的”
    【解决方案2】:

    这意味着 MPI 中任何需要指定消息数据大小的函数都接受零,但这并不意味着它会导致正确的应用程序代码。

    例如,MPI_Send 接受 0 作为计数,并且将始终发送一个空消息,该消息不携带任何数据但仍然有一个信封,并且可以被任何匹配的 MPI_Recv 接收。另一方面,如果您将 0 指定为 MPI_Recv 中的计数,您将收到任何已到达的匹配非空消息的消息截断错误。也就是说,0 几乎从来都不是 MPI_Recv 的有效计数值(从应用程序的角度来看),尽管它对于 MPI 来说是完全可以接受的。

    零在 MPI 中被广泛接受,因为这样可以编写更对称的代码(例如,没有大量 if (count != 0) ... 的代码

    【讨论】:

    • 我不确定我是否理解 symmetric 代码参数...有时您只需要来自消息信封的信息(例如同步两个进程)。
    • 对称意味着代码中没有if-s,因此更易于阅读和理解。另一个例子是使用MPI_PROC_NULL 来防止非周期性笛卡尔拓扑中边界过程中的等级特定逻辑,例如“如果我不是最高级别,则发送消息到 rank+1”或“如果我不是 0 级,则接收来自 rank-1 的消息”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-30
    • 2017-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多