【发布时间】: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;
【问题讨论】:
-
为什么投反对票?如果您投反对票,请发表评论,以便我可以学习如何更正确地提出我的问题。谢谢。