Exemple pour l'utilisation de la directive THREADPRIVATE et de la clause COPYIN

De Wiki de Calcul Québec
Aller à : Navigation, rechercher
Autres langues :anglais 100% • ‎français 100%
Fichier : omp3.f90
! Description :
!   Exemple d'utilisation de la directive THREADPRIVATE, qui
!   sert à declarer des common blocks privés pour chaque fil.
!   Normalement, l'espace mémoire défini par un common block
!   est commun à tous les fils. La directive THREADPRIVATE 
!   doit apparaître immédiatement après la déclaration du
!   common block, et ce dans chaque sous-routine 
!   ou ce dernier est declaré.
!
!   Dans la première région parallèle, le common block /cb1/ est
!   partagé entre les fils, tandis que dans la deuxième 
!   région parallèle le common block /cb2/ est privé dans chaque
!   fil. Les sous-routines omp3sub1 et omp3sub2 effectuent des
!   opérations affectant les valeurs des variables dans leur
!   common blocks respectifs. Chacune de ces sous-routines se
!   trouvant dans une région parallèle, elles sont donc appelées
!   par chaque fil de l'équipe de fils.
!
!   Les troisième et quatrième régions parallèles démontrent 
!   l'utilisation de la clause COPYIN, permettant d'initialiser
!   la valeur des variables dans les common blocks privés à
!   partir des valeurs dans les common blocks juste avant l'entrée
!   dans la région parallèle.
!
! Langage : Fortran 95
! Auteur :  Carol Gauthier, CACPUS, Université de Sherbrooke
! Date :    septembre 2000
!****************************************************************
 Program omp3
!****************************************************************
! Déclaration des variables
 
  integer a1(1000),b1(1000)
  integer a2(1000),b2(1000)
  integer a3(1000),b3(1000)
 
  common /cb1/ a1,b1
  common /cb2/ a2,b2
  common /cb3/ a3,b3
  !$OMP THREADPRIVATE(/cb2/,/cb3/)
 
!****************************************************************
! Démonstration de l'utilisation de la directive THEADPRIVATE
 
 write(6,*)'-------PARALLEL sans THREADPRIVATE-------------------'  
 !================================================================
 !$OMP PARALLEL
 
  call omp3sub1()
 
 !$OMP END PARALLEL
 !================================================================
 write(6,*)  
 
 write(6,*)'-------PARALLEL avec THREADPRIVATE(/cb2/)------------'  
 !================================================================
 !$OMP PARALLEL
 
  call omp3sub2()
 
 !$OMP END PARALLEL
 !================================================================
 write(6,*)  
 
 ! Initialisation de a3 et b3
 a3=1
 b3=1
 
 write(6,*)'--PARALLEL avec THREADPRIVATE(/cb3/)------------------'  
 !================================================================
 !$OMP PARALLEL
 
  call omp3sub3()
 
 !$OMP END PARALLEL
 !================================================================
 write(6,*)  
 
 ! Réinitialisation de a3 et b3
 a3=1
 b3=1
 
 write(6,*)'--PARALLEL COPYIN(/cb3/) avec THREADPRIVATE(/cb3/)----'  
 !================================================================
 !$OMP PARALLEL COPYIN(/cb3/)
 
  call omp3sub3()
 
 !$OMP END PARALLEL
 !================================================================
 write(6,*)  
 
! Fin du programme
 end



Fichier : omp3sub1.f90
! Description :
!    Emplit 5000 fois les vecteurs a1 et b1 avec la valeur du 
!    numéro du fil (ThNum) et vérifie que les valeurs
!    contenues dans les vecteurs sont égales à ThNum. Sinon,
!    ajoute un à la variable memerrors. Le common block /cb1/
!    est partagé entre les fils.
!
! Langage : Fortran 95
! Auteur :  Carol Gauthier, CACPUS, Université de Sherbrooke
! Date :    septembre 2000
!****************************************************************
subroutine omp3sub1()
!****************************************************************
! Déclaration des variables
 
 integer ThNum,OMP_GET_THREAD_NUM
 integer i,memerrors,repetitions
 integer a1(1000),b1(1000)
 
 common /cb1/ a1,b1
 
!****************************************************************
 ThNum=OMP_GET_THREAD_NUM()
 
 memerrors=0
 do repetitions=1,5000
   do i=1,1000
    a1(i)=ThNum
    b1(i)=ThNum
   end do
   do i=1,1000
    if( (a1(i).ne.ThNum).or.(b1(i).ne.ThNum) )memerrors=memerrors+1
   end do
 end do
 
 write(6,*)ThNum,':',' memerrors=',memerrors
 
! Fin de la sous-routine
 end



Fichier : omp3sub2.f90
! Description :
!    Emplit 5000 fois les vecteurs a2 et b2 avec la valeur du 
!    numéro du fil (ThNum) et vérifie que les valeurs
!    contenues dans les vecteurs sont égales à ThNum. Sinon
!    ajoute un à la variable memerrors. Le common block /cb2/
!    est privé pour chaque fil, i.e. chaque fil en a une
!    copie.
!
! Langage : Fortran 95
! Auteur :  Carol Gauthier, CACPUS, Université de Sherbrooke
! Date :    septembre 2000
!****************************************************************
subroutine omp3sub2()
!****************************************************************
! Déclaration des variables
 
 integer ThNum,OMP_GET_THREAD_NUM
 integer i,memerrors,repetitions
 integer a2(1000),b2(1000)
 
 common /cb2/ a2,b2
 !$OMP THREADPRIVATE(/cb2/)
 
!****************************************************************
 
 ThNum=OMP_GET_THREAD_NUM()
 
 memerrors=0
 do repetitions=1,5000
   do i=1,1000
    a2(i)=ThNum
    b2(i)=ThNum
   end do
   do i=1,1000
    if( (a2(i).ne.ThNum).or.(b2(i).ne.ThNum) )memerrors=memerrors+1
   end do
 end do
 
 write(6,*)ThNum,':',' memerrors=',memerrors
 
! Fin de la sous-routine
 end



Fichier : omp3sub3.f90
! Description :
!    Écrit à l'ecran la valeur du premier élément des vecteurs
!    a3 et b3. Ces variables font partie du common block /cb3/
!    qui est privé pour chaque fil, i.e. chaque fil en a une
!    copie.
!
! Langage : Fortran 95
! Auteur :  Carol Gauthier, CACPUS, Université de Sherbrooke
! Date :    septembre 2000
!****************************************************************
subroutine omp3sub3()
!****************************************************************
! Déclaration des variables
 
 integer ThNum,OMP_GET_THREAD_NUM,i,memerrors
 integer a3(1000),b3(1000)
 
 common /cb3/ a3,b3
 !$OMP THREADPRIVATE(/cb3/)
 
!****************************************************************
 
 ThNum=OMP_GET_THREAD_NUM()
 
 ! Vérification de la valeur initiale
 write(6,*)ThNum,':', 'a3(1),b3(1) = ',a3(1),b3(1)
 
! Fin de la sous-routine
 end



Fichier : makefile
#####################################################
# makefile
 
FFLAGS= -qsmp=omp -bmaxdata:2000000000 -u
 
OBJS = omp3.o omp3sub1.o omp3sub2.o omp3sub3.o
 
 
omp1: $(OBJS)
	xlf95_r $(OBJS) $(FFLAGS) -o omp3
 
.f.o: 
	xlf95_r $(FFLAGS) -c $*.f
 
cl:
	rm -f $(OBJS) omp3


Outils personnels
Espaces de noms

Variantes
Actions
Navigation
Ressources de Calcul Québec
Outils
Partager