У меня проблема со следующим кодом на фортране. Я просто хочу перенести 4-мерный массив в 3-й и не могу изменить порядок циклов по другим причинам. Я хочу, чтобы 3 внутренних цикла были параллелями только в среде OpenMP.
PROGRAM TEST
USE ISO_FORTRAN_ENV
IMPLICIT NONE
INTEGER(INT32), SAVE :: ii,i,j,k,lx,ly,lz
REAL(REAL64),DIMENSION(:,:,:,:),ALLOCATABLE,SAVE :: tab4
REAL(REAL64),DIMENSION( :,:,:),ALLOCATABLE,SAVE :: tab3
ALLOCATE(...)
CALL INITIALIZE_TO_ZERO_ALL_TABS
$OMP PARALLEL
DO ii=1,6
!$OMP DO SCHEDULE(RUNTIME)
DO k=0,lz-1
DO j=0,ly-1
DO i=0,lx-1 !<-- flagged error lign
tab3(i,j,k) = tab4(ii,i,j,k)
END DO
END DO
END DO
!$OMP END DO
CALL SOME_SUBROUTINE(tab3)
END DO
!$OMP END PARALLEL
END PROGRAM TEST
Компиляция в порядке. Но во время выполнения появляется следующее сообщение об ошибке: «Ошибка времени выполнения Fortran: переменная цикла была изменена» * .
Кажется, что существует проблема между ii, которая появляется в tab4 (ii, i, j, k), и OpenMP. Для информации, эта проблема исчезает, когда я компилирую без -fopenmp.
У вас есть представление о том, что происходит в этих простых вложенных циклах?