Barrier

De Wiki de Calcul Québec
Aller à : Navigation, rechercher
Autres langues :anglais 100% • ‎français 100%

Cet exemple permet d'illustrer le fonctionnement de MPI_Barrier, utilisé pour synchroniser les processus. Lorsqu'un processus rencontre un appel MPI_Barrier, il attend que tous les autres processus du communicateur soient également rendus à ce même appel. Cet exemple n'est évidemment pas très parallèle, c'est comme un groupe de travailleurs qui peint une maison avec un seul pinceau! Néanmoins, la fonction MPI_Barrier est indispensable dans bien d'autres situations.

En Fortran

Fichier : hello2.f
! --------------------------------------------------------
!   Note: Le groupe MPI_COMM_WORLD englobe tous les processus.  
!
!   Le programme est fait pour être exécuté en quatre processus MPI.
!   
! Auteur: Carol Gauthier
!         Centre de Calcul scientifique
!         Université de Sherbrooke
!
! Dernière révision: août 2004
! --------------------------------------------------------
Program HelloWorld2
 
  include 'mpif.h'
 
  integer ntasks,taskid
  integer ierr,i,j,itask
  integer buffsize
 
  Call MPI_Init( ierr )
 
  Call MPI_Comm_Size( MPI_COMM_WORLD,ntasks,ierr )
  Call MPI_Comm_Rank( MPI_COMM_WORLD,taskid,ierr )
 
  write(6,*)
  write(6,*)
 
  call MPI_Barrier(MPI_COMM_WORLD,ierr)
 
  if ( taskid.eq.0 )write(6,'(a,$)')'Hel'
  if ( taskid.eq.1 )write(6,'(a,$)')'lo '
  if ( taskid.eq.2 )write(6,'(a,$)')'Wor'
  if ( taskid.eq.3 )write(6,'(a,$)')'ld!'
 
  call MPI_Barrier(MPI_COMM_WORLD,ierr)
 
  if ( taskid.eq.0 )write(6,*)" (Désordonnée)"
 
  if ( taskid.eq.0 )write(6,'(a,$)')"Hel"
  call MPI_Barrier(MPI_COMM_WORLD,ierr)
  if ( taskid.eq.1 )write(6,'(a,$)')"lo "
  call MPI_Barrier(MPI_COMM_WORLD,ierr)
  if ( taskid.eq.2 )write(6,'(a,$)')"Wor"
  call MPI_Barrier(MPI_COMM_WORLD,ierr)
  if ( taskid.eq.3 )write(6,'(a,$)')"ld!"
  call MPI_Barrier(MPI_COMM_WORLD,ierr)
 
  if ( taskid.eq.0 ) write(6,*)" (Ordonnée)"
 
  call MPI_Barrier(MPI_COMM_WORLD,ierr)
 
  write(6,*)
  write(6,*)
 
  Call MPI_Finalize( ierr )
 
End Program


En C

Fichier : hello2.c
/* --------------------------------------------------------
   Note: Le groupe MPI_COMM_WORLD englobe tous les processus.  
 
   Le programme est fait pour être exécuté en quatre processus MPI.
 
 Auteur: Carol Gauthier
         Centre de Calcul scientifique
         Université de Sherbrooke
 
 Dernière révision: août 2004
-------------------------------------------------------- */
#include <malloc.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include "math.h"
#include "mpi.h"
 
int main(int argc,char** argv)
{
   int          taskid, ntasks;
   int          ierr,i,j,itask;
   int	        buffsize;
 
   MPI_Init(&argc, &argv);
 
   MPI_Comm_rank(MPI_COMM_WORLD,&taskid);
   MPI_Comm_size(MPI_COMM_WORLD,&ntasks);
 
   if ( taskid == 0 ){
     printf("\n\n\n\n\n");
   } 
 
   ierr=MPI_Barrier(MPI_COMM_WORLD);
 
   if ( taskid == 0 )printf("Hel");
   if ( taskid == 1 )printf("lo ");
   if ( taskid == 2 )printf("Wor");
   if ( taskid == 3 )printf("ld!");
 
   ierr=MPI_Barrier(MPI_COMM_WORLD);
 
   if ( taskid == 0 )printf(" (Désordonnée)\n");
 
   if ( taskid == 0){
       printf("Hel");
       fflush(stdout);
   }
   ierr=MPI_Barrier(MPI_COMM_WORLD);
   if ( taskid == 1){
       printf("lo ");
       fflush(stdout);
   }
   ierr=MPI_Barrier(MPI_COMM_WORLD);
   if ( taskid == 2){
        printf("Wor");
        fflush(stdout);
   }
   ierr=MPI_Barrier(MPI_COMM_WORLD);
   if ( taskid == 3){
        printf("ld!");
        fflush(stdout);
   }
   ierr=MPI_Barrier(MPI_COMM_WORLD);
 
   if ( taskid == 0 ){
     printf(" (Ordonnée)\n\n\n\n\n");
   }
 
   MPI_Finalize();
}


Outils personnels
Espaces de noms

Variantes
Actions
Navigation
Ressources de Calcul Québec
Outils
Partager