从特定处理器广播最小值

Broadcast minimum value from a specific processor

我有 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. 根在所有元素中找到全局个最小元素
  3. 因此,具有全局最小元素的处理器应该将其广播给其他人。

我的问题是:在这种情况下,根 p0 如何通知具有全局最小值的节点广播其值?我用的是下面的方式,但是我确定它是否合理!

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);

您的建议有效。 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是读写同一个缓冲区的特殊指标