C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[8]: スレッドの処理速度の上げ下げ


(過去ログ 115 を表示中)

[トピック内 12 記事 (1 - 12 表示)]  << 0 >>

■68052 / inTopicNo.1)  スレッドの処理速度の上げ下げ
  
□投稿者/ 柏木 (1回)-(2013/09/19(Thu) 09:48:06)

分類:[.NET 全般] 

環境:
windows 7/8 64bit
visual studio 2010 VC++

基本はスレッドプールより マルチスレッドを利用したいですけれども
個々スレッドの優先度----CPU coreの利用時間などうやって制御するのでしょうか。

要は
速度の要求厳しい関数に最速のthreadを割り当てたいです。
逆にCPU coreの利用時間を最小限に抑えたいthreadもあります。

ご教授お願いします。

BOOSTやMFCでできるなら、合わせて教えていただきたいです。


引用返信 編集キー/
■68053 / inTopicNo.2)  Re[1]: スレッドの処理速度の上げ下げ
□投稿者/ とっちゃん (144回)-(2013/09/19(Thu) 10:56:18)
とっちゃん さんの Web サイト
No68052 (柏木 さん) に返信

> 基本はスレッドプールより マルチスレッドを利用したいですけれども
> 個々スレッドの優先度----CPU coreの利用時間などうやって制御するのでしょうか。
>
スレッドプール(どの形式のものを用いる場合でも)のスレッドを使っている限り優先順位を変えることはできません。
また、PPLやTBBなどの、並列ライブラリにもスレッドの優先度を変更する段取りは用意されていません。


> 要は
> 速度の要求厳しい関数に最速のthreadを割り当てたいです。
> 逆にCPU coreの利用時間を最小限に抑えたいthreadもあります。
>
特定のスレッドの処理優先順位を変更する場合は SetThreadPriority API や、SetThreadPriorityBoost API を使います。
boost は使ったことがないので、に同様の仕組みがあるかはわかりません。

優先順位の詳細については、それぞれ、英語のリファレンスをご参照ください。
日本語のモノ(MFCのやつや、古いリファレンスなど)は、最新レベルでも Windows 2000 時代まで(ただし、内容そのものは Windows NT 3.1のころと変わらない)で
それ以後の変更についての記述がありませんので。

Windowsのプロセスとスレッドについては、
http://msdn.microsoft.com/en-us/library/ms684841.aspx
が、トップページになります。
OSのバージョンアップとともにかなり大きく変わっているので About のところなどはよく見て、最新の知識を仕入れることをお勧めします。

Win7/8 の 64bit版が対象なら、スレッドの優先順位をいじるより、同時実行ランタイムの利用を検討したほうがいい場合もあります。
http://msdn.microsoft.com/ja-jp/library/dd504870.aspx
(リンク先は、VS2012のモノなので、適宜切り替えて参照してください)


> ご教授お願いします。
>
http://www.tt.rim.or.jp/~rudyard/torii009.html

引用返信 編集キー/
■68057 / inTopicNo.3)  Re[2]: スレッドの処理速度の上げ下げ
□投稿者/ 774RR (106回)-(2013/09/19(Thu) 12:50:11)
用語 スレッドプール というのは、
どのスレッドでどの処理をしても順序に依存しないような複数の対等な処理を、
複数の対等なスレッドに割り振って分散演算してしまおう、という考え方。
だから「スレッドプール」に属するすべてのスレッドは対等である、というのが基本だ。

どれかひとつのスレッドを特別扱いしたいのであれば、
その特別扱いしたいスレッドは自分で作らなきゃならない。

Windows は RTOS ではないのでリアルタイム性の保証は無いわけだ。
スレッドの優先順を変化させても速度に違いはほとんど無いよ。
原理を理解せずやみくもに優先順を変えても失敗するのがオチ。

参考
http://bbs.wankuma.com/index.cgi?mode=al2&namber=35545&KLOG=62

似たような質問みっけ。
http://dixq.net/forum/viewtopic.php?f=3&t=13897
引用返信 編集キー/
■68068 / inTopicNo.4)  Re[3]: スレッドの処理速度の上げ下げ
□投稿者/ 柏木 (3回)-(2013/09/20(Fri) 09:48:20)
No68057 (774RR さん) に返信
> 用語 スレッドプール というのは、
No68052 さん
親切なご指導ありがとうございます。
提供された情報を読んでいろいろいい勉強になりました。

ーーーーーーーーーーーーーーー

774RR さん
お世話になります。
丁寧なご解説ほんとうに有難うございます。

ただ、下記の表現に
> スレッドの優先順を変化させても速度に違いはほとんど無いよ。

ショック的ですね。
経験はないですけれども、ネットで調べてみたら、
スレッドの優先順を変化させる事は良く使われているテクニックみたいですね。

私これまでの理解では、
スレッドの優先順には二つの側面があります。
まず、新しいタクスが最初到着した時に、
もし優先度の高いthreadに実行を委託すれば、実行されるまでの時間が短くなります。
これは非リアルタイムOSにおいてはそれほど効果はないかも知れません(これは774RR さんに指摘された事ですね)。

ところが、
もうひとつの側面として、タイムシェアリング関係です。
どのthreadもずっとCPU(core)時間を占めることはない以上、core時間の断片を得る頻度の差があるでしょう。
優先度の高いthreadならば、core時間の断片を貰う頻度が高くなり、当然処理速度は速くなります。

私の考え方が正しくなければ、是非ご指摘お願いします。








引用返信 編集キー/
■68070 / inTopicNo.5)  Re[4]: スレッドの処理速度の上げ下げ
□投稿者/ 774RR (107回)-(2013/09/20(Fri) 11:00:13)
何が目的なのかがはっきりしないのでアレなんだが・・・

> 優先度の高いthreadならば、core時間の断片を貰う頻度が高くなり、当然処理速度は速くなります。
ということは「マウス・キー操作を受け付ける処理」や「ディスクキャッシュをフラッシュする処理」よりも
当該スレッドの処理のほうが優先されてしまう、ということになる。

・一切の操作を受け付けなくなってもいいから、ディスクキャッシュがフラッシュされなくなってもいいから
 あるひとつの計算スレッドに最優先で全 CPU 時間を占有させたい
んであれば SetThreadPriority とか SetPriorityClass とか。
でも、おそらく、そんな処理は Windows でするべき応用分野じゃない(デバッグも困難だ)

・重い計算があって、当該マシンで可能な限り早く終了させたい
であれば「スレッド優先順位」などで解決せず他の方針を採用すべきだろう。
具体的にどうすればよいかは問題によって違うだろうし情報不足(それを考えるのが設計=あなたの仕事)

・もし仮に No67990 の中の人と同じ人で
> 2. それから、処理データがない時、あるデータポートを絶えずチェックするような処理は相当CPU時間を費やすのでしょうか。
「データポート」が何かわからないので正しくない可能性が高いが
絶えずチェックする=他のプロセススレッドが走っている状態から直ちに戻ってきてほしい=優先順をあげたい
ということなら、これもやはり基礎設計レベルで何か間違っている。
(チェックするだけの限りなく無駄な処理にコア1つの CPU 時間のすべてを費やすことになる)

そういうときは相手方に通知してもらうように作ればいい。
引用返信 編集キー/
■68074 / inTopicNo.6)  Re[5]: スレッドの処理速度の上げ下げ
□投稿者/ shu (393回)-(2013/09/20(Fri) 14:40:47)
No68057で774RR さんが提示しているリンク先
http://bbs.wankuma.com/index.cgi?mode=al2&namber=35545&KLOG=62

を読まれたでしょうか?ここで質問された方は実際に試してみて
ほとんど変わらなかったという結論を出しています。柏木さんもどうしても速くなると
思うのなら実際に試してみればよいのではないでしょうか?

引用返信 編集キー/
■68075 / inTopicNo.7)  Re[4]: スレッドの処理速度の上げ下げ
□投稿者/ 甕星 (20回)-(2013/09/20(Fri) 14:41:54)
No68068 (柏木 さん) に返信
> もうひとつの側面として、タイムシェアリング関係です。
> どのthreadもずっとCPU(core)時間を占めることはない以上、core時間の断片を得る頻度の差があるでしょう。
> 優先度の高いthreadならば、core時間の断片を貰う頻度が高くなり、当然処理速度は速くなります。

正しいですよ。問題はどの程度早くなるかです。一般的なパソコンで、何も操作していないときのCPU使用率はどの程度でしょうか?せいぜいが数%でしょう?プライオリティを高くすることによって、これらのCPU時間が高い優先順位の処理に回されるでしょうが、それでどの程度早くなるかというと、先ほどの何もしていなかったときのCPU使用率の分だけ・・・せいぜい数%です。

仮にこの数%で速度要求を満たせたとしても、余裕率が少なすぎます。WindowsはリアルタイムOSでは無いので、プライオリティを下げられないハードウェア割り込み処理が入ると、この程度の余裕では簡単に要求を満たせない状態に陥る可能性が高いわけです。
引用返信 編集キー/
■68077 / inTopicNo.8)  Re[6]: スレッドの処理速度の上げ下げ
□投稿者/ 柏木 (4回)-(2013/09/20(Fri) 17:17:35)
No68074 (shu さん) に返信

ご指導ありがとうございます。
読みました。
現象としてよく分かりましたが、理屈的にすっきりしませんね。

なぜかと言うと、これからの質問をご覧頂きたいです。


また宜しくお願い致します。



> No68057で774RR さんが提示しているリンク先
> http://bbs.wankuma.com/index.cgi?mode=al2&namber=35545&KLOG=62
>
> を読まれたでしょうか?ここで質問された方は実際に試してみて
> ほとんど変わらなかったという結論を出しています。柏木さんもどうしても速くなると
> 思うのなら実際に試してみればよいのではないでしょうか?
>
引用返信 編集キー/
■68078 / inTopicNo.9)  Re[5]: スレッドの処理速度の上げ下げ
□投稿者/ 柏木 (5回)-(2013/09/20(Fri) 17:34:36)
No68075 (甕星 さん) に返信

丁寧なご指導有難うございます。

ただ、理解力が足りたくて、申し訳ないですけれども、
下の文の意味がより理解できません。
> 仮にこの数%で速度要求を満たせたとしても、余裕率が少なすぎます。

どうして、数%のCPU利用率しかないのに、「余裕率が少なすぎ」と言われるのでしょうか。
私の当初の質問意図はまさにこれにも繋がります。
thread poolを利用して、沢山のthread(メモリ内のデータを処理や計算)を同時に実行しているのに、
各CPU coreの使用率が低かった経験があります。
それに、各threadの実行速度はその関数をsingle threadで実行する時より遥かに遅かったんです。
もし、CPU coreみんな精一杯に働いてくれれば、理解できますが、CPU coreが全然余裕(60%程度の使用率)なのに、
どうしてthreadの実行速度が上がらないのでしょうか。








> ■No68068 (柏木 さん) に返信
>>もうひとつの側面として、タイムシェアリング関係です。
>>どのthreadもずっとCPU(core)時間を占めることはない以上、core時間の断片を得る頻度の差があるでしょう。
>>優先度の高いthreadならば、core時間の断片を貰う頻度が高くなり、当然処理速度は速くなります。
>
> 正しいですよ。問題はどの程度早くなるかです。一般的なパソコンで、何も操作していないときのCPU使用率はどの程度でしょうか?せいぜいが数%でしょう?プライオリティを高くすることによって、これらのCPU時間が高い優先順位の処理に回されるでしょうが、それでどの程度早くなるかというと、先ほどの何もしていなかったときのCPU使用率の分だけ・・・せいぜい数%です。
>
> 仮にこの数%で速度要求を満たせたとしても、余裕率が少なすぎます。WindowsはリアルタイムOSでは無いので、プライオリティを下げられないハードウェア割り込み処理が入ると、この程度の余裕では簡単に要求を満たせない状態に陥る可能性が高いわけです。
引用返信 編集キー/
■68080 / inTopicNo.10)  Re[6]: スレッドの処理速度の上げ下げ
□投稿者/ 774RR (108回)-(2013/09/20(Fri) 19:22:33)
>どうして、数%のCPU利用率しかないのに、
最初の発言にそんなこと一言も書いてないぢゃん。普通はエスパーはいないよ。

>thread poolを利用して、沢山のthread(メモリ内のデータを処理や計算)を同時に実行しているのに、
>各CPU coreの使用率が低かった経験があります。
スレッドプールは原理的に「並列に処理可能な問題」でのみ有効だ。
並列に処理できない問題、たとえば
・同期が必要な場合
・順次処理しかない場合
では、「処理をスレッドに分配する演算」「同期処理」が増える分だけ逆に遅くなって当然。

スレッドプール化するのに適切な問題でなかったか、バグっているか、ってとこだろう。

この前の横浜勉強会のネタの1つ
http://blogs.wankuma.com/episteme/archive/2013/08/03/328045.aspx
http://blogs.wankuma.com/episteme/archive/2013/08/03/328047.aspx

引用返信 編集キー/
■68169 / inTopicNo.11)  Re[7]: スレッドの処理速度の上げ下げ
□投稿者/ 柏木 (7回)-(2013/09/27(Fri) 10:52:53)
いつもお世話になります。

そうですか。

有難うございました。




No68080 (774RR さん) に返信
> >どうして、数%のCPU利用率しかないのに、
> 最初の発言にそんなこと一言も書いてないぢゃん。普通はエスパーはいないよ。
>
> >thread poolを利用して、沢山のthread(メモリ内のデータを処理や計算)を同時に実行しているのに、
> >各CPU coreの使用率が低かった経験があります。
> スレッドプールは原理的に「並列に処理可能な問題」でのみ有効だ。
> 並列に処理できない問題、たとえば
> ・同期が必要な場合
> ・順次処理しかない場合
> では、「処理をスレッドに分配する演算」「同期処理」が増える分だけ逆に遅くなって当然。
>
> スレッドプール化するのに適切な問題でなかったか、バグっているか、ってとこだろう。
>
> この前の横浜勉強会のネタの1つ
> http://blogs.wankuma.com/episteme/archive/2013/08/03/328045.aspx
> http://blogs.wankuma.com/episteme/archive/2013/08/03/328047.aspx
>
解決済み
引用返信 編集キー/
■68172 / inTopicNo.12)  Re[8]: スレッドの処理速度の上げ下げ
□投稿者/ とっちゃん (148回)-(2013/09/27(Fri) 12:04:22)
とっちゃん さんの Web サイト
No68169 (柏木 さん) に返信

> そうですか。
>
> 有難うございました。
>
勘違いしたままなきがするので、補足しておきます。
No68075 (甕星 さん) の発言内容は
---
高い優先順位を当てたいプログラムが動いて「いない時」のCPU利用率はせいぜい数%。
高い優先順位を当てたいプログラムがきっちりとCPUパワーを使い切るような状況になったとしても、その数%が上乗せされるだけ。

そんなわずかなスピードアップで満足できたとしても、割り込みが入ったらそのわずかな時間以上にCPUが使われてしまう場合があるので要求速度を満たせなくなる可能性があるのでは?
---
ということを書いています。


ちょっと異なりますが、VS2010が出たばっかりのころにCodezineに書いた記事が少しは参考になるかもしれないので張っておきます。
http://codezine.jp/article/corner/384
記事そのものは、GUIアプリの「(応答なし)」を表示させないためのテクニックなので処理高速化ではありません。
ですが、CPUパワーを使い切って処理させている実コード例にもなるので、全く参考にならないということはないと思います。

とくにGUIアプリであれば、避けられない割り込み処理(メッセージの処理)とどう分離させるか?という部分でも参考になると思います。


解決済みにしてるのでチェックはそのままにしておきます。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -