Повреждение данных при потоковой передаче Векторной статистической библиотеки-Math Kernel Library

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

  •  21-08-2019
  •  | 
  •  

Вопрос

Я только что распараллелил процедуру fortran, которая имитирует поведение отдельных пользователей, и у меня возникли некоторые проблемы при генерации случайных чисел с помощью Vector Statistical Library (библиотека из библиотеки Math Kernel Library).Структура программы следующая:

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

Я использую компилятор Intel Fortran для компиляции с makefile, который выглядит следующим образом:

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

Во время компиляции все работает нормально.Когда я запускаю свою программу, генерирующую переменные с его помощью, кажется, что все работает нормально.Однако время от времени (скажем, раз в 200-500 итераций) он генерирует сумасшедшие числа в течение пары итераций, а затем снова запускается обычным способом.Я не нашел никаких указаний на то, когда происходит эта коррупция.

Есть какие-нибудь идеи о том, почему это происходит?

Это было полезно?

Решение 2

У меня есть решение!Я изменял псевдослучайные числа, сгенерированные некоторыми значениями, взятыми из файла.Время от времени несколько потоков пытались прочитать один и тот же файл и приводили к повреждению.Чтобы решить эту проблему, я добавил критический раздел omp, и это сработало.

Другие советы

Код случайного числа либо использует глобальную переменную внутри, либо все потоки используют один и тот же генератор.В конце концов, два потока попытаются обновить один и тот же фрагмент памяти одновременно, и результат будет непредсказуемым.

Таким образом, вы должны выделить по одному генератору случайных чисел на поток.

Решение:Защитите вызов случайной процедуры с помощью семафора / блокировки.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top