Exemple pour l'utilisation de l'attribut SAVE

De Wiki de Calcul Québec
Aller à : Navigation, rechercher
Autres langues :anglais 100% • ‎français 100%
Fichier : omp4.f90
! Description :
!   Cet exemple permet d'illustrer l'influence de l'attribut SAVE
!   lors de la déclaration des variables. Lorsqu'une variable
!   déclarée dans une sous-routine a l'attribut SAVE, sa valeur
!   est conservée entre les appels de la sous-routine. Par défaut,
!   les variables locales dans une sous-routine n'ont pas
!   l'attribut SAVE.
!
!   Conséquence dans les régions parallèles :
!   1) Les variables avec attribut SAVE sont partagées entre les 
!      fils. Donc si deux fils appellent en meme temps la même
!      sous-routine, une variable avec l'attribut SAVE sera 
!      partagée entre les fils (i.e. une seule adresse mémoire
!      utilisée par tous les fils).
!   2) Les variables sans l'attribut SAVE ne sont pas partagées.
!      Chaque fil en possède une copie.
!
!  Dans la première région parallèle, la sous-routine omp4sub1
!  effectue des opérations sur une variable avec l'attribut SAVE.
!  Donc, ces opérations affectent des valeurs se trouvant à la
!  meme adresse dans la mémoire.
!
!  Dans la deuxième région parallèle, la sous-routine omp4sub2
!  effectue des opérations sur une variable sans l'attribut SAVE.
!  Donc, ces opérations affectent des valeurs se trouvant à des
!  adresses différentes dans la mémoire.
!
! Langage : Fortran 95
! Auteur :  Carol Gauthier, CACPUS, Université de Sherbrooke
! Date :    septembre 2000
!****************************************************************
 Program omp4
!****************************************************************
 
 write(6,*)'----------------------------------------------------------------'
 write(6,*)'Appel de sub1 en parallèle (isave a l''attribut SAVE)'
 !================================================================
 !$OMP PARALLEL
 
  call omp4sub1()
 
 !$OMP END PARALLEL
 !================================================================
 write(6,*)  
 
 write(6,*)'----------------------------------------------------------------'
 write(6,*)'Appel de sub2 en parallèle (inosave n''a pas l''attribut SAVE)'
 !================================================================
 !$OMP PARALLEL
 
  call omp4sub2()
 
 !$OMP END PARALLEL
 !================================================================
 write(6,*)  
 
! Fin du programme
 end



Fichier : omp4sub1.f90
! Description :
!   Affecte la valeur du numéro du fil (ThNum) à tous les
!   éléments du vecteur isave. Vérifie ensuite la valeur de 
!   chaque élément.
!
! Langage : Fortran 95
! Auteur :  Carol Gauthier, CACPUS, Université de Sherbrooke
! Date :    septembre 2000
!****************************************************************
subroutine omp4sub1()
!****************************************************************
! Déclaration des variables
 
 integer ThNum,OMP_GET_THREAD_NUM
 integer i,memerrors
 integer,dimension(1000000),save :: isave
 
!****************************************************************
 
 ThNum=OMP_GET_THREAD_NUM()
 
 do i=1,1000000
  isave(i)=ThNum
 end do
 
 memerrors=0
 do i=1,1000000
  if( isave(i).ne.ThNum )memerrors=memerrors+1
 end do
 
 write(6,*)ThNum,':',' memerrors = ',memerrors
 
! Fin de la sous-routine
 end



Fichier : omp4sub2.f90
! Description :
!   Affecte la valeur du numéro du fil (ThNum) à tous les
!   éléments du vecteur inosave. Vérifie ensuite la valeur de 
!   chaque élément.
!
! Langage : Fortran 95
! Auteur :  Carol Gauthier, CACPUS, Université de Sherbrooke
! Date :    septembre 2000
!****************************************************************
subroutine omp4sub2()
!****************************************************************
! Déclaration des variables
 
 integer ThNum,OMP_GET_THREAD_NUM
 integer i,memerrors
 integer,dimension(1000000) :: inosave
 
!****************************************************************
 
 ThNum=OMP_GET_THREAD_NUM()
 
 do i=1,1000000
  inosave(i)=ThNum
 end do
 memerrors=0
 do i=1,1000000
  if( inosave(i).ne.ThNum )memerrors=memerrors+1
 end do
 
 write(6,*)ThNum,':',' memerrors = ',memerrors
 
! Fin de la sous-routine
 end



Fichier : makefile
#####################################################
# makefile
 
FFLAGS= -qsmp=omp -bmaxdata:2000000000 -u
 
OBJS = omp4.o omp4sub1.o omp4sub2.o
 
 
omp1: $(OBJS)
	xlf95_r $(OBJS) $(FFLAGS) -o omp4
 
.f.o: 
	xlf95_r $(FFLAGS) -c $*.f
 
cl:
	rm -f $(OBJS) omp4


Outils personnels
Espaces de noms

Variantes
Actions
Navigation
Ressources de Calcul Québec
Outils
Partager