2012-12-17 3 views
0

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 
+0

당신이 이런 식으로 parallelise 수는 없지만, 그래도 마스크 작업을 수행 할 수 있습니다 'forall (j = i ** 2 : sn : i, nums (j)) nums (j) = .FALSE.' 또는'do concurrent '로 할당 할 수 있습니다. 이 방법은 외부 루프의 각 단계를 수행 할 때 더 작은 인덱스 집합이 있으므로 조금 더 빠릅니다. – sigma

+0

고마워요, 이것이 메인도 루프 안에 들어가겠습니까? –

+0

실제로,'num (i ** 2 : sn : i) = .FALSE.' 대신에. – sigma

답변

3

해당 진단은 DO 문에 대해보고됩니다. 하나의 구체적인 예로 :

  • i가 2 일 때 루프는 num (8)을 false로 설정합니다.

  • i가 4 일 때 루프는 num (8)도 false로 설정합니다.

동일한 메모리 위치에 대한 루프 쓰기의 두 가지 다른 반복 작업입니다.

(관련 인텔 포럼은 컴파일러의 행동의 특성에 얻을 수있는 질문을 할 수있는 좋은 장소입니다.)

+0

그들은 모두 같은 값을 쓰고 값을 읽지 않기 때문에 동시성이 문제가되지 않을까요? –

+0

나는 의존성 분석기가 다루는 것 이상의 고려 사항/세부 수준으로 들어가는 것으로 의심된다 (나는 모른다). (비슷하게, 컴파일러가해야 할 일은 print 문과 관련된 코드를 뱉어내는 것 뿐이라고 주장 할 수 있습니다. 왜냐하면 이것이 여러분의 예제에서 볼 수있는 유일한 효과이기 때문입니다. – IanH

+0

여러 동시 쓰기 같은 위치에 - 심지어 같은 값 - 정의되지 않은 동작을 제공하고 컴파일러는 그것을 피하기 위해 정확합니다. –

관련 문제