• ベストアンサー

デュアルコアCPUのマルチスレッド処理について

デュアルコアCPUにおけるマルチスレッドの処理について質問です。 ハイパースレッドをオフにしデュアルコアの CPU を 4 つ乗せた。 本来であれば、 8 CPU で処理が行なわれるはずであり、別途プロセスが立ち上がっての処理の場合は問題なく処理が行なわれているのだが、マルチスレッドにて処理を行なった場合、各 CPU の片側のみで処理が行なわれてしまう。(タスクマネージャーにて使用率を確認) この現象についてそれぞれのCPUを効率的に使う方法として、何か御座いましたらご教示頂きたく存じます。 宜しく御願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • precog
  • ベストアンサー率22% (966/4314)
回答No.4

> おっしゃるように割合でCPUを振るような設定があれば良いのですが・・・ 割合で振るのは、Win9x系ですけど、使用率100%まで持ってくると間に合わない処理が出てくるので使いづらいですよ。(割り込みは生きてるけど最後はメインプロセスにイベントを投げないといけないので、イベントが溢れる) 最大4core分までしか動かないということなら、リソースの競合ではないかと思います。CPU以外のリソースと、試験条件の差を確認してみてください。 例えば、8プロセスで起動しているときは試験DBが8つなんだけど、1プロセスのときは1つだとするとDBの競合でシリアライズされているのかもしれません。(NWリソース等も要確認) 試験だと、同じデータを叩きがちなので、この点も注意です。 ディスク使用率にも注意してみましょう。アクセスが設計どうり分散されてないのかもしれません。 後は、スループットに注目して、8プロセスのときのパフォーマンスと1プロセスのときのパフォーマンスを比べてみてください。Windowsでは起きないとは思いますが、CPU処理が軽くなったために相対的にディスクの性能不足に陥っているのかもしれません。 その他、可能性としては、DBを使っている場合など、ロック資源のロックの仕方がプロセスを分けたときとスレッドのときで違うのかもしれません。Oracleなどは確か1プロセスで受けるので同じはずなんですけど、内部ロックの競合などかもしれません (中が複雑なんでよくわからない) インストールを正しく行わないとその辺がおかしくなることもあるので要注意です。(エラーも出さず、一見正しく動いてるように見える)

snafkin7
質問者

お礼

丁寧ないつもご回答ありがとうございます。 最大4core分までしか動かないということなら、リソースの競合ではないかと思います。CPU以外のリソースと、試験条件の差を確認してみてください。 →その他のリソースも確認いたします。 DBでは使用していないので、その他のリソースを確認するように致します。 有難うございました。

その他の回答 (3)

  • precog
  • ベストアンサー率22% (966/4314)
回答No.3

>8つのCPUのうち、4つ(デュアルコアの片側のみ)を使い処理をしているようにみえ、その4つの使用率は50~60%であり他の4つはまったく使用していないようです。 あぁ、4パラでは動いてて、8パラにならないという意味でしたか。 であれば、CPU使用率をちゃんと合算してみたほうがいいですね。何かわかるかもしれません。 やってみて欲しいことがあるのですが、コア6つ (or4つ) にしても半分でしか動かないのでしょうか? 常に4つ分で動くなら単に並列度が不足しているのだと思います。 それと、スレッドの並列度 (8パラ → 16パラ等) は変えてみましたか? それで使用率が変わるなら、IO処理の関係でパラレル度が足りないだけか、割合でCPUを振るような設定があるのかもしれません。 または、各スレッドの依存性があるなら、リソースの競合かもしれません。(共有リソースへのアクセスが全スレッドにあり、トランザクション処理時間のうち、共有リソースの占有時間が1/4を越える等) >OSはWindowsでOS側の制限があるのかMSにも問い合わせてみたのですが >そのようなものはないと言われました。 NT系なら、かっちり100%まで振れる筈ですね。 >トレースをみるのが一番確実という事ですね。 すいません、これは全くパラレルになってないという意味かと思って書きました。4パラで動いてるなら、トレースを見る前に出来ることはあります。

snafkin7
質問者

お礼

ご丁寧なご回答本当にありがとうござます! >やってみて欲しいことがあるのですが、コア6つ (or4つ) にしても半分でしか動かないのでしょうか? 常に4つ分で動くなら単に並列度が不足しているのだと思います。 →コア4つ(デュアルコア2WAY)のときは4パラで動きます。コア2つ(デュアルコア1WAY)のときも2つで動きます。6つは試していませんが、アプリか何かで最大CPU4つしか使わないような制限があるのかなぁと考えています。 それと、スレッドの並列度 (8パラ → 16パラ等) は変えてみましたか? それで使用率が変わるなら、IO処理の関係でパラレル度が足りないだけか、割合でCPUを振るような設定があるのかもしれません。 →並列度を変更しても使用率に変化はありませんでした。  おっしゃるように割合でCPUを振るような設定があれば良いのですが・・・

  • precog
  • ベストアンサー率22% (966/4314)
回答No.2

マルチスレッドプログラミングを行っているのだが、処理が並列にならないという解釈で宜しいですか? 危険領域の管理フラグでお互いにロックしちゃってシリアライズされてるんじゃないですか? または、デッドロックからの自動解除の可能性も検討してみてください。 ロックのロジックをレビューして見直してみてください。それで発見できないならライブラリーやDBステートメントに含まれるインプリシットなロックが悪さしていると思われます。スレッドのトレースを取って、どこでコンテクストスイッチングが起きているか見るしかないように思います。机上で発見できないときは、時間はかかりますが、手当たり次第なことをするよりトレースを見るのが確実です。 OSが何かもわからないし、具体的なアドバイスは出来ませんけど。

snafkin7
質問者

お礼

ご回答有難うございます。 ご指摘頂いた解釈の通りです。 8つのCPUのうち、4つ(デュアルコアの片側のみ)を使い処理をしているようにみえ、その4つの使用率は50~60%であり他の4つはまったく使用していないようです。 これを他のCPUに割り振り処理させるようにしたいのですが。 OSはWindowsでOS側の制限があるのかMSにも問い合わせてみたのですが そのようなものはないと言われました。 トレースをみるのが一番確実という事ですね。 また何かございましたらアドバイスください。 有難う御座いました。

  • NogNog
  • ベストアンサー率20% (6/30)
回答No.1

マルチCPU、マルチ・スレッドに対応しているアプリケーションは、一部の科学技術計算用アプリしかないと思います。 複数のアプリを立ち上げれば、OSが勝手に判断して、CPU、スレッドに分散してますよね? 単一のアプリで負荷分散等を行って、効率よく使うためには、自分でプログラムを書くしかないと思います。 自分は、VS2005、VS2008βで、マルチ・スレッド・アプリケーションを書いて、負荷分散してます。

snafkin7
質問者

お礼

ご回答有難うございます。 アプリケーションが、マルチスレッドに対応していない可能が高いという事ですね。 アプリは単一で動いており、このアプリが同時実行スレッドを制限しているのかもしれないですね。 確認してみます。 ありがとうございました。

関連するQ&A