Передача минимального значения с определенного процессора

#parallel-processing #mpi #openmpi

#параллельная обработка #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 находит глобальный минимальный элемент среди всех из них.
  3. Таким образом, процессор, который имеет глобальный элемент min, должен передавать его другим как.

Мой вопрос: как 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(amp;min, 1, MPI_INT,0, 0, MPI_COMM_WORLD);
}

MPI_Bcast(amp;p_min, 1, MPI_FLOAT, p_id, MPI_COMM_WORLD);
  

Ответ №1:

То, что вы предлагаете, не работает. Корень a MPI_Bcast должен быть одинаковым для всех рангов, p_id это не так. Кроме того, я очень смущен вашим использованием разных переменных и find_min .

Существует коллективная операция, которая выполняет все за один шаг, MPI_Allreduce :

 MPI_Allreduce(MPI_IN_PLACE, amp;min, 1, MPI_FLOAT, MPI_MIN, MPI_COMM_WORLD);
  

После этого вызова, min будет одинаковым для всех рангов, минимальное из всех значений min перед вызовом.

Примечание: MPI_IN_PLACE это специальный индикатор для чтения и записи в один и тот же буфер.

Комментарии:

1. Благодарим вас за представление MPI_Allreduce. find_min это просто функция, которая находит индекс минимального значения, где каждый индекс представляет идентификатор процессора.