fortran66のブログ

fortran について書きます。

MPI2

MPI2がでて、Fortran90でも書けるようになったようなので、しばらくぶりにMPIいじってみました。
(しかし64Bit版には相変わらずINCLUDEファイルしかない・・・)*1

Gropp et al. "Using MPI" の最初のサンプルをより Fortran90 風に書き直し。

PROGRAM test
USE mpi
IMPLICIT NONE
INTEGER, PARAMETER :: kd = SELECTED_REAL_KIND(13)    ! DBLE
REAL(kd), PARAMETER :: PI25DT = 3.141592653589793238462643_kd
REAL(kd) :: pi_mine, pi, h, sum, x
INTEGER :: n, myid, numprocs, i, ierr
CALL MPI_INIT(ierr)
CALL MPI_COMM_RANK(MPI_COMM_WORLD, myid    , ierr)
CALL MPI_COMM_SIZE(MPI_COMM_WORLD, numprocs, ierr)

DO
 IF (myid == 0) THEN
  PRINT *, 'Enter the number of intervals: (0 quits) '
  READ  *, n 
 END IF

 CALL MPI_BCAST(n, 1, MPI_INTEGER, 0, MPI_COMM_WORLD, ierr)

 IF (n <= 0) EXIT
 h = 1.0_kd / n
 sum = 0.0_kd
 DO i = myid + 1, n, numprocs
  x = h * (REAL(i, kd) - 0.5_kd)
  sum = sum + f(x)
 END DO
 pi_mine = h * sum
 
 CALL MPI_REDUCE(pi_mine, pi, 1, MPI_DOUBLE_PRECISION, MPI_SUM, 0, MPI_COMM_WORLD, ierr)
 
 IF (myid == 0) PRINT *, 'pi is ', pi, ' Error is', ABS(pi - PI25DT)
END DO 

CALL MPI_FINALIZE(ierr)
STOP
CONTAINS
!------------------------------------
REAL(kd) FUNCTION f(a)
REAL(kd), INTENT(IN) :: a
f = 4.0_kd / (1.0_kd + a * a)
RETURN
END FUNCTION f
!------------------------------------
END PROGRAM test

実行結果


備忘のメモ。

  • Path C:\Program Files\MPICH2\bin\
  • Project->Properties->Linker->Input->Additional Files => fmpich2.lib
  • Tools->Option->Intel Visual Fortran->Compiler->Library=>C:\Program Files\MPICH2\lib
  • Tools->Option->Intel Visual Fortran->Compiler->Include=>C:\Program Files\MPICH2\include
  • Vistaでは手動で smpd -install で Windows のサービスを起動する必要あり?
  • VistaではDOS窓を管理者権限で開く必要あり。


*1:自分でソースからコンパイルすれば可。