【问题标题】:Using MPI_Reduce in C for Multiple Operations在 C 中使用 MPI_Reduce 进行多项操作
【发布时间】:2015-02-14 02:53:51
【问题描述】:

我正在开发一个 MPI 程序来计算大型数据数组的平均值、最小值和最大值。每个进程根据它们的数组块计算本地 min/max/avg。在程序结束时,我连续调用 MPI_Reduce 3 次(一次使用 MPI_MIN,一次使用 MPI_MAX,一次使用 MPI_SUM)[下面的代码]。直觉上,这似乎是一个瓶颈,但我不确定我是否明白我应该做什么。

我是否应该将这 3 个值放入一个数组并将这些数据发送到根进程,然后手动对其执行操作?还是应该传递一个包含 3 个值的数组,然后编写自己的归约函数?

    // Find Max in our local buffer
    for(i=0;i<array_size;i++){

            sum += tempDataBuffer[i];

            if(local_max < tempDataBuffer[i]){
                    local_max = tempDataBuffer[i];
            }else if(local_min > tempDataBuffer[i]){
                    local_min = tempDataBuffer[i];
            }

    }

    int local_avg = sum/i;

    int global_max, global_min, global_avg;

    MPI_Reduce(&local_max, &global_max, 1, MPI_INT, MPI_MAX, 0, MPI_COMM_WORLD);
    MPI_Reduce(&local_min, &global_min, 1, MPI_INT, MPI_MIN, 0, MPI_COMM_WORLD);
    MPI_Reduce(&local_avg, &global_avg, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD);
    global_avg = global_avg/nprocs;

【问题讨论】:

  • 为什么投反对票?如果您投反对票,请发表评论,以便我可以学习如何更正确地提出我的问题。谢谢。

标签: c max mpi min


【解决方案1】:

就性能而言,它很可能不会有太大的不同。想想如果你决定在一个等级而不是通过 MPI 集体做事,你必须做什么。

首先,您必须执行MPI_GATHER 才能在一个进程中获取所有数据。您必须确保为来自所有进程的所有数据分配足够的内存,并且您必须执行计算。最后,您必须使用MPI_BCAST 将其发回给所有人。

最后,您会为自己节省一个MPI_REDUCE,但您会获得更多的内存分配和计算。摆脱一个集体操作可能会稍微快一些,但可能不会那么快,而且随着规模越来越大,由于缩减操作在大多数 MPI 应用程序中都得到了高度优化,因此权衡变得更加不明确。

【讨论】:

  • 谢谢!这正是我所希望的那种彻底的答案(帮助我自己理解)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-14
  • 2014-11-04
  • 2012-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多