2014-02-26 2 views
1

좋아, 필사적이다. 나는 OMP에 비교적 익숙하지 않으며 포트란에서 겉으로보기에는 단순한 병렬 처리로 많은 문제를 겪고있다. 아래 코드는 이러한 종류의 오류를 생성하는 훨씬 큰 코드의 가장 작은 부분입니다. 이 스 니펫은 공유 된 2 차원 복합 배열 (여기서는 임의 숫자로 채워짐)의 행을 개인 차원 배열 (병렬 코드로 처리하기 위해)의 병렬 인스턴스로 읽는 것입니다.FORTRAN (ifort)에서 OMP를 사용하여 개인 변수로 배열 읽기

* glibc는 검출 * ./run.sh : munmap_chunk() 루프가 반복자 J 대략 3000 값으로 실행 된 후에

, ifort를 사용하여, 프로그램은 오류 충돌 무효 포인터 : 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

좋아는 관심이 누구를위한 있도록 : 문제는 병렬 영역 외부에서 전용 변수의 크기를 할당 cannont ifort의 내 버전 것을 것처럼 보인다.

$OMP PARALLEL 

$OMP DO 

$OMP PARALLEL DO 

을 분할하고 이러한 진술은 속임수를 썼는지 inbetween 민간 배열을 할당.

+0

할당 가능한 개인 배열은 OpenMP 3.0의 기능으로, 그 이유가 될 수있다. http://pic.dhe.ibm.com/infocenter/lnxpcomp/v121v141/index.jsp?topic=%2Fcom.ibm.xlf141.linux.doc%2Fgetstart%2Fomp3.html –