La corruption de données lorsque vous enfilez Library-Math Kernel Library statistique Vecteur

StackOverflow https://stackoverflow.com/questions/677273

  •  21-08-2019
  •  | 
  •  

Question

Je viens de paralléliser une routine Fortran qui simule le comportement des individus et j'ai eu quelques problèmes lors de la génération des nombres aléatoires avec la bibliothèque statistique Vecteur (une bibliothèque de la bibliothèque du noyau Math). La structure du programme est le suivant:

program example
...
!$omp parallel do num_threads(proc) default(none) private(...) shared(...)
do i=1,n
call firstroutine(...)
enddo
!$omp end parallel do
...
end program example

subroutine firstroutine
...
call secondroutine(...)
...
end subroutine

subroutine secondroutine
...
VSL calls
...
end subroutine

J'utilise le processeur Intel Fortran Compiler pour la compilation avec un makefile qui se présente comme suit:

f90comp = ifort
libdir = /home
mklpath = /opt/intel/mkl/10.0.5.025/lib/32/
mklinclude = /opt/intel/mkl/10.0.5.025/include/
exec: Example.o Firstroutine.o Secondroutine.o
      $(f90comp) -O3 -fpscomp logicals -openmp -o  aaa -L$(mklpath) -I$(mklinclude) Example.o -lmkl_ia32 -lguide -lpthread
Example.o: $(libdir)Example.f90
       $(f90comp) -O3 -fpscomp logicals -openmp -c $(libdir)Example.f90
Firstroutine.o: $(libdir)Firstroutine.f90
       $(f90comp) -O3 -fpscomp logicals -openmp -c $(libdir)Firstroutine.f90
Secondroutine.o: $(libdir)Secondroutine.f90
       $(f90comp) -O3 -fpscomp logicals -openmp -c -L$(mklpath) -I$(mklinclude) $(libdir)Secondroutine.f90  -lmkl_ia32 -lguide -lpthread

A tout moment de la compilation fonctionne très bien. Quand je lance mes variables de génération de programme avec elle, tout semble bien fonctionner. Cependant, de temps en temps (disons une fois tous les 200-500 itérations), il génère des nombres fous pour un couple d'itérations puis exécute à nouveau d'une manière normale. Je ne l'ai pas trouvé de Patern quand cette corruption ne se produise.

Toute idée pourquoi est-il passe?

Était-ce utile?

La solution 2

Je suis la solution! Je modifiait les nombres pseudo-aléatoires générés par des valeurs prises à partir d'un fichier. De temps en temps, plus d'un fil essayé de lire le même fichier et a généré la corruption. Pour résoudre ce problème, j'ai ajouté une OMP section critique et cela a fonctionné.

Autres conseils

Le code de nombres aléatoires est soit en utilisant une variable globale interne ou toutes les discussions utiliser le même générateur. Finalement, deux fils vont essayer de mettre à jour le même morceau de mémoire en même temps et le résultat sera non prévisible.

Vous devez allouer un générateur de nombres aléatoires par thread.

Solution:. Protéger l'appel à la routine aléatoire avec un sémaphores / lock

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top