fortran66のブログ

fortran について書きます。

DO CONCURRENT

Fortran2008 で導入された DO CONCURRENT 命令のテスト。オプションとして並列化を Yes にし、かつ RELEASE MODE で実行する必要があります。関数副プログラムの方には PURE 属性をつけて依存性のないことを明示しておきました。(ELEMENTAL 属性もつけておきましたが、その機能はここで使っていません。)
なおオブジェクトは多重プロセスではなく、多重スレッドで動くようです。

実行結果

ウィルソンの定理によって、1から10^5までの整数の素数判定をして、素数を求めています。ウィルソンの定理とは、整数p素数である必要十分条件(p-1)!\,\,{\mathrm mod}\,\, p \equiv -1 である、というものです。なおウィルソンの定理は計算量が大きすぎて素数判定として実用性が無いとされています。

ソース・コード

MODULE m_wilson
    IMPLICIT NONE
  CONTAINS
    INTEGER PURE ELEMENTAL FUNCTION isp_wilson(k) ! is prime wilson's theorem: if prime then -1 
        INTEGER, INTENT(IN) :: k
        INTEGER :: i
        INTEGER(8) :: m
        m = 1
        DO i = 1, k - 1
         m = MOD(m * i, k) 
        END DO
        isp_wilson = m - k
        RETURN
    END FUNCTION isp_wilson 
END MODULE m_wilson

PROGRAM test
    USE m_wilson
    IMPLICIT NONE
    INTEGER, PARAMETER :: np = 10**5 !45000 ! max?
    INTEGER :: lp(np)
    INTEGER :: i
    DO CONCURRENT (i = 1:np)
     lp(i) = isp_wilson(i)     
    END DO
    DO i = 1, np
     IF (lp(i) == -1) PRINT *, i
    END DO
    PRINT *
    PRINT *, 'No. of primes =', COUNT(lp == -1)
    STOP
END PROGRAM test 

偶数ぐらいは飛ばした方が良かったかも。 DO CONCURRENT (i = 1:np:2)でおk。2は別として。