好的,我很绝望。我对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
答案 0 :(得分:1)
好吧,对于任何感兴趣的人:问题似乎是我的ifort版本你不能在并行区域之外分配私有变量的大小。分割
$OMP PARALLEL DO
到
$OMP PARALLEL
和
$OMP DO
并在这些语句之间分配私有数组就可以了。