【问题标题】:How many times is the reduce operation called by MPI_Reduce?MPI_Reduce调用reduce操作多少次?
【发布时间】:2016-12-21 17:01:58
【问题描述】:

我使用此处描述的相同操作(第一个代码)[1]。

MPI_Reduce(local, global, 1, mpi_datatype, mpi_selectop, 0, MPI_COMM_WORLD);

我看到 MPI_Reduce 被通信器中的 p-1 个进程调用,但对于 MPI_Allreduce 等其他 reduce 函数来说这是错误的。

1Q - 是否有一种模式可以知道 MPI_Reduce 调用创建的操作多少次?

2Q - 有没有办法将 MPI_Reduce 的调用次数减少到只有一个进程(根)但所有进程的输入条目?

[1] First k results

【问题讨论】:

    标签: c++ mpi reduce


    【解决方案1】:

    首先,我假设您在写 MPI_Reduce 时是指 MPI 用户缩减函数

    1) 未定义用户缩减函数的调用频率。例如,明确允许 MPI 实现对输入数据块调用归约操作。因此,您不应该对正确性做出任何假设。如果您想优化,请根据您的具体情况进行衡量。

    2) 如果您坚持只在根等级上调用归约操作,您可以使用MPI_Gather(如果内存允许)。 MPI_Reduce_Local 可能对您有所帮助,但它不是集体减少,只是一种调用 MPI_Op 的方式。这将大大降低效率,因为您正在浪费非食品行列的计算和通信能力。实际上,就时间复杂度而言,您从 O(log n) 变为 O(n)。

    如果您能描述您要解决的实际问题,可能会有更好的解决方案。

    【讨论】:

    • 我想将已排序的向量(k 大小)减少为具有 k 大小次要但使用最小堆结构(进程大小数)的全局向量,因此对于每次迭代,第一个值被写入输出跨度>
    猜你喜欢
    • 2015-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-15
    • 1970-01-01
    • 1970-01-01
    • 2015-06-26
    • 1970-01-01
    相关资源
    最近更新 更多