ナビゲーション:前へ 上へ 次へ
ナビゲーション:前へ 上へ 次へ
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
ナビゲーション:前へ 上へ 次へ
