fortran66のブログ

fortran について書きます。

pi

Intel Fortran の co-array Fortran 機能はまだ試験的なもので性能的に糞らしいですが、ちょっと遊んでみます。

現在の co-array 規格では、リダクション系の命令が入っていないので、自分で定義する必要があります。Fortran自然数は1から始まるので、イメージ番号も1から始まります。

関係ないんですが、Fortran2008 規格には block..end block 命令による、ALGOL 式の block 構造が導入されたのですが、Intel Fortran ではまだ実装されていないので残念です。gfortran や NAG Fortran には、入っているようなので早く入れてほしいデス。block 構造では use 文も使えるようなので、かなり独立性の高い構造ができるようです。

実行結果



ソース・プログラム

    program monte_carlo
      implicit none
      integer, parameter :: n = 10**7
      real :: x(n)[*], y(n)[*], pi[*]
      call random_seed()
      call random_number(x)
      call random_number(y)
      pi = 4.0 * count(x**2 + y**2 < 1.0) / real(n)
      print *, this_image(), ':', pi
      sync all
      if (this_image() == 1) print *, 'pi = ', co_sum(pi) / num_images()
      stop

    contains
    
      real function co_sum(x)
        real, intent(in) :: x[*]
        integer :: i
        if (this_image() == 1) then 
          co_sum = 0.0
          do i = 1, num_images()
            co_sum = co_sum + x[i]
          end do
        end if
        return
      end function co_sum  
    
    end program monte_carlo