Pregunta

OK, estoy desesperado. Soy relativamente nuevo en OMP y estoy teniendo muchos problemas con una paralelización aparentemente simple en Fortran. El código a continuación es la parte más pequeña de un código mucho más grande que produce este tipo de error. Todo este fragmento de fragmento está destinado a hacerlo, se lee las filas de una matriz compleja bidimensional compartida (que aquí he llenado con números arbitrarios) en instancias paralelas de una matriz privada de una dimensión (para un procesamiento paralelo adicional en el código terminado).

Uso de IFORT, una vez que se ha ejecutado el bucle durante aproximadamente 3000 valores del iterador J, el programa se bloquea con el error:

* glibc detectado * ./run.sh: munmap_chunk (): Puntero no válido: 0x00002ac9b47ffde0 ***

GFORRAN Por otro lado no produce errores, sino que produce todas las salidas sin sentido en el programa completado, lo que me lleva a creer que hay un error que Gffforte no está recogiendo. Todo funciona como debería en serial.

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

¿Fue útil?

Solución

De acuerdo, por lo que para cualquier persona que esté interesada: el problema parece haber sido que con mi versión de IFORT, los cannont asignan el tamaño de una variable privada fuera de la región paralela.Dividiendo el

$OMP PARALLEL DO 

en

$OMP PARALLEL 

y

$OMP DO 

y asignando la matriz privada entre estas afirmaciones hice el truco.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top