좋아, 필사적이다. 나는 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
죄송합니다. 코드를 컴파일했지만 어리 석음 때문에이 게시물을 편집했습니다. – Ziegl
내 테스트는 편집 후 두 컴파일러 (최신 버전)에서 문제를 나타내지 않았습니다. –
사용중인 컴파일러의 버전을 알려주시겠습니까? 나는 ifort 12.1.4와 gfortran 4.4.7을 사용하고있다. – Ziegl