2017-11-16 8 views
0

병렬 처리의 정확성을 테스트하는 간단한 코드를 작성했습니다. 호출 할 서브 루틴은-fopenmp가 지정된 쓰레드로 컴파일 된 gfortran과 평행하지 않습니다.

SUBROUTINE two_pt_fn() 
IMPLICIT NONE 
INTEGER :: i,j 
!$OMP PARALLEL DO 
DO i=1,10 
j=i*2 
WRITE(*,*)i,j 
END DO 
!$OMP END PARALLEL DO 
END SUBROUTINE 

주요 프로그램은 단순히 위의 서브 루틴을 호출하고 코드가

gfortran -fopenmp -o m.x sb_two_pt_fn.f90 main.f90 
export OMP_NUM_THREADS=10 

./m.x 

주는 실행의 결과로 컴파일 소스입니다

 7   20 
     8   16 
     9   18 
     1   18 
     2   4 
     10   6 
     4   6 
     5   10 
     6   12 
     3   12 

루프 인덱스 i에 2를 곱하면 되겠지만 결과는 모든 i에 대해 올바르지 않습니다. 단지 일부만 정확합니다.

왜 ?? 나는 포트란과 병렬 컴퓨팅을 처음 사용한다. 대답 외에, 더 완벽한 개념 교육을 포함하는 병렬을위한 훌륭한 튜토리얼 문서는 매우 유용 할 것입니다. 많은 감사.

답변

1

openmp 섹션에 j에 대한 "private"절이 누락되었습니다. 루프 변수이므로 기본적으로 private입니다.

j가 비공개가 아니기 때문에 여러 스레드가 동시에 값을 설정하거나 인쇄용으로 사용하려고 시도하므로 일관성없는 결과가 발생합니다.

해결 방법 : 나는 그것의 같은 루프 변수가 명시 적으로 개인 만들려고하면 내가 절대적으로 그렇다 불만을 얻을 인스턴스를 한 것 같아요 라인 !$OMP PARALLEL DO

+0

의 끝에서 PRIVATE(i,j)을 추가합니다. 나는 잘못 기억하고있을 수 있지만,'사생활 (j)'은 충분해야합니다. –

+0

충분해야하지만 일반적으로 명시 적으로 지정하는 것을 선호합니다. 이 절차로 gfortran 또는 ifort에 어떤 오류도 없었습니다. –