好的,我很絕望。我對OMP相對比較陌生,在fortran中看似簡單的並行化有很多問題。下面的代碼是產生這種錯誤的更大代碼中的最小部分。所有這些代碼片段都是爲了將一個共享的二維複雜數組(這裏我已經填充了任意數字)的行讀入私有一維數組的並行實例(用於完成代碼中的進一步並行處理)。在FORTRAN中使用OMP將數組讀入私有變量(ifort)
使用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
道歉,我編譯了代碼,但後來因爲愚蠢的原因編輯了我的這篇文章 – Ziegl
我的測試沒有在編輯之後的版本中顯示任何兩個編譯器(非常新的版本)中的任何問題。 –
你能告訴我你使用的編譯器的版本嗎?我正在使用ifort 12.1.4和gfortran 4.4.7 – Ziegl