在C中使用MPI_Reduce进行多个操作

时间:2014-12-15 21:45:22

标签: c max mpi min

我正在研究MPI程序来计算大数据阵列的平均值,最小值和最大值。每个进程根据它们的数组块计算本地最小/最大/平均值。在程序结束时,我连续调用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;

1 个答案:

答案 0 :(得分:1)

在性能方面,它很可能不会产生很大的不同。想想如果你决定在一级而不是通过MPI集体做事情,你必须做些什么。

首先,您必须执行MPI_GATHER才能获得单个流程的所有数据。您必须确保为所有进程的所有数据分配足够的内存,并且您必须执行计算。最后,您必须将其发回给拥有MPI_BCAST的所有人。

最后,您可以为自己保留一个MPI_REDUCE,但相反,您需要获得更多的内存分配和计算。摆脱一个集体操作可能会稍微快一点,但可能不会那么明显,随着大多数MPI应用程序中的还原操作得到高度优化,随着更大和更大规模的扩大,权衡变得更加明显。