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 ステートメントに対して報告されます。1つの具体例として:

  • i が 2 の場合、ループは num(8) を false に設定します。

  • i が 4 の場合、ループは num(8) も false に設定します。

これは、同じメモリ位置へのループ書き込みの 2 つの異なる反復です。

(関連する Intel フォーラムは、コンパイラの動作の詳細について質問するのに適した場所です。)

于 2012-12-17T03:03:19.717 に答える