在FORTRAN(ifort)中使用OMP将数组读入私有变量

时间:2014-02-26 14:11:45

标签: arrays parallel-processing fortran openmp intel-fortran

好的,我很绝望。我对OMP比较陌生,并且在fortran中看似简单的并行化方面遇到了很多问题。下面的代码是产生此类错误的更大代码的最小部分。所有这些片段都是这样做的,将共享的二维复杂数组(这里我用任意数字填充)的行读入私有一维数组的并行实例(用于在完成的代码中进一步并行处理)。

使用ifort,一旦为迭代器j的大约3000个值执行了循环,程序就会崩溃并出现错误:

*检测到glibc * ./run.sh:munmap_chunk():指针无效:0x00002ac9b47ffde0 ***

另一方面,gfortran没有产生任何错误,但在完成的程序中产生了所有无意义的输出,这使我相信gfortran没有发现错误。一切都按顺序工作。

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

1 个答案:

答案 0 :(得分:1)

好吧,对于任何感兴趣的人:问题似乎是我的ifort版本你不能在并行区域之外分配私有变量的大小。分割

$OMP PARALLEL DO 

$OMP PARALLEL 

$OMP DO 

并在这些语句之间分配私有数组就可以了。