ナビゲーション:前へ 上へ 次へ
ナビゲーション:前へ 上へ 次へ
11 single指示構文
並列領域内での入出力など、ひとつのスレッドで処理を行いたい場合にはsingle指示構文が利用可能です。single指示構文は以下の書式を持ちます。
!$omp single [指示節[[,] 指示節] ...] 構造化ブロック !$omp end single [終端指示節[[,] 終端指示節] ...]
- single指示構文で指定される構造化ブロックはひとつのスレッドで処理が行われます。
- 指示節にはprivate及びfirstprivateが指定可能です。
- 終端指示節にはnowait(後述のセクションにて説明)が指定可能です。(その他にも本ドキュメントで説明をしないcopyprivateが指定可能)
- single指示構文の最後で同期が行われます。(終端指示節にnowaitを指定した場合は別)
以下に参考図を示します。
以下にsingle指示構文を用いたコード例及び実行例を示します。
program exampleSingle use omp_lib implicit none !$omp parallel !$omp single print *, "IN SINGLE: My Thread Number is ", omp_get_thread_num() !$omp end single print *, "NOT IN SINGLE: My Thread Number is ", omp_get_thread_num() !$omp end parallel end program [4スレッドで実行した場合の例] IN SINGLE: My Thread Number is 1 NOT IN SINGLE: My Thread Number is 0 NOT IN SINGLE: My Thread Number is 3 NOT IN SINGLE: My Thread Number is 1 NOT IN SINGLE: My Thread Number is 2強調文字で示されたSINGLE指示構文内の処理は並列領域内であっても一つのスレッドにより実行されます。
11.1 ☆演習課題:single指示構文
下記に示すプログラムで途中経過のメッセージ(1st phase done...)が複数回表示されてしまいます。 single指示構文を用いて途中経過のメッセージが一回だけ表示されるように書き換えて下さい。[課題のコード] program kadaiSingle implicit none integer,parameter :: N = 1000*1000 integer i double precision total double precision,allocatable :: a(:) allocate( a(N) ) print *, "Starting..." !$omp parallel !$omp do do i=1, N a(i) = i end do !$omp end do total = sum(a) print *, "1st phase done..." !$omp do do i=1,N a(i) = a(i)/total end do !$omp end do !$omp end parallel print *, "All done... Check value =", sum(a) end program
[現状のまま4スレッドで実行した場合の実行例] Starting... 1st phase done... 1st phase done... 1st phase done... 1st phase done... All done... Check value = 1.0000000000000002 [書き換え後に4スレッドで実行した場合の実行例] Starting... 1st phase done... All done... Check value = 1.0000000000000002解答例:kadaiSingle.f90
ナビゲーション:前へ 上へ 次へ