ページ 11

OpenMPに詳しい方にお願い致します

Posted: 2011年2月21日(月) 10:27
by ミドリ
こんにちは
早速ですが、
コンピューターに複数CPUとcoreがある場合、
Windows 7 (64bit)の環境で、Visual C++ と OpenMP を利用して

Q1. 某特定のthreadをある特定のCPU(または core)に指定することはできますか。

Q2. 特定のCPUまたはcoreがidle状態にあるかどうかを確認する方法は何ですか?

どうぞ宜しくお願い申し上げます。

Re: OpenMPに詳しい方にお願い致します

Posted: 2011年2月21日(月) 17:50
by softya(ソフト屋)
すいません詳しくないのですが、コア数というか使用可能なプロセッサ数は下記関数で分かります。
「omp_get_num_procs (OpenMP)」
http://msdn.microsoft.com/ja-jp/library ... s.80).aspx

特定のコアにスレッドを割り当てる機能は無い様です。
同様に稼動しているスレッド数はわかりますが、
「omp_get_num_threads (OpenMP)」
http://msdn.microsoft.com/ja-jp/library ... S.80).aspx
どのコアが使われているかは分かりません。

ここら辺のローレベルの制御が出来ないのは、OpenMpの抽象化のコンセプトだからなのでは無いでしょうか?

OpenMPの関数の一覧。
http://msdn.microsoft.com/ja-jp/library ... 80%29.aspx

Re: OpenMPに詳しい方にお願い致します

Posted: 2011年2月21日(月) 22:29
by tosh
OpenMPは、その目的そのものが「独立性や競合などのチェックが要らないように」で作られたものなので
そういう用途には向かないんじゃないですかね。
せめてコア毎の論理IDが取れれば何とかなるんですけどなあ・・・

2.4 Processor Binding on Solaris
 http://download.oracle.com/docs/cd/E192 ... index.html
Control binding of threads to “processors”
 http://wikis.sun.com/download/attachmen ... zation.pdf

これらによれば「OpenMPでは」特定OS用に特定コンパイラでしかできません。
他のAPI、MPI等では何か方法があるかもしれません

インオーダーCPUなら、まさにそうした命令や仕様があるので
「まずは論理IDを取ってから」がセオリーなのですが、それにしても
どのIDがどこのコアであるか保証されていないこともあるため
例えば「ブロック図で見て左から二番目のコレ!」と明確に指定したい場合は
アセンブリ言語からのアプローチになると思いますね。

Re: OpenMPに詳しい方にお願い致します

Posted: 2011年2月21日(月) 22:41
by Poco
ミドリ さんが書きました:こんにちは

Q1. 某特定のthreadをある特定のCPU(または core)に指定することはできますか。

Q2. 特定のCPUまたはcoreがidle状態にあるかどうかを確認する方法は何ですか?
A1.SetThreadAffinityMask()が求めるWindows APIになると思います。

A2.分かりません。パフォーマンスモニタ系のWindows APIを調べてみてはどうでしょうか?