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

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

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

Re[2]: 100個の並行処理


(過去ログ 137 を表示中)

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

■80707 / inTopicNo.1)  100個の並行処理
  
□投稿者/ マンマミーア (1回)-(2016/08/04(Thu) 16:30:09)

分類:[.NET 全般] 

VB2013を使用しています。

1行程あたり5秒程度かかる処理があるとします。
これを100個並行して処理する方法ってあるのでしょうか?
100個のスレッドに分割しても、
CPUは100個を一度に捌けるわけではなく、
ほとんどのスレッドが待ち状態、ということになるのでしょうか?

素人知識のため、スレッドの仕組みをよく理解しておらず、
漠然とした質問で申し訳ありませんが、
よろしくお願い致します。
引用返信 編集キー/
■80708 / inTopicNo.2)  Re[1]: 100個の並行処理
□投稿者/ shu (897回)-(2016/08/04(Thu) 17:01:23)
No80707 (マンマミーア さん) に返信

Parallel.For とか Parallel.ForEach が使えるようなら
試してみてはどうでしょう?

Parallelクラス (MSDN)
https://msdn.microsoft.com/ja-jp/library/system.threading.tasks.parallel(v=vs.110).aspx




引用返信 編集キー/
■80710 / inTopicNo.3)  Re[1]: 100個の並行処理
□投稿者/ なちゃ (126回)-(2016/08/04(Thu) 19:19:14)
No80707 (マンマミーア さん) に返信
> VB2013を使用しています。
>
> 1行程あたり5秒程度かかる処理があるとします。
> これを100個並行して処理する方法ってあるのでしょうか?
> 100個のスレッドに分割しても、
> CPUは100個を一度に捌けるわけではなく、
> ほとんどのスレッドが待ち状態、ということになるのでしょうか?

CPUが本当に同時に実行できるのはコア数ぶんのスレッドです。
※ハイパースレッディング他もっと細かい話はひとまずおいといて

なので、CPUを使う処理は同時に100個も動かすことは出来ません。
多くのスレッドが待ち状態になります。
ただし、処理がIO待ちを挟んでいるなら、待機中はCPU
を使いませんので、実質的についてもっと多くのスレッドが同時実行してるのと同じことになる場合もあります。

いずれにしてもスレッド100個というのは普通は非効率なので、例えばTaskなどを使用して、実際に使うスレッド数は状況に合わせてよきに計らってもらうのが常套です。

shuさんが紹介されてるParallelとかも同様です。

引用返信 編集キー/
■80711 / inTopicNo.4)  Re[1]: 100個の並行処理
□投稿者/ 魔界の仮面弁士 (796回)-(2016/08/04(Thu) 20:21:38)
No80707 (マンマミーア さん) に返信
> 1行程あたり5秒程度かかる処理があるとします。
行程→工程かも。


> これを100個並行して処理する方法ってあるのでしょうか?
正直、厳しいと思います。

…が、要件次第でもあるので、一般論としては答えにくいところです。
複数台の PC でグリッドコンピューティングという手もありますし。


> 100個のスレッドに分割しても、
分割できたとしても、並列化が銀の弾丸になるとは言い切れません。

仮に 4 スレッドで並列処理したとしても、処理速度が 2 倍になるどころか、
直列処理させたときより遅くなる事だって十分にありえます。


そもそも、各工程が独立しておらず、次工程が前工程の結果に
依存しているような処理だとしたら、直列処理するしかありませんよね。
なので、各工程はそもそも独立して並列実行できる内容になっているのか、
あるいは現在の 1 工程を、さらに分割して並列化できる箇所があるのかなど
処理手順の設計面から検討しないといけなかったりします。


極端な例で言えば、1 枚あたりの印刷に 5 秒かかるプリンターで
100 枚の写真を印刷する処理だったとしたら、たとえ高性能な CPU を
積んでいたとしても、プリンター 1 台だけでは高速化は望めませんよね。
しかしプリンターが 10 台あれば、並列印刷による高速化が望めます。
たとえ CPU 自体の処理性能が低かったとしても。



> 100個のスレッドに分割しても、
> CPUは100個を一度に捌けるわけではなく、
捌けるスレッドの数だけで言えば、CPU ではなく GPU という選択肢があります。

VB からも呼べるようなライブラリはありますが、VB 単体で済む話では無いので、
今回のパターンで使えるのか問われると正直微妙ですが、
そもそもの処理内容が分からないので、一応紹介しておきます。

https://cudafy.codeplex.com/
https://openclnet.codeplex.com/
http://gpgpu.org/tag/net
https://codezine.jp/article/detail/8429
http://memeplex.blog.shinobi.jp/directx11/c-でgpgpuチュートリアル%20その1%20gpuからc


> ほとんどのスレッドが待ち状態、ということになるのでしょうか?
概ねそう思って良いとは思いますが、これも要件次第ですかね。

待ち時間・演算処理以外の作業(ファイル I/O など)が大量にある場合は、
マシンのコア数よりも多くの並列処理を捌ける可能性もありますし。


> VB2013を使用しています。
標準で使える機能として、PLINQ が挙げられますが、MSDN においても
https://msdn.microsoft.com/ja-jp/library/dd997425%28vs.100%29.aspx
》クエリは、多くの場合並列化できますが、並列クエリの設定に伴うオーバーヘッドは、
》並列化によって得られるパフォーマンスの利点よりも大きくなります。
とか
》クエリが大量の計算を実行しない場合、またはデータ ソースが小さい場合、
》PLINQ クエリは、順次的な LINQ to Objects クエリよりも低速になります。
などと記述されています。
引用返信 編集キー/
■80716 / inTopicNo.5)  Re[2]: 100個の並行処理
□投稿者/ 真田昌幸 (20回)-(2016/08/05(Fri) 10:12:13)
No80711 (魔界の仮面弁士 さん) に返信

> 極端な例で言えば、1 枚あたりの印刷に 5 秒かかるプリンターで
> 100 枚の写真を印刷する処理だったとしたら、たとえ高性能な CPU を
> 積んでいたとしても、プリンター 1 台だけでは高速化は望めませんよね。
> しかしプリンターが 10 台あれば、並列印刷による高速化が望めます。
> たとえ CPU 自体の処理性能が低かったとしても。

非常にわかりやすい例えですね。
.Netのマルチスレッドではないですが、
前に、SQL(Oracle)のヒント句でパラレルを試してみたら、
コストも実測値もかえって上がるケースがあるため、
採用を見送ったことがあります。
ちなみにその時のデータ件数は母数が数千万なので、
一般論としてはパラレルを使うこともあり得るケースと思います。

質問主さんも、まずどのくらいの分散が可能な環境かをまず確認、ヒアリングすることでしょうね。
机上検討はそれからでもよいかと。


引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -