関連情報

ナビゲーション:前へ   上へ   次へ

7 経過時間計測

OpenMPを利用する最も大きな動機は処理時間の短縮です。 ここではOpenMPが用意している時間計測ルーチンを利用する方法を説明します。

OpenMP実行時ライブラリルーチンの一つに経過時間を測るための

double precision function omp_get_wtime()
が用意されています。この関数は過去のある時点からの経過時間を秒単位で返します。 この関数を用いて下記の例のように経過時間の計測が可能です。
use omp_lib
...
double precision st, en
...
st = omp_get_wtime()
 !この部分の処理時間を計測したい
en = omp_get_wtime()
print *, "Elapsed time in second is:", en-st
また下記のようにOpenMPの条件付きコンパイルを利用して、OpenMPを有効にした場合のみ時間計測をするように指定することも可能です。
!$ use omp_lib
...
!$ double precision st, en
...
!$ st = omp_get_wtime()
 !この部分の処理時間を計測したい
!$ en = omp_get_wtime()
!$ print *, "Elapsed time in second is:", en-st

7.1 ☆演習課題:経過時間計測

下記に示すプログラムをOpenMPの経過時間計測ルーチンを利用して処理時間を計測するように書き換えて下さい。 その後、実行時に環境変数OMP_NUM_THREADSの値を変えながら並列化の効果があったかどうかを確認して下さい。
[課題のコード]

program kadaiTime
  implicit none
  integer,parameter :: N = 1000*1000, M = 100
  integer i, j
  double precision,allocatable :: a(:)
  double precision x
  allocate(a(N))
!$omp parallel private(x)
!$omp do
  do i=1,N
    x = 0
    do j=1,M
      x = x + log(dble(i+j))
    end do
    a(i) = x/M
  end do
!$omp end do
!$omp end parallel
  print *, nint(sum(a))
end program
[実行例 - Windows]
> set OMP_NUM_THREADS=1
> kadaiTime.exe
 12816056
 Elapsed time :   3.4591840885113925

> set OMP_NUM_THREADS=2
> kadaiTime.exe
 12816056
 Elapsed time :   1.8074303853791207


[実行例 - UNIX(csh系)]
% setenv OMP_NUM_THREADS 1
% ./kadaiTime.exe
 12816056
 Elapsed time :   3.4591840885113925

% setenv OMP_NUM_THREADS 2
% ./kadaiTime.exe
 12816056
 Elapsed time :   1.8074303853791207
解答例:kadaiTime.f90


ナビゲーション:前へ   上へ   次へ

Results matter. Trust NAG.
Privacy Policy | Trademarks