爲什麼ifort不能並行化這段代碼? 它一直說「循環不平行:平行依賴的存在」。我無法理解依賴性在哪裏。 gfortran將生成並行代碼,但加速並不是很高。ifort not parallelizing code
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
謝謝,這會進入主do循環嗎? –
確實,而不是'nums(i ** 2:sn:i)= .FALSE.'。 – sigma