ifort가이 코드를 병렬 처리하지 않는 이유는 무엇입니까? "루프가 병렬화되지 않았습니다 : 병렬 종속성이 있음"을 계속 말합니다. 의존성이 어디인지 나는 이해할 수 없다. gfortran은 병렬 코드를 생성하지만 속도는 그다지 높지 않습니다.ifort 병렬 코드가 아닙니다.
PROGRAM erat
IMPLICIT NONE
INTEGER*8 :: i, rm, sn=1000000000
LOGICAL*1 , ALLOCATABLE, DIMENSION(:) :: nums
rm = INT(DBLE(sn)**0.5) + 1
ALLOCATE(nums(sn))
nums = .TRUE. !This line not parallelized
PRINT *, 'Doing initial sieve...'
nums(1) = .FALSE.
DO i = 2,rm
nums(i**2:sn:i) = .FALSE. !This line not parallelized
END DO
END PROGRAM erat
당신이 이런 식으로 parallelise 수는 없지만, 그래도 마스크 작업을 수행 할 수 있습니다 'forall (j = i ** 2 : sn : i, nums (j)) nums (j) = .FALSE.' 또는'do concurrent '로 할당 할 수 있습니다. 이 방법은 외부 루프의 각 단계를 수행 할 때 더 작은 인덱스 집합이 있으므로 조금 더 빠릅니다. – sigma
고마워요, 이것이 메인도 루프 안에 들어가겠습니까? –
실제로,'num (i ** 2 : sn : i) = .FALSE.' 대신에. – sigma