とある処理をマルチスレッドを使って同時処理をさせたのですが、
全く速くならないのでお知恵をお貸し願えないかと思います。
CPUはデュアルでハイパースレッドに対応しており、タクスマネージ
ャーでCPU使用率の履歴のところは4つのメーターが表示されています。
シングルタスクで処理した場合、CPU使用率は25%で1つのメーターだけ
が使用率25%を示して推移しています。
これをTThreadを使用して、4つの処理を同時(各スレッド間の同期など
は必要のない単独処理です)に動かしてみたところ・・・。
やっぱりCPU使用率は25%でした。(滝汗;;;
CPU使用率のグラフは先ほどと違って、4つのメーターがほぼ均等に使用
されているような表示を行っており、シングルタスクで動作させたときと
はCPUの使われ方(?)が異なっているようには見えましたが、TThreadを使
用しても、メインスレッドが本来使われるべき最大のCPU使用率(当方の
環境では25%)がTThreadで生成したスレッドの個数で均等に振り分けられ
るだけで、CPUを有効利用する事は出来ないのでしょうか?
TThreadを使って、CPUを有効利用するには、何か特殊なことをしなければ
いけいなのでしょうか?
実験的に、処理の部分を別のEXEにして、TThread内から呼び出しを行う
ようにしてみたところ、呼び出された個々のEXEがそれぞれ25%までCPU
を使用するように動作し、この場合は期待した処理速度の向上の結果が
得られました。
この件に関し、何かアドバイスいただけましたら幸いです。
--------------------------------------
Power up the Internet with Yahoo! Toolbar.
http://pr.mail.yahoo.co.jp/toolbar/
黒川さま:
> CPUはデュアルでハイパースレッドに対応しており、タクスマネージャーで
> CPU使用率の履歴のところは4つのメーターが表示されています。
>
> シングルタスクで処理した場合、CPU使用率は25%で1つのメーターだけが
> 使用率25%を示して推移しています。
> これをTThreadを使用して、4つの処理を同時(各スレッド間の同期など
> は必要のない単独処理です)に動かしてみたところ・・・。
> やっぱりCPU使用率は25%でした。(滝汗;;;
> CPU使用率のグラフは先ほどと違って、4つのメーターがほぼ均等に使用
> されているような表示を行っており、シングルタスクで動作させたときとは
> CPUの使われ方(?)が異なっているようには見えましたが、TThreadを
> 使用しても、メインスレッドが本来使われるべき最大のCPU使用率(当方の
> 環境では25%)がTThreadで生成したスレッドの個数で均等に振り
> 分けられるだけで、CPUを有効利用する事は出来ないのでしょうか?
> 実験的に、処理の部分を別のEXEにして、TThread内から呼び出しを行う
> ようにしてみたところ、呼び出された個々のEXEがそれぞれ25%までCPU
> を使用するように動作し、この場合は期待した処理速度の向上の結果が
> 得られました。
きちんとスレッド分けができていれば、CPUパワーをフルに使って
動作しますよ。
まず、時間のかかる処理が本当にワーカスレッド(サブスレッド)で
実行されているかどうか確認してみましょう。 たとえば Synchronize の
使いすぎなどで、ほとんどメインスレッドで実行されていたりすると、
お書きのような現象が見られます。
処理がメインスレッドで実行されているかどうか確認するには、次の
判定式を使ってください。
GetCurrentThreadId=MainThreadId
処理が正しくワーカスレッドで実行されているのであれば、次に同期を
疑います。 処理のうちのほとんどの部分がクリティカルセクションの
中にあったりすると、やはり同じような症状が起きます。 何か同期
メカニズムをお使いであれば教えてください。
――――――――――――――――――――――――――――――――――――
株式会社イマジオム 代表取締役 高木太郎
〒316-0024 茨城県 日立市 水木町 1-11-10
電話:0294-28-0147
ファクシミリ:0294-28-0148
電子メール:tarou_...@imageom.co.jp
ホームページ:http://www.imageom.co.jp/
> 疑います。 処理のうちのほとんどの部分がクリティカルセクションの
アドバイスありがとうございます。
助言もありまして、一度ファイルの読み込みしかしないシンプルな
テストプログラムを作ってテストしてみました。
なるほど確かにスレッドの個数とCPUメーターの使用率が一致するように
動作する事を確認しました。
明示的にSynchronizeを使っているところはないのですが、クリティカル
セクション・・ってのが気になりますので、この辺りから調べてみたいと
思います。ありがとうございました。
Quoting "K.Kurokawa" <kuro_m...@yahoo.co.jp>:
> シングルタスクで処理した場合、CPU使用率は25%で1つのメーターだけ
> が使用率25%を示して推移しています。
シングルで 25% ということは、相当量の I/O ネックとかが
あるってことですよね。
ここを分析して示さないと(どこで 75%もの期間止まるのか示さないと)
何も答えは得られないと思います。
----------
(株)ブレーン 中村拓男
黒川さま:
> 明示的にSynchronizeを使っているところはないのですが、クリティカル
> セクション・・ってのが気になりますので、この辺りから調べてみたいと
> 思います。
あともう一つ、メッセージキューにメッセージを積んで処理を待つことを
していないかどうか、確認してみてください。 VCLは結構、暗黙に
メッセージを使っています。 とにかく、個々のスレッドがCPUを
25%しか使っていないということは、個々のスレッドが干渉している
証拠なので、干渉が何によって起こっているのかを推定してみると比較的
早く解決すると思います。
> 助言もありまして、一度ファイルの読み込みしかしないシンプルな
> テストプログラムを作ってテストしてみました。
> なるほど確かにスレッドの個数とCPUメーターの使用率が一致するように
> 動作する事を確認しました。
蛇足かもしれませんが、ワーカスレッドからファイルを読み込ませると
結構遅くなることがあります。 ディスクヘッドの奪い合いが生じ、ボトル
ネックになるからです。 ご注意ください。
――――――――――――――――――――――――――――――――――――
株式会社イマジオム 代表取締役 高木太郎
〒316-0024 茨城県 日立市 水木町 1-11-10
電話:0294-28-0147
ファクシミリ:0294-28-0148
携帯電話:090-8177-5709
> > シングルタスクで処理した場合、CPU使用率は25%で1つのメーターだけ
> > が使用率25%を示して推移しています。
> シングルで 25% ということは、相当量の I/O ネックとかが
> あるってことですよね。
すみません。説明がうまくなかったようです。
CPUメーターの1つぶんとしては、フル(100%)に動作している状態なのですが、
CPUメーターが4つある環境なので、トータルとしては25%と表示している状態
の説明の誤りでした。
助言をもとに今回作成した単純にファイルを読むだけのプログラムでは、
スレッドの個数が増えるたびに、トータルのCPU使用率が25%、50%、75%、100%と
面白いようにスレッドの起動個数と一致するような結果が得られましたので、
これをもとに、何が足を引っ張っているのか調べられたらな・・・っと思います。
黒川
黒川さま:
> 助言をもとに今回作成した単純にファイルを読むだけのプログラムでは、
> スレッドの個数が増えるたびに、トータルのCPU使用率が25%、50%、75%、100%と
> 面白いようにスレッドの起動個数と一致するような結果が得られましたので、
そういうことなんですか(お書きの内容を誤解していました)。
そうだとすると、スレッドが相互に干渉しているということではなくて、
そもそもスレッド自体が25%しかCPUを使わない仕組みになっていると
考えるのが自然です。
明示的に Sleep などを使っていないのなら、スレッド処理のうち、最も長い
時間のかかる部分を疑うべきですね。