Я только что распараллелил рутину фортрана, которая имитирует поведение людей, и у меня были некоторые проблемы при генерации случайных чисел с помощью 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 для компиляции с make-файлом, который выглядит следующим образом:
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 итераций) он генерирует сумасшедшие числа за пару итераций, а затем снова работает в обычном режиме. Я не нашел никаких свидетельств того, когда происходит эта коррупция.
Есть идеи, почему это происходит?