何となく Blog by Jitta
Microsoft .NET 考

目次

Blog 利用状況
  • 投稿数 - 761
  • 記事 - 18
  • コメント - 37042
  • トラックバック - 222
ニュース
  • IE7以前では、表示がおかしい。div の解釈に問題があるようだ。
    IE8の場合は、「互換」表示を OFF にしてください。
  • 検索エンジンで来られた方へ:
    お望みの情報は見つかりましたか? よろしければ、コメント欄にどのような情報を探していたのか、ご記入ください。
It's ME!
  • はなおか じった
  • 世界遺産の近くに住んでます。
  • Microsoft MVP for Visual Developer ASP/ASP.NET 10, 2004 - 9, 2011
広告

記事カテゴリ

書庫

日記カテゴリ

ギャラリ

その他

わんくま同盟

同郷

 

Open MP は、C++ ではライブラリとプリプロセッサ指示によって使用する。プリプロセッサ指示は、「ディレクティブ」と、ディレクティブでの動作に細かな指示を出す「句」(富士通さんの日本語訳リファレンスでは、「指示節」と訳されている)に分かれる。

ディレクティブは、ディレクティブを置いた次の文に対してのみ有効となる。その為、curly bracket ('{', '}')でブロックを作る(ことが必要になる)場合が多い。


parallel ディレクティブが現れるまでは、シングル スレッドで動作する。う~ん?parallel ディレクティブが有効なブロックを抜けた後は、どうなる?…タスクマネージャが報告する「スレッド数」は、複数のまま。Win-API の WaitForSingleObject, WaitForMultiObject をするとスレッドは消える(終了する)が、Open MP のは終了しないらしい。が、次の parallel ディレクティブで、指定されているスレッドの数が異なると、その数にあわせて終了される、または生成される。おっと、Process Explorer で見ると、スレッドの数が変わるときは、マスター スレッド以外は全て作り直しているようだ(スレッド ID が変わる、変わらないで判断)。同じ時は、そのまま流用している。parallel ディレクティブで num_threads 句を使うより、omp_set_num_threads 関数を使って制御する方が良さそうだ。

parallel ディレクティブで作成されるスレッド数は、次の順番で決まる。

  1. num_threads 句が指定されていれば、その数。
  2. omp_set_num_threads 関数が実行されていれば、直前の実行で指定された数。
  3. 環境変数 OMP_NUM_THREADS が定義されていれば、その数。
  4. いずれでも決まらなければ、実装依存(VC++ の場合は、論理 CPU の数)。

なんだけど、omp_set_dynamic 関数、あるいは環境変数 OMP_DYNAMIC で指定する、スレッド数の自動調整機能の影響を受けるようだ。そして、MSDN ライブラリの説明は、TRUE/FALSE の説明が逆転しているような気がする。おいおい、関数と環境変数の優先順位も、なんだか矛盾していないか?

3.1.7 omp_set_dynamic 関数(OpenMP Reference)より:

dynamic_threads が 0 以外の値に評価される場合、以降の並列領域の実行に使用されるスレッド数は、システム リソースが最適に利用されるよう、ランタイム環境によって自動的に調整されます。結果として、開発者が指定するスレッド数が最大スレッド数になります。

え~っと、自動調整が有効になるから、開発者が指定するものではなく、システム リソースによって最大スレッド数が決まるんじゃないか?実際、omp_set_dynamic(0); をコールして、num_threads(10) とすると、10個のスレッドが上がる。omp_set_dynamic(1); をコールして、num_threads(10) としても、2個のスレッドしか上がらない。デフォルトがどっちかは、実装依存らしい。VC++ の場合は、FALSE。

3.1.7 omp_set_dynamic 関数(OpenMP Reference)より:

omp_set_dynamic の呼び出しは、OMP_DYNAMIC 環境変数より優先されます。

4.3 OMP_DYNAMIC(OpenMP Reference)より:

ただし、omp_set_dynamic ライブラリ ルーチンが呼び出されて、この動的調整機能が明示的に有効または無効に設定されている場合、こちらの方が優先されます。

環境変数 OMP_DYNAMIC の方の、「こちらの方が優先されます」という書き方がおかしいのか。「こちら」が、環境変数を指しているのか、関数を指しているのか、わかりにくい。「omp_set_dynamic ライブラリ ルーチンの方が優先されます。」なんだろうな、きっと。OpenMP の仕様書に、スレッド数を決める実際のアルゴリズムがあってそこに出てくるけど、他のことがわかってないと読みにくいのでまた今度。


ところで。私は明示的にスレッドを扱うプログラムは、1度しか書いたことがない。OpenMP も、当時からあったみたいだけれど、最近まで知らなかった。知らないことを付け焼き刃な知識で書くと、失敗する。なので、再勉強中。え?遅い?勘弁してくださいorz

投稿日時 : 2010年8月5日 22:41
コメント
No comments posted yet.
タイトル
名前
Url
コメント