我正在研究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;
答案 0 :(得分:1)
在性能方面,它很可能不会产生很大的不同。想想如果你决定在一级而不是通过MPI集体做事情,你必须做些什么。
首先,您必须执行MPI_GATHER
才能获得单个流程的所有数据。您必须确保为所有进程的所有数据分配足够的内存,并且您必须执行计算。最后,您必须将其发回给拥有MPI_BCAST
的所有人。
最后,您可以为自己保留一个MPI_REDUCE
,但相反,您需要获得更多的内存分配和计算。摆脱一个集体操作可能会稍微快一点,但可能不会那么明显,随着大多数MPI应用程序中的还原操作得到高度优化,随着更大和更大规模的扩大,权衡变得更加明显。