program test implicit none include 'mpif.h' integer n parameter (n=300) integer i,j,io_err, & myid, numprocs, ierr, n1 double precision a(n),b(n),c(2),d(n*n),ddot c-----initialisation de l'espace de communication call MPI_INIT( ierr ) c-----identification du processus actif call MPI_COMM_RANK( MPI_COMM_WORLD, myid, ierr ) call MPI_COMM_SIZE( MPI_COMM_WORLD, numprocs, ierr ) write(*,*) 'Processus ', myid, ' sur ', numprocs, ' est actif' c-----fichier data output c-----seul le processus 0 ouvre et crit dans le fichier output if (myid . eq . 0) then open (unit=4, file='test.out',iostat=io_err) if (io_err.ne.0) then write(*,*) 'erreur ouverture fichier out' call MPI_Abort( MPI_COMM_WORLD, 1, ierr ) endif endif c-----fichier data input open (unit=3, file='test.dat',status='old',iostat=io_err) if (io_err.ne.0) then write(*,*) 'erreur ouverture fichier dat' stop endif if (myid.eq.0) write(4,*) 'dbut petit programme' write(*,*) 'dbut petit programme' c-----lecture donnes read(3,*) j if (myid.eq.0) write(4,*) 'donnes lues : ',j c-----rpartition du travail sur les diffrents processus c-----rpartition des donnes : c-----un processus "voit" : c----- un morceau de la matrice d(n*n1) c----- un morceau du vecteur b(n1) c----- le vecteur a(n) entirement c-------------------------------------------------------- n1 = n / numprocs if (myid . eq . 0) n1 = n1 + mod (n, numprocs) c-----initialisation do i=1,n a(i) = 3.d+00 enddo do i=1,n1 b(i) = 2.d+00 enddo do i=1,n*n1 d(i) = 2.d+00 enddo c-----calculs divers c(1) = ddot(n1,a,1,b,1) c if (myid.eq.0) write(4,*) 'produit scalaire partiel',c(1) call dgemv('t',n,n1,1.d+00,d,n,a,1, & 0.d+00,b,1) c(2) = ddot(n1,a,1,b,1) c if (myid.eq.0) write(4,*) 'produit scalaire partiel',c(2) c-----assemblage des contributions call MPI_Allreduce( c, a, 2, & MPI_DOUBLE_PRECISION, MPI_SUM, & MPI_COMM_WORLD, ierr ) if (myid.eq.0) write(4,*) 'produit scalaire final',a(1) if (myid.eq.0) write(4,*) 'produit scalaire final',a(2) c-----fin if (myid.eq.0) write(4,*) 'fin petit programme' write(*,*) 'fin petit programme' close(unit=3) if (myid.eq.0) close(unit=4) call MPI_FINALIZE(ierr) end