La corrupción de datos cuando esté pasando el vector de Estadística Biblioteca-Math Kernel Library

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

  •  21-08-2019
  •  | 
  •  

Pregunta

acabo de parallelized una rutina de FORTRAN que simula el comportamiento de los individuos y he tenido algunos problemas al generar números aleatorios con Biblioteca de Estadística vectorial (una biblioteca de la biblioteca Math Kernel). La estructura del programa es la siguiente:

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

Yo uso Compilador Intel Fortran para la compilación con un makefile que se ve de la siguiente manera:

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

En tiempo de compilación todo funciona bien. Cuando ejecuto mi variables de generación de programa con ella, todo parece funcionar bien. Sin embargo, de vez en cuando (digamos una vez cada 200-500 iteraciones), que genera números locos por un par de iteraciones y luego se vuelve a ejecutar de una manera normal. No he encontrado ninguna patern que cuando sucede esto la corrupción.

¿Alguna idea de por qué está sucediendo?

¿Fue útil?

Solución 2

Me dio la solución! I estaba modificando los números pseudo-aleatorios generados por algunos valores tomados de un archivo. De vez en cuando, más de un subproceso intentó leer el mismo archivo y genera la corrupción. Para solucionar esto, he añadido una sección crítica omp y funcionó.

Otros consejos

El código de números aleatorios o bien se utiliza una variable global interna o todas las discusiones utilizar el mismo generador. Eventualmente, dos hilos se tratan de actualizar la misma pieza de la memoria al mismo tiempo y el resultado será no predecible.

Por lo que debe asignársele un generador de números aleatorios por hilo.

Solución:. Proteger a la llamada a la rutina aleatoria con un semáforo / bloqueo

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top