OpenMP 入門

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

11 single指示構文

並列領域内での入出力など、ひとつのスレッドで処理を行いたい場合にはsingle指示構文が利用可能です。

single指示構文は以下の書式を持ちます。

!$omp single [指示節[[,] 指示節] ...]
  構造化ブロック
!$omp end single [終端指示節[[,] 終端指示節] ...]
  • single指示構文で指定される構造化ブロックはひとつのスレッドで処理が行われます。
  • 指示節にはprivate及びfirstprivateが指定可能です。
  • 終端指示節にはnowait(後述のセクションにて説明)が指定可能です。(その他にも本ドキュメントで説明をしないcopyprivateが指定可能)
  • single指示構文の最後で同期が行われます。(終端指示節にnowaitを指定した場合は別)

以下に参考図を示します。

SingleDirective

以下に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


ナビゲーション:前へ   上へ   次へ
関連情報
ご案内
© 日本ニューメリカルアルゴリズムズグループ株式会社 2025
Privacy Policy  /  Trademarks