gpt4 book ai didi

c - 在 C 中使用 MPI_Reduce 进行多项操作

转载 作者:太空宇宙 更新时间:2023-11-04 03:42:16 24 4
gpt4 key购买 nike

我正在开发一个 MPI 程序来计算大型数据数组的平均值、最小值和最大值。每个进程根据其数组 block 计算本地最小值/最大值/平均值。在程序结束时,我连续调用 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;

最佳答案

它很可能不会在性能方面产生太大差异。想想如果您决定在一个等级上而不是通过 MPI 集体做事,您必须做什么。

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

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

关于c - 在 C 中使用 MPI_Reduce 进行多项操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27493730/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com