la corruzione dei dati quando si infila vettore di statistica Biblioteca-Math Kernel Library

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

  •  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?

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top