我有4个处理器(p0,p1,p2,p3),每个处理器都有一个值数组:
int i;
srand(time(NULL))
float *d= malloc(5, sizeof(float));
for(i=0;i<5;i++){
d[i] = (float) rand();
}
我的目标是每个处理器在本地找到其数组的最小元素p_min
,因此在所有处理器中我们选择最小的一个,即min(p0_min, p1_min, p2_min, p3_min)
,并将其发送到所有处理器。我使用以下步骤:
p0
)。我的问题是:在这种情况下,root,p0如何通知具有全局min的广播其值?我使用以下方式,但我确定它是否合理!
if(p_id == 0){
for ( i = 1; i < P; ++i) {
MPI_Recv(min[i], 1, MPI_FLOAT, i, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
}
p_id = find_min(min, 4);
}else{
MPI_Send(&min, 1, MPI_INT,0, 0, MPI_COMM_WORLD);
}
MPI_Bcast(&p_min, 1, MPI_FLOAT, p_id, MPI_COMM_WORLD);
答案 0 :(得分:1)
您建议不工作。 MPI_Bcast
的根在所有等级上必须相同,p_id
不是。此外,我对你使用不同变量和find_min
非常困惑。
有一个集体操作可以一步完成,MPI_Allreduce
:
MPI_Allreduce(MPI_IN_PLACE, &min, 1, MPI_FLOAT, MPI_MIN, MPI_COMM_WORLD);
此次通话结束后,min
在所有排名上都相同,即调用前min
的所有值中的最小值。
注意:MPI_IN_PLACE
是读取和写入同一缓冲区的特殊指示符。