Пример. Функция MPI_Reduce с операцией MPI_MAXLOC
Операции MPI_MINLOC и MPI_MAXLOC Операции MPI_MINLOC/MPI_MAXLOC используются для определения глобального минимума/максимума и соответствующих им индексов. Каждый процесс предоставляет значение и свой номер в группе. Операция редукции с op = MPI_MAXLOC возвратит значение максимума и номер первого процесса с этим значением. Аналогично, MPI_MINLOC возвратит значение минимума и номер процесса, если процессов с таким значением несколько будет возвращен номер первого. Чтобы использовать MPI_MINLOC и MPI_MAXLOC в операции редукции, нужно определить тип данных datatype,который представляет пару (значение и индекс). MPI предоставляет девять таких предопределенных типов данных – 3 фортрана и 6 Си: MPI_FLOAT_INT переменные типа float и int MPI_DOUBLE_INT переменные типа double и int MPI_LONG_INT переменные типа long и int MPI_2INT пара переменных типа int MPI_SHORT_INT переменные типа short и int MPI_LONG_DOUBLE_INT переменные типа long double и int Пример. Функция MPI_Reduce с операцией MPI_MAXLOC #include <stdio.h> #include <mpi.h> struct{ double value; int proc; }local_max,global_max; void main(int argc, char *argv[]) { int i, rank, size; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &size); double array[10]; double max_value; for(i=0; i<10; i++) array[i]=(double)rand()/RAND_MAX + 0.1*rank; max_value=array[0]; for(i=0; i<10; i++){ if(array[i]>max_value) max_value=array[i]; } local_max.value=max_value; local_max.proc=rank; MPI_Reduce(&local_max,&global_max,4,MPI_DOUBLE_INT,MPI_MAXLOC,size-1, MPI_COMM_WORLD); if (rank == size-1) printf("global maximum=%f number process=%d\n",global_max.value, global_max.proc); MPI_Finalize(); }
|