[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2chのread.cgiへ]
Update time : 05/21 03:04 / Filesize : 243 KB / Number-of Response : 977
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

マルチスレッドプログラミング相談室 その8



1 名前:デフォルトの名無しさん mailto:sage [2009/09/21(月) 17:19:27 ]
マルチスレッドプログラミングについて語るスレ

■前スレ
マルチスレッドプログラミング相談室 その7
pc12.2ch.net/test/read.cgi/tech/1215253576/

■過去スレ
その1 ttp://pc3.2ch.net/tech/kako/997/997345868.html
その2 ttp://pc5.2ch.net/test/read.cgi/tech/1037636153/
その3 ttp://pc8.2ch.net/test/read.cgi/tech/1098268137/
その4 ttp://pc8.2ch.net/test/read.cgi/tech/1130984585/
その5 ttp://pc11.2ch.net/test/read.cgi/tech/1157814833/
その6 ttp://pc11.2ch.net/test/read.cgi/tech/1187008532/

OS・言語・環境は問わないが、それゆえ明記すべし。
テンプレ
【OS】
【言語】
【実行環境】
【その他特記する事項】

781 名前:777 mailto:sage [2011/10/25(火) 12:55:15.17 ]
レスどうもです。

>どうでもいいよ
作法とかあったらしりたいなぁ、と思いました。(マルチスレッド自体はじめてで。)
今回は簡単なツールなので確かにどうでもいいのですが…。

>Join失敗したらどうすんの
失敗するのですか?
戻り値がvoidだったので気にしてませんでした。
例外が投げられるのかな。調べてみます。

782 名前:777 mailto:sage [2011/10/25(火) 13:10:39.43 ]
あれ?
結局デストラクタでJoin失敗した場合と、デストラクタじゃない方でJoin失敗した場合とで、どういう違いが起きるのです?

>スレッドがどうとかより機能別に関数を作れ
一つのクラスに押し込めるな、ということでしょうか?
関数は各スレッドで(クラス内で)独立したものを使っていて、
関数間のデータの受け渡しもクラス内のメンバ変数を使っているので、
クラスの使い方的に、理にかなっているかなぁなんて考えたのですが…。

783 名前:デフォルトの名無しさん mailto:sage [2011/10/25(火) 14:00:13.83 ]
構造体や変数に volatile とつけたときの
本当の意味を知る方法

784 名前:777 mailto:sage [2011/10/25(火) 14:47:21.75 ]
レスどうもです。

>構造体や変数に volatile とつけたときの
volatileとか初めて知りました。何てこと…。
でも、コンパイルのコード生成的なオプションで、マルチスレッド指定していれば、変な最適化はされなくないですか?

>どちらもダメで他の方法が良いか
に対するレスですよね?
781か782でしょうか?

785 名前:デフォルトの名無しさん mailto:sage [2011/10/25(火) 15:09:03.14 ]
>>777
受信スレッドと加工スレッドと表示スレッドに分けるんだろ。
で、スレッド起動したら基本は動きっぱなしだと理解したんだが。

それなら、受信クラスと加工クラスと表示クラスに分けて、
スレッド起動(受信クラス、ネットワーク情報、受信バッファ)
スレッド起動(加工クラス、受信バッファ、表示キュー)
スレッド起動(表示クラス、表示キュー、表示デバイス情報)
こんな感じで起動すればいいんじゃないのかね。
こういう作りにしておけば、例えばメインスレッドで表示をするように変更するのも簡単だ。

786 名前:デフォルトの名無しさん mailto:sage [2011/10/25(火) 15:51:18.15 ]
TBB使えば

787 名前:777 mailto:sage [2011/10/25(火) 17:02:22.59 ]
>受信スレッドと加工スレッドと表示スレッドに分けるんだろ。
>で、スレッド起動したら基本は動きっぱなしだと理解したんだが。
はい。

>こんな感じで起動すればいいんじゃないのかね。
了解です。
変にまとめすぎない方がいい感じなんですね。
「独立して動くスレッド達のだから、メインでは、何もしないのがいいのかなぁとか無駄に凝ってました。

>TBB使えば
それは、どのような意図でです?
boostとそっくりな気がして、どの様にとりあつかえばヨイのか見当がつかないです。

788 名前:777 mailto:sage [2011/10/25(火) 17:13:53.40 ]
detach()というメソッドが何を目的にしているのかいまいち理解できないので教えて欲しいです。

>>785 を利用させてもらうと、boost::threadを使う場合(thread_groupで無い場合)
 boost::thread スレッド起動1(受信スレッド関数名、受信クラス、ネットワーク情報、受信バッファ)
 boost::thread スレッド起動2(加工スレッド関数名、加工クラス、受信バッファ、表示キュー)
 boost::thread スレッド起動3(表示スレッド関数名、表示クラス、表示キュー、表示デバイス情報)
で、スレッドを起動しますが、
「あとは、エラー出ても、例外投げても、私は知らないから勝手にやってね。」という場合は、
 スレッド起動1.detach(); スレッド起動2.detach(); スレッド起動3.detach();
と書いてしまっていいんですか?
join()しないと、メモリ的に何かおかしいことになりそうな気がして、ドキュメントを探しているのですが、捗っていないです。

デタッチ自体初めて知った概念なので、理解がすすまないです。
デタッチ:デバッガなどが監視・制御の対象としていた(アタッチしていた)実行中のプログラム(プロセス)を監視下から外すことを「デタッチする」という。

というのは、わかったのですが、自動変数である「スレッド起動x」は、メイン終了で開放されるのではないのですか?

789 名前:デフォルトの名無しさん mailto:sage [2011/10/26(水) 12:59:59.34 ]
>>788
pthread_detachとCloseHandleをスレッドに対して
実行した場合を調べてみ。



790 名前:デフォルトの名無しさん [2011/11/03(木) 18:34:53.11 ]
visual c++ 2010 Express
についてくる、
Concurrency::concurrent_queue
を使って、
要素にstringを含んだ構造体(そういえばstringだけって試してないな)を取り扱うと、
デストラクタで開放するときに、アクセス違反が起きるんですけどどうすればいいですか?

という質問をしたいのですけど、Visual C++を教えるスレッドへ行ったほうがいいです?
とりあえず、英語圏で同じ問題を出している人をみつけたんですけど、みたいな状態で、アロケータ?なんだそりゃ?な状態なのです。とりあえず英語読んできます。
ageて申し訳ない。

791 名前:790 mailto:sage [2011/11/03(木) 18:39:17.13 ]
申し訳ないです。

よく考えたら、Concurrency::concurrent_queueとマルチスレッドって関係浅いですね。
他で訊きなおします。
失礼しました。

792 名前:デフォルトの名無しさん [2011/11/03(木) 20:00:51.82 ]
そういえばppl.hのメモリリークのバグっていつの間にかなおってたな

793 名前:デフォルトの名無しさん mailto:sage [2011/11/15(火) 10:54:58.38 ]
p://ideone.com/CZz2M

Concurrency::parallel_forを使っているかたはいらっしゃらないでしょうか。

画像処理のシミュレータをVC2008Expで書いていて
CreateThreadによる手書きマルチスレッドからOpenMPと移行し
速度的に変わっていないことを確認したのですが
VC2010Expに移行し、OpenMPの導入方法がわからなかったので
parallel_forに書き換えてみた所、異常に遅いのです。

プロジェクトの設定は、2008はリリースデフォルト+OpenMPサポート
2010はリリースデフォルトです。

何か設定を間違っているのかと思うのですが、どなたかわかりませんか?

【OS】XP sp3 32bit
【言語】VC++ 2008/2010 Express
【実行環境】 Core 2 Extreme X9650 3.45Ghzくらい

794 名前:デフォルトの名無しさん mailto:sage [2011/11/15(火) 11:43:33.72 ]
プログラミング初心者で課題が出たんですけど…
教えて頂けるとありがたいですm(__)m

・九九の表をVisual Basicで完成させる

・1から100までの整数の和を求める

お願いします

795 名前:デフォルトの名無しさん mailto:sage [2011/11/15(火) 13:40:05.39 ]
>>794
スレ違い。

BASICの宿題はお前にまかせた
ttp://hibari.2ch.net/test/read.cgi/tech/1136788500/


796 名前:デフォルトの名無しさん mailto:sage [2011/11/15(火) 18:00:31.85 ]
マルチスレッドで九九表を作るという課題かもしれない

797 名前:デフォルトの名無しさん mailto:sage [2011/11/15(火) 18:18:03.92 ]
処理そのもののコストよりもスレッド作るコストの方がでがいわw


798 名前:デフォルトの名無しさん mailto:sage [2011/11/15(火) 19:26:55.17 ]
>>797
つまり、よりコストを下げるためにFiberを実装する宿題と言うことか。

799 名前:デフォルトの名無しさん mailto:sage [2011/11/16(水) 00:04:15.44 ]
教官が採点不能すぐるwww



800 名前:デフォルトの名無しさん mailto:sage [2011/11/16(水) 00:07:19.51 ]
SSE使おうぜ

801 名前:デフォルトの名無しさん mailto:sage [2011/11/16(水) 08:01:57.58 ]
SSEを使ったからといって、マルチスレッドとはいえないがな。

802 名前:デフォルトの名無しさん mailto:sage [2011/11/16(水) 09:10:50.87 ]
数値計算ならSSEとマルチスレッドを両方使うのが常識だな

803 名前:デフォルトの名無しさん mailto:sage [2011/11/16(水) 13:08:03.64 ]
ならGPGPUで

804 名前:デフォルトの名無しさん mailto:sage [2011/11/16(水) 17:08:36.01 ]
SSE+マルチスレッドなら九九ならず9999999×9999999くらいの表を作るべきだな

805 名前:デフォルトの名無しさん mailto:sage [2011/11/16(水) 17:35:23.60 ]
約100T個

806 名前:デフォルトの名無しさん mailto:sage [2011/11/16(水) 20:09:53.33 ]
GPGPUってマルチスレッドなのか?
一応処理単位をスレッドと呼ぶけどそれじゃSSEもマルチスレッドになるような
数値計算だとデータ並列が基本だから数値計算プログラムを書く人から見たら
いわゆるマルチスレッドと大して違わないんだろうが

807 名前:デフォルトの名無しさん mailto:sage [2011/11/16(水) 20:32:03.35 ]
GPGPUもSSEも「並列化プログラミング」だよね
ただそれらはスレッド無しでも使える技術だから、このスレでは微妙かも
以前は並列処理スレがあったけど、そちらはdat落ちした

808 名前:デフォルトの名無しさん mailto:sage [2011/11/16(水) 22:50:07.24 ]
SSEはSIMDだろ、んでGPGPUとスレッドはMIMD。
SSEとGPGPUは機能としては勿論、分類としても全然違うと思うぞ。

809 名前:デフォルトの名無しさん mailto:sage [2011/11/17(木) 02:40:46.84 ]
GPGPUで重要な性質はSIMDだろ
いかにSIMDを生かせるかで性能が決まって、アルゴリズムもそれが前提になる



810 名前:デフォルトの名無しさん mailto:sage [2011/11/17(木) 02:59:04.56 ]
GPGPUの各クラスタというか構成単位について見ると
同時に異なる命令を実行していることがあり得るので
Single Instructionではない

フリンの分類に当てはめるならMIMD
しかし、もっと狭めたSPMDっていう表現のほうが適切じゃないの

811 名前:デフォルトの名無しさん mailto:sage [2011/11/17(木) 03:21:03.30 ]
複数の別々の画像に対して同じ処理を並列に独立に実行したら
タスク並列かデータ並列かどっちになるの?

812 名前:デフォルトの名無しさん mailto:sage [2011/11/17(木) 07:24:31.73 ]
どっちも使ってるで良いだろ


813 名前:デフォルトの名無しさん mailto:sage [2011/11/20(日) 20:50:45.10 ]
GPUは投機実行するか、単に並列実行するかで方向性がかなり変わるよね。
もっとも、GPGPUとしては投機実行の方が需要が多いだろうけど。
投機実行となると実行してる命令はクラスタ毎に異なるから
やっぱMIMDとしての使用がメインという事でないか。

814 名前:デフォルトの名無しさん mailto:sage [2011/11/20(日) 23:03:59.97 ]
GPGPUは「ゆかいな牧場」のメロディーで発音したくなる。

815 名前:デフォルトの名無しさん mailto:sage [2011/11/21(月) 00:44:45.34 ]
>>814
しまった、そう発音していた。

816 名前:デフォルトの名無しさん mailto:sage [2011/11/21(月) 18:45:55.58 ]
>>815
おまえがいちろうか、

817 名前:デフォルトの名無しさん mailto:sage [2011/11/21(月) 19:42:22.04 ]
大人になってから改めて歌詞を見ると下ネタにしか見えないな

818 名前:デフォルトの名無しさん [2011/11/22(火) 19:52:25.40 ]
シングルスレッ〜ドでコード おまえ書いてたころ〜

819 名前:デフォルトの名無しさん mailto:sage [2011/11/22(火) 20:32:28.94 ]
人というのは知っている言葉を敏感に聞きとれるようになっている
すなわち、それは>>817がエロくなっただけのこと



820 名前:デフォルトの名無しさん mailto:sage [2011/11/24(木) 06:40:15.25 ]
かゆいな牧場

821 名前:デフォルトの名無しさん mailto:sage [2011/11/25(金) 22:40:29.78 ]
atomic_store、stomic_load関数って自分で実装しなくてはならない羽目になったらどうするんですか
WindowsAPIを探してみたんですがよくわかりません
Interlockedシリーズを応用するんでしょうか?

822 名前:デフォルトの名無しさん mailto:sage [2011/12/13(火) 03:13:09.01 ]
メモリ競合は、あるスレッドがあるアドレス位置に書き込みを行っている最中に、
別のスレッドがそのアドレス位置に書き込み、もしくは読み込みを行うことで、
そのアドレス位置に中途半端にデータが書き込まれた状態で別のデータが書き込まれる、
あるいは読み込まれることによって起こる、という認識で正しいでしょうか?
その場合、それはビット単位で起こるのでしょうか?

たとえば以下のように、ある変数に2スレッドで書き込み、1スレッド読み込む場合、
変数の値が 0x00, 0xff 以外の値になることはあるでしょうか?
もし変数のサイズがもっと大きければどうでしょう?

// thread0
var = 0x00;

// thread1
var = 0xff;

// thread2
if( var ) ; // ...

823 名前:デフォルトの名無しさん mailto:sage [2011/12/13(火) 05:03:20.45 ]
>>822
環境次第。その対象アドレスにあるのが普通のメモリなら、ビット単位と言う事は無いのでその2値以外になることはおそらくない。

824 名前:デフォルトの名無しさん mailto:sage [2011/12/13(火) 17:01:56.05 ]
>>822
どのサイズが問題なく読み書きできるかは環境(CPUやVM等)しだい
(intはOKだがdoubleはだめといった感じ)

825 名前:デフォルトの名無しさん mailto:sage [2011/12/13(火) 17:32:59.62 ]
>>822
32ビットx86なら4バイトアライメントされたアドレスの4バイトをmovでアトミックに書き込める、
これが8バイトだとmov2回になるので(もっと違う値なら)2値のどちらでもない状態が存在する、とかいうのはある
でも付いて行けなくなるから考えないほうがいいぞ

826 名前:デフォルトの名無しさん mailto:sage [2011/12/14(水) 04:35:01.63 ]
>>823-825
ありがとうございます。
とりあえず、メモリを読み書きする電気的な信号などがバッティングして
データが飛んだりハードが壊れたりということはないんですね。

827 名前:デフォルトの名無しさん mailto:sage [2011/12/14(水) 06:38:46.37 ]
メモリ競合程度でハード自体が壊れるなら欠陥品と言わざるを得ない

828 名前:デフォルトの名無しさん mailto:sage [2011/12/14(水) 08:09:32.50 ]
>>826
その環境が組み込みでメモリマップドI/Oの先にいい加減な回路が繋がっていたりしたら、壊れるかも知れんが。
尤も、そんな回路ならマルチスレッドに関係なく壊しそうだけど。

829 名前:デフォルトの名無しさん mailto:sage [2011/12/14(水) 15:52:37.83 ]
そんなハードウェア上で何も組める気がしないぜ



830 名前:デフォルトの名無しさん mailto:sage [2011/12/14(水) 16:07:15.72 ]
>>829
しかしそれでも組むのが我々の仕事だ

831 名前:デフォルトの名無しさん [2012/01/15(日) 18:00:02.48 ]
物理ディスクとのI/Oコストってデカイじゃん
もしかしたらアーカイブのままメモリに読み込んで、
メモリ中でアーカイブ展開しながら処理した方が
早いんじゃないかとも思うんだが、
検証しやすいサンプルとか無い?

高速展開と、部分抽出が出来れば効果が現れやすいと思う。


832 名前:デフォルトの名無しさん mailto:sage [2012/01/15(日) 18:23:45.87 ]
>>831
20年くらい前に、そういうコンセプトのフリーウェアがあったっけな。

とりあえず試してみたら良いだろ。
圧縮率を20%と仮定するなら、100KBのreadにかかる時間と、
80KBのreadにかかる時間差を計測する。
後はオンメモリに置いといて、その時間差ないに解凍できるかだ。

ちなみにディスクの待ち時間の大部分はヘッドのシーク。
データサイズが多少小さくなったところで、得られる時間は少ない。
データが連続している場合、20KB減ったところで1msも短くならないぞ。

833 名前:デフォルトの名無しさん mailto:sage [2012/01/15(日) 20:58:51.56 ]
何だ無駄か。読み込みスレッドで随時解凍しながら取り込めば、
ワーカーの処理待ちを減らせるかと思ったのに。

834 名前:デフォルトの名無しさん mailto:sage [2012/01/15(日) 22:18:40.46 ]
いや、IO自体のオーバーヘッドは今でもバカにならない。
ネットワーク上のファイルIOもレイテンシがでかい。
いまどき数百MBからGBオーバーのファイルも少なくないんだから、本気でバッファを大きくとるか、コンカレントに処理して欲しい。

アーカイバをいくつか使い比べると何割というレベルの速度差がある。
速い奴はちゃんとそういう所にも気を配ってる。


835 名前:デフォルトの名無しさん mailto:sage [2012/01/15(日) 23:21:05.40 ]
そういえば昔、NetWareというサーバOSがあったな
クライアントのローカルHDDをアクセスするよりも
LANでつながったNetWareサーバ上のファイルをアクセスする方が高速だった
古きよき時代

836 名前:デフォルトの名無しさん mailto:sage [2012/01/16(月) 01:37:22.73 ]
JavaのFutureとpthread_joinとの違いが、
スレッドプール使えるかどうかぐらいしか解からん。
アレは、pthread_joinとスレッドプール以外じゃ何が違うの?
(オブジェクトと例外返すのは置いといて)


837 名前:デフォルトの名無しさん mailto:sage [2012/01/16(月) 01:47:25.07 ]
いやFutureは結果返すためのものだからそれ置いといたらダメだろ

838 名前:デフォルトの名無しさん mailto:sage [2012/01/16(月) 02:01:11.36 ]
pthread_joinも結果は返せるからね。
pthread_joinを軽くラップするだけで、
例外を返すのもオブジェクトを返すのも簡単にできちゃう。
結果を返す事だけに注目すると差異としてはあまりに小さいと思うけど。

839 名前:デフォルトの名無しさん mailto:sage [2012/01/16(月) 11:48:41.44 ]
>>831
読みきってから処理するのではなく
読みながら処理する



840 名前:デフォルトの名無しさん [2012/01/16(月) 13:00:46.78 ]
無圧縮データでディスクIOが、どれくらい
コスト掛かるのか調べてみた。
調べ方は2つスレッドを走らせ、
片方はひたすらカウント、
もう片方はファイル読み込みしながら、
読み込んだバイト数分だけカウント。
どちらもカウント変数をクリティカルセクションで囲んだ。
CPUは2コア。

この条件で実行するとファイル読み込み
してるほうが1/8程度遅かった
遅い遅い言うけどそうでも無いのな。

841 名前:デフォルトの名無しさん mailto:sage [2012/01/17(火) 17:41:36.51 ]
キャッシュ読んでるだけじゃないのそれ

842 名前:デフォルトの名無しさん mailto:sage [2012/01/17(火) 20:46:09.02 ]
まぁ、NTFSの圧縮ファイルシステム使って早くなるなら、
みんな圧縮してるよね。

843 名前:デフォルトの名無しさん mailto:sage [2012/01/18(水) 00:09:55.35 ]
それは一旦全部解答してから読み込むからでしょ

844 名前:デフォルトの名無しさん mailto:sage [2012/01/18(水) 15:32:20.55 ]
その認識は完全に間違ってる
blogs.msdn.com/b/ntdebugging/archive/2008/05/20/understanding-ntfs-compression.aspx

845 名前:デフォルトの名無しさん mailto:sage [2012/01/21(土) 07:08:56.51 ]
2chのログは圧縮フォルダに入れた方が圧倒的に速い

846 名前:デフォルトの名無しさん mailto:sage [2012/01/22(日) 10:58:15.73 ]
パソコン側のHDDキャッシュがお馬鹿ってことじゃあ

847 名前:デフォルトの名無しさん mailto:sage [2012/01/23(月) 09:41:58.18 ]
>>846
正しいだろ。

848 名前:デフォルトの名無しさん mailto:age [2012/02/21(火) 23:37:31.35 ]
ディスク絡みのスレッドの話だけど、HDDのランダムアクセスの遅さに驚愕した。

任意のスレッド数(プール使用)で、複数同時にファイルを読み込み、
MD5ハッシュを取り出してファイル比較するツールを作った。
んで、1ファイル1MB未満のファイル群と、1ファイル40MBを超える
ファイル群に対して実行してみた。4コア環境で実行したら
1MB未満だと3スレッドが最速。40MB以上だと1スレッドが最速ってな結果になった。
40MB以上で、1スレッドだとディスクアクセスが100MB/sを超える。
40MB以上で、4スレッドだとディスクアクセスは30MB/s未満まで低下した。

みんなは、この辺どう回避してんの?

849 名前:デフォルトの名無しさん mailto:sage [2012/02/21(火) 23:46:23.99 ]
>>848
非同期IOとか、メモリマップドファイルとか。

複数スレッドから同時アクセスなんかしたら、ディスクシークが増えて、
帰って遅くなるのは当たり前。



850 名前:デフォルトの名無しさん mailto:sage [2012/02/21(火) 23:47:16.21 ]
>>848
NCQにまかせて神に祈る


ってのは冗談で
1. 読む順番が決まっているならデータをデフラグでその順番に並べておく
2. その順番に読めるように1スレッドで読みに行く


851 名前:デフォルトの名無しさん mailto:sage [2012/02/22(水) 00:02:11.03 ]
>>849
理屈じゃ分かっちゃいたんだけどねぇ。まさかここまで遅いとは・・・。

>>850
並列化は諦めるしかないのかねぇ。

852 名前:デフォルトの名無しさん mailto:sage [2012/02/22(水) 00:31:00.86 ]
ファイルを読むスレッド(1つだけ)とMD5の計算他をするスレッドを分けるとか?
CPU時間がどっちかに偏ってたらだめかもしれませんが。

853 名前:852 mailto:sage [2012/02/22(水) 00:34:57.35 ]
って850さんが既に言ってますね。ファイルを読むスレッド1+それ以外の計算をするスレッド複数。
そしてディスクアクセスの時間>>計算の時間なら、ディスクが物理的に1つしかない以上は並列化は無理かと。

854 名前:デフォルトの名無しさん mailto:sage [2012/02/22(水) 00:49:03.05 ]
>>852
それが微妙なんだよね。
MD5の計算って一般的に順序依存があるから、
1つ前に計算した計算結果が無いと、
次の計算が始められないんだよ。
そんなんもんで、ファイル別なら順序依存が無いから
とりあえず、1スレッド1ファイル処理にしてたんだけど。

実は、ディスクアクセスというよりMD5の
順序依存が一番足引っ張ってんのかもね。

あと、MD5の計算時間だけど読み込みの10倍遅いよ。

855 名前:デフォルトの名無しさん mailto:sage [2012/02/22(水) 00:57:48.08 ]
>>854
〜かもね、とかの妄想に付き合うのは疲れるから、調べてから書けよ

856 名前:デフォルトの名無しさん mailto:sage [2012/02/22(水) 01:17:35.11 ]
>>855
調べるつってもなぁ。発想の問題じゃない?
これ以上調べられることあるかい?

857 名前:デフォルトの名無しさん mailto:sage [2012/02/22(水) 01:18:33.05 ]
頼むから喧嘩はやめてくれよな

858 名前:デフォルトの名無しさん mailto:sage [2012/02/22(水) 01:18:41.54 ]
> 順序依存が一番足引っ張ってんのかもね。

を明らかにすればいいじゃない

859 名前:デフォルトの名無しさん mailto:sage [2012/02/22(水) 01:24:03.16 ]
>あと、MD5の計算時間だけど読み込みの10倍遅いよ。
あれ?それならいけるんじゃない?

仮に11コアのCPUがあったとして、
1コア目→ディスクから10個のファイルを読み出してメモリに吐く
2〜11コア目→1コア1ファイル分担当で計算
って形で10コアまでスケールするはずだと思うんだけど。コアはスレッドと読み替えてもok。




860 名前:デフォルトの名無しさん mailto:sage [2012/02/22(水) 01:33:14.66 ]
>>859
ロード時間L, MD5計算時間Mとすると(L=10M)
馬鹿正直にやったら10(L+M) = 110M
お前のやり方だと10L+M = 101M
どこがスケールしてるんだ?

ついでに2スレッドでも101Mは出ると思う


861 名前:デフォルトの名無しさん mailto:sage [2012/02/22(水) 01:34:10.53 ]
>>860
ごめんどっちが遅いのか勘違いした
吊ってくるわ


862 名前:デフォルトの名無しさん mailto:sage [2012/02/22(水) 01:39:04.31 ]
>>854
計算が10倍遅いなら、シングルリーダスレッドでも十分にペイする。
ただ、机上で計算すればあんたの実測値なら3並列と4並列に分かれ目がある。
ファイル一件の読み込みを1、比較するってことなんでサイズは全ファイル
ほぼそろってるとして、4対象の場合のそれぞれの最長パスは

1リーダ+4計算スレッド: 4+10 = 14
全部で1スレッド: 1*4+10*4 = 44
4(リーダ+計算)スレッド:1*(100/30)+10 = 13.33 (100MB/sが4スレで30MB/sになったから)

まあ実測すると他のプロセスとかとの兼ね合いでまた変わるだろうけど、
多分安定度で言えばシングルリーダスレッド+N計算スレッドじゃないかなあ。
OSのページキャッシュに乗っている事が期待できる状況ならまた別だけど。

863 名前:デフォルトの名無しさん mailto:sage [2012/02/22(水) 01:42:35.74 ]
>>858
ディスクアクセスの改善が無理ならMD5の
順序依存を直すしか無いと言えるんだけど。
もう本当に打つ手がないか意見が聞けないとなんとも。

>>859
確かにね。最終的にはそれが一番効率がいいのかなとも
思うんだけど、ただその方法は計算するファイルは1ファイルまるごと
読み込まないといけないんだよね。
そこがちょっともっといい方法が無いかと引っかかるよ。

864 名前:859 mailto:sage [2012/02/22(水) 01:45:16.15 ]
861が俺のレスみたいに見えるので一応自己弁護しておこうw
ロード時間L, MD5計算時間Mとすると10L=M
シングルスレッド→10(L+M)=110L
11コアによるマルチスレッド→10L+M=10.1L
とほぼ11倍の性能ということで理屈上スケールはするはずだ、と。もう寝るおやすみ〜

865 名前:デフォルトの名無しさん mailto:sage [2012/02/22(水) 01:46:07.56 ]
>>862
机上の計算の計算式がイミフなんだが

866 名前:860 mailto:sage [2012/02/22(水) 01:47:47.73 ]
>>864
うんごめん
そのとおり


867 名前:859 mailto:sage [2012/02/22(水) 01:49:07.58 ]
俺のアホー
マルチスレッドは10L+M=20Lだ。効率は50%弱か。今度こそおやすみー

868 名前:862 mailto:sage [2012/02/22(水) 02:01:42.37 ]
見直すといろいろあれだったので気にしないでw

869 名前: ◆0uxK91AxII mailto:sage [2012/02/22(水) 15:13:40.47 ]
thread一つ、非同期読込と計算を交互に行う。



870 名前:デフォルトの名無しさん mailto:sage [2012/02/22(水) 17:09:49.10 ]
読み込み時間がクリティカルなんだから
読み込みスレッドが他の作業をしたらダメなんじゃないの?

871 名前:デフォルトの名無しさん mailto:sage [2012/02/22(水) 19:17:39.81 ]
HDD一個に複数からアクセスすれば、パフォーマンス低下するのが当然じゃあ

872 名前:デフォルトの名無しさん mailto:sage [2012/02/22(水) 20:04:50.74 ]
SSDなら実測値が結構改善するんかね
大して普及してないから宛にならんけど

873 名前:デフォルトの名無しさん mailto:sage [2012/02/23(木) 00:31:39.79 ]
スレッド制御に頭使いすぎてI/Oウエイトによる遅延完全に無視してない?


874 名前:デフォルトの名無しさん mailto:sage [2012/02/23(木) 00:40:50.43 ]
>>872
普及はどこから出てきた

875 名前:デフォルトの名無しさん mailto:sage [2012/02/23(木) 01:04:22.28 ]
>>874
SSDから。

876 名前:デフォルトの名無しさん mailto:sage [2012/02/23(木) 01:07:07.00 ]
いやだから。
SSDがとんだけ普及してるか、は実測値に影響する項なのか?ってことだろ

877 名前:デフォルトの名無しさん mailto:sage [2012/02/23(木) 01:23:30.75 ]
普及してるかどうかは実測値には影響しないよ。
SSD上での実測値改善が見られるとありがたいけど、
世の中SSD搭載してないPCも多いから、
SSDだけで速くなるプログラムはよくないよねって話しだし。


878 名前:デフォルトの名無しさん mailto:sage [2012/02/23(木) 01:25:38.17 ]
そっちかよ
自分とこの環境で動かすんじゃないのか

879 名前:デフォルトの名無しさん mailto:sage [2012/02/23(木) 01:49:14.20 ]
自作のハッシュ計算ツールだけど、MD5計算速度はキャッシュに乗ってる状態だと
3GHz弱のCore2Duo程度のCPUでも300MB/sは超えてるぞ。
計算のが十倍遅いってどういうことだ?
HDDなんて速くても100MB/s題だと思うが…




880 名前:デフォルトの名無しさん mailto:sage [2012/02/23(木) 01:57:30.10 ]
スレッド構成を書いてもらわないとなんとも言えないなぁ
単にシングルスレッドなら100MB/s超えるしね

881 名前:デフォルトの名無しさん mailto:sage [2012/02/23(木) 01:59:55.78 ]
>>879
読み込み時間を差し引いた計算時間はどれぐらいだったの?






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<243KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef