la corruzione dei dati quando si infila vettore di statistica Biblioteca-Math Kernel Library
-
21-08-2019 - |
Domanda
Ho appena parallelizzato una routine FORTRAN che simula il comportamento individui e ho avuto qualche problema durante la generazione di numeri casuali con il vettore di statistica Library (una libreria dalla libreria Math Kernel). La struttura del programma è il seguente:
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
Io uso l'Intel Fortran Compiler per la compilazione di un makefile che appare come segue:
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
Al momento della compilazione tutto funziona bene. Quando eseguo le mie variabili di generazione di programma con esso, tutto sembra funzionare bene. Tuttavia, di tanto in tanto (diciamo una volta ogni 200-500 iterazioni), genera numeri folli per un paio di iterazioni e poi corre di nuovo in modo normale. Non ho trovato alcun patern a quando accade questa corruzione.
Qualche idea sul perché sta accadendo?
Soluzione 2
Ho la soluzione! Mi stava modificando i numeri pseudo casuali generati da alcuni valori assunti da un file. Di tanto in tanto, più di un thread ha tentato di leggere lo stesso file e ha generato la corruzione. Per risolvere questo problema, ho aggiunto una sezione critica omp e ha funzionato.
Altri suggerimenti
Il codice di numeri casuali utilizza o una variabile globale internamente o tutte le discussioni utilizzare lo stesso generatore. Alla fine, due fili cercheranno di aggiornare la stessa porzione di memoria allo stesso tempo e il risultato sarà non prevedibile.
Quindi, è necessario allocare un generatore di numeri casuali per ogni thread.
Soluzione:. Proteggere la chiamata alla routine casuali con un semaforo / lock