program calc_mflops include 'mpif.h' integer i, j, n double precision w, gsum, sum double precision v integer np, myid, ierr, niter, status(MPI_STATUS_SIZE) real*8 time, amflops, amflops1, time1, time2, dsecnd integer mflops, mflops1 c Инициализация MPI и определение процессорной конфигурации call MPI_INIT( ierr ) call MPI_COMM_RANK( MPI_COMM_WORLD, myid, ierr ) call MPI_COMM_SIZE( MPI_COMM_WORLD, np, ierr ) c Информацию с клавиатуры считывает 0-й процессор if ( myid .eq. 0 ) then n = 200000000 endif time1 = MPI_Wtime() c Рассылка числа точек разбиения всем процессорам call MPI_BCAST(n, 1, MPI_INTEGER, 0, MPI_COMM_WORLD, ierr) c Вычисление частичной суммы на процессоре w = 1.0 / n do j = 1, 4 sum = 0.0d0 do i = myid+1, n, np v = (i - 0.5d0 ) * w v = 4.0d0 / (1.0d0 + v * v) sum = sum + v end do end do c Суммирование частичных сумм с сохранением результата в 0-м c процессоре call MPI_REDUCE(sum, gsum, 1, MPI_DOUBLE_PRECISION, $ MPI_SUM, 0, MPI_COMM_WORLD, ierr) time2 = MPI_Wtime() time = (time2 - time1) / 4 niter = 0 do i = myid+1, n, np niter = niter + 1 end do mflops1 = 9 * niter / (1000000.0 * time) c Печать выходной информации с 0-го процессора if (myid .eq. 0) then mflops = 9 * n / (1000000.0 * time) print *, ' ' print *, 'HPC Test ---------------------------------------------' c print *, 'pi is approximated with ', gsum *w print *, 'Number of processors\t= ', np print *, 'Total time\t\t= ', time, ' seconds' print *, 'Cluster speed\t\t= ', mflops, ' MFLOPS' print *, 'Node 0 speed\t\t= ', mflops1, ' MFLOPS' c собираем значения быстродействия процессов do i = 1, np-1 CALL MPI_RECV(mflops1, 1, MPI_REAL8, i, 0, $ MPI_COMM_WORLD, status, ierr) print *, 'Node ', i, ' speed\t\t= ', mflops1, ' MFLOPS' end do print *, ' ' else c посылаем значение быстродействия локального процесса call MPI_SEND(mflops1, 1, MPI_REAL8, 0, 0, $ MPI_COMM_WORLD, ierr) endif c Закрытие MPI call MPI_FINALIZE(ierr) end