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