#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)
, и отправляли его всем процессорам. Я использую следующие шаги:
- Каждый процессор отправляет свое локальное минимальное значение в корень (вот оно
p0
). - Root находит глобальный минимальный элемент среди всех из них.
- Таким образом, процессор, который имеет глобальный элемент 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
это просто функция, которая находит индекс минимального значения, где каждый индекс представляет идентификатор процессора.