Fortran2008 で導入された DO CONCURRENT 命令のテスト。オプションとして並列化を Yes にし、かつ RELEASE MODE で実行する必要があります。関数副プログラムの方には PURE 属性をつけて依存性のないことを明示しておきました。(ELEMENTAL 属性もつけておきましたが、その機能はここで使っていません。)
なおオブジェクトは多重プロセスではなく、多重スレッドで動くようです。
実行結果
ウィルソンの定理によって、1から10^5までの整数の素数判定をして、素数を求めています。ウィルソンの定理とは、整数が素数である必要十分条件は である、というものです。なおウィルソンの定理は計算量が大きすぎて素数判定として実用性が無いとされています。
ソース・コード
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は別として。