* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * $Id: pi.f,v 1.4 2006/03/06 12:31:32 mechanoid Exp mechanoid $ * * pi parallel calculate with MPI * * OS : FreeBSD 5.3 * COMPILER : mpif77 for MPICH2 v.1.0.3 * gcc version 3.4.2 [FreeBSD] * GNU ld version 2.15 [FreeBSD] * * AUTHOR : Evgeny S. Borisov * * Glushkov Institute of Cybernetics * National Academy of Sciences of Ukraine * * http://www.mechanoid.kiev.ua * e-mail : par@mechanoid.kiev.ua * * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - program pi_calculate implicit none include 'mpif.h' * размер интервала, на котором будем считать сумму integer N parameter(N=10000000) * номер процесса integer iam * количество ветвей параллельной программы integer nprocs * имя узла, на котором выполняется процесс character*18 pname integer ierr, i,nlen real*8 pi, h, x, res * инициализация MPI call MPI_INIT(ierr) * получаем количество ветвей параллельной программы call MPI_COMM_SIZE(MPI_COMM_WORLD, nprocs, ierr) * получаем номер процесса call MPI_COMM_RANK(MPI_COMM_WORLD, iam, ierr) * получаем имя узла, на котором выполняется процесс call MPI_GET_PROCESSOR_NAME(pname,nlen,ierr); * процесс 0 печатает размер интервала, на котором будем считать сумму if(iam .eq. 0) then write(*,*) 'N = ', N endif write(*,*)'Process ',iam,' of ',nprocs,' started on ',pname * считаем частичную сумму pi = 0.0 h = 1.0/N do i= 1+iam , N, nprocs x = h*(i-0.5) pi = pi+(4.0/(1.0+x*x)) enddo pi = h * pi * процесс 0 получает результаты от ветвей и суммирует их call MPI_REDUCE(pi,res,1,MPI_REAL8,MPI_SUM,0,MPI_COMM_WORLD,ierr) * процесс 0 печатает конечный результат if(iam .eq. 0) then write(*,*) 'pi = ', res endif * завершение работы call MPI_FINALIZE(ierr) stop end * * результаты запуска на кластере из двух Pentium III 700MHz, FAST ETHERNET 100Mbs * * два узла * * mechanoid@node2 /usr/home/mechanoid/MPI/pi/f * $ time mpiexec -n 2 ./pi * N = 1000000000 * Process 0 of 2 started on node2.home.net * Process 1 of 2 started on node1.home.net * pi = 3.1415926 * * real 0m24.265s * user 0m0.396s * sys 0m0.045s * * один узел * * mechanoid@node2 /usr/home/mechanoid/MPI/pi/f * $ time mpiexec -n 1 ./pi * N = 1000000000 * Process 0 of 1 started on node2.home.net * pi = 3.1415926 * * real 0m46.724s * user 0m0.355s * sys 0m0.090s *