从特定处理器广播最小值

时间:2016-10-21 14:34:09

标签: parallel-processing mpi openmpi

我有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),并将其发送到所有处理器。我使用以下步骤:

  1. 每个处理器将其本地分钟发送到根目录(此处为p0)。
  2. root在所有这些中找到 global 最小元素。
  3. 因此,具有全局最小元素的处理器应该将其广播给其他人。
  4. 我的问题是:在这种情况下,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);
    

1 个答案:

答案 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是读取和写入同一缓冲区的特殊指示符。