Lendo array em variável privada usando OMP em FORTRAN (ifort)
-
21-12-2019 - |
Pergunta
Ok, estou desesperado.Sou relativamente novo no OMP e estou tendo muitos problemas com uma paralelização aparentemente simples em Fortran.O código abaixo é a menor parte de um código muito maior que produz esse tipo de erro.Tudo o que esse trecho pretende fazer é ler as linhas de uma matriz complexa bidimensional compartilhada (que aqui preenchi com números arbitrários) em instâncias paralelas de uma matriz unidimensional privada (para processamento paralelo adicional no código finalizado).
Usando ifort, uma vez que o loop foi executado para aproximadamente 3.000 valores do iterador j, o programa trava com o erro:
*glibc detectado* ./run.sh:munmap_chunk():ponteiro inválido:0x00002ac9b47ffde0***
O gfortran, por outro lado, não produz erros, mas produz resultados sem sentido no programa concluído, o que me leva a acreditar que há um erro que o gfortran não está detectando.Tudo funciona como deveria em série.
PROGRAM partest
implicit none
INTERFACE
INTEGER FUNCTION OMP_GET_THREAD_NUM()
END FUNCTION
END INTERFACE
INTEGER :: i,j,npot,N,nproc
COMPLEX *16, ALLOCATABLE :: temp_wv(:,:),tv(:)
N=4096
npot=140
ALLOCATE(temp_wv(N,npot),tv(npot))
print *, "assign random values to array"
DO i=1,N
DO j=1,npot
temp_wv(i,j)=exp(dcmplx(0,i+j))
ENDDO
ENDDO
print *,"parallel region"
!$OMP PARALLEL DO &
!$OMP DEFAULT(NONE) &
!$OMP PRIVATE(tv,nproc) &
!$OMP SHARED(temp_wv,N,npot)
DO j=1,N
nproc=OMP_GET_THREAD_NUM()
print*, "THREAD", nproc, "ITERATOR", j,N
tv=temp_wv(j,:)
ENDDO
!$OMP END PARALLEL DO
print *, "DONE"
END PROGRAM partest
Solução
Ok, então para quem estiver interessado:o problema parece ser que com a minha versão do ifort você não pode alocar o tamanho de uma variável privada fora da região paralela.Dividindo o
$OMP PARALLEL DO
em
$OMP PARALLEL
e
$OMP DO
e alocar o array privado entre essas instruções resolveu o problema.