0

为什么 ifort 不并行化这段代码?它一直说“循环未并行化:存在并行依赖”。我不明白依赖在哪里。gfortran 会生成并行代码,但速度提升不是很高。

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
4

1 回答 1

3

根据 DO 语句报告该诊断。作为一个具体的例子:

  • 当 i 为 2 时,循环将 num(8) 设置为 false。

  • 当 i 为 4 时,循环还将 num(8) 设置为 false。

这是写入同一内​​存位置的循环的两次不同迭代。

(相关的英特尔论坛是提出可能涉及其编译器行为细节的问题的更好场所。)

于 2012-12-17T03:03:19.717 回答