2012-12-17 20 views
0

爲什麼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 
+0

即使你不能parallelise這種方式,你仍然可以做一個蒙面賦值爲'forall(j = i ** 2:sn:i,nums(j))nums(j)= .FALSE.'或'do concurrent'。這樣做應該會更快一些,因爲在外部循環的每一步之後都會有一小組索引要經過。 – sigma

+0

謝謝,這會進入主do循環嗎? –

+0

確實,而不是'nums(i ** 2:sn:i)= .FALSE.'。 – sigma

回答

3

該診斷報告針對DO語句。作爲一個具體示例:

  • 當i是2時,循環將num(8)設置爲false。

  • 當我是4時,循環還將num(8)設置爲false。

這是循環寫入同一內​​存位置的兩個不同的迭代。

(有關英特爾論壇是一個更好的地方,要求可能進入他們的編譯器的行爲的細節問題。)

+0

由於它們都寫入相同的值,而不讀取值,因此不會發生併發性問題嗎? –

+0

我懷疑(我不知道)是否涉及依賴性分析器處理之外的詳細考慮/詳細程度。 (同樣,可以認爲編譯器需要做的就是吐出與打印語句相關的代碼,因爲這是您的示例唯一可見的效果,但該分析也超出了它。) – IanH

+0

多個併發寫入到相同的位置 - 即使是相同的值 - 給出未定義的行爲,編譯器是正確的,以避免它。 –