병렬 처리의 정확성을 테스트하는 간단한 코드를 작성했습니다. 호출 할 서브 루틴은-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에 대해 올바르지 않습니다. 단지 일부만 정확합니다.
왜 ?? 나는 포트란과 병렬 컴퓨팅을 처음 사용한다. 대답 외에, 더 완벽한 개념 교육을 포함하는 병렬을위한 훌륭한 튜토리얼 문서는 매우 유용 할 것입니다. 많은 감사.
의 끝에서
PRIVATE(i,j)
을 추가합니다. 나는 잘못 기억하고있을 수 있지만,'사생활 (j)'은 충분해야합니다. –충분해야하지만 일반적으로 명시 적으로 지정하는 것을 선호합니다. 이 절차로 gfortran 또는 ifort에 어떤 오류도 없었습니다. –