2014-02-26 40 views
1

好的,我很絕望。我對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 
+0

道歉,我編譯了代碼,但後來因爲愚蠢的原因編輯了我的這篇文章 – Ziegl

+0

我的測試沒有在編輯之後的版本中顯示任何兩個編譯器(非常新的版本)中的任何問題。 –

+0

你能告訴我你使用的編譯器的版本嗎?我正在使用ifort 12.1.4和gfortran 4.4.7 – Ziegl

回答

1

好了,這樣的人誰是感興趣的是:這個問題似乎是與我的版本的ifort你cannont分配一個私有變量的大小並行區域之外。拆分

$OMP PARALLEL DO 

$OMP PARALLEL 

$OMP DO 

和分配專有陣列其間的這些語句的伎倆。

+0

Allocatable專用陣列是OpenMP 3.0的功能,這可能是原因。 http://pic.dhe.ibm.com/infocenter/lnxpcomp/v121v141/index.jsp?topic=%2Fcom.ibm.xlf141.linux.doc%2Fgetstart%2Fomp3.html –