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】 【言語】 【実行環境】 【その他特記する事項】
747 名前:デフォルトの名無しさん mailto:sage [2011/10/19(水) 08:42:15.18 ] メモリバリアとか難しすぎて頭おかしくなりそう atomic_int a = 0, b = 0; //thread1 a.store_acquire(1); int x = b.load_release(); //thread2 b.store_acquire(1); int y = a.load_release(); これでx == 0 && y == 0が真になることがあるという話なんだけど頭の中でどう考えてもならない いったいどういうカラクリでx,yが同時に0になるの?
748 名前:デフォルトの名無しさん mailto:sage [2011/10/19(水) 09:23:38.50 ] >>747 正しくはstore_releaseとload_acquireね。 store & acquire とか、load & release とかいう組み合わせはない。
749 名前:デフォルトの名無しさん mailto:sage [2011/10/19(水) 13:56:45.85 ] >>747 他のスレッドに値が反映されるまでラグがあると考えればいいよ
750 名前:デフォルトの名無しさん mailto:sage [2011/10/22(土) 16:08:33.08 ] >>747 atomic_int a = 0, b = 0; //thread1 a.store_release(1); int x = b.load_acquire(); //thread2 b.store_release(1); int y = a.load_acquire(); だとすると、 load_acquire()はstore_release()の前に移動できる。
751 名前:デフォルトの名無しさん mailto:sage [2011/10/22(土) 21:42:35.60 ] そういやなんで皆ロックの速さに拘るの? スレッド全体の処理量に対してロックが必要なのは極僅かでしょ。
752 名前:デフォルトの名無しさん mailto:sage [2011/10/22(土) 21:55:02.53 ] いやロックの話じゃなくてアトミック操作の話
753 名前:デフォルトの名無しさん mailto:sage [2011/10/22(土) 22:55:15.90 ] 排他ロックしたら負け
754 名前:デフォルトの名無しさん mailto:sage [2011/10/23(日) 09:19:45.48 ] volatileで十分w
755 名前:デフォルトの名無しさん mailto:sage [2011/10/23(日) 09:26:02.86 ] >>754 解雇
756 名前:デフォルトの名無しさん mailto:sage [2011/10/23(日) 14:57:53.13 ] volatileでどんなコード吐くかみんとハマるよ
757 名前:デフォルトの名無しさん mailto:sage [2011/10/23(日) 15:13:30.40 ] javaやC#ならvolatileで充分だろうな。 CとC++のvolatileは別もんだから役に立たん。 詳しくはC++11スレを見てこい。
758 名前:デフォルトの名無しさん mailto:sage [2011/10/23(日) 15:22:42.74 ] volatileかmutexかなんてのはこっちでする話だろうに なんであのスレでしつこく長引いてたんだか
759 名前:デフォルトの名無しさん mailto:sage [2011/10/23(日) 16:16:29.85 ] >>758 言語仕様読まないバカが粘着したせい
760 名前:デフォルトの名無しさん mailto:sage [2011/10/23(日) 19:18:18.55 ] C/C++のvolatileはvolatileで目的があって用意されたものだがマルチスレッドと直接関係はない低水準機能で、 使う場合もあれば使わない場合もあると。 volatile std::atomic<T>はJavaのvolatileとほぼ同じ意味だそうだが。
761 名前:デフォルトの名無しさん mailto:sage [2011/10/23(日) 19:28:17.70 ] コンパイラによる静的な省略や並び替えは抑制できるけど CPUが実行時に行う最適化には関与しないから無意味
762 名前:デフォルトの名無しさん mailto:sage [2011/10/23(日) 21:37:00.66 ] はあ?
763 名前:デフォルトの名無しさん mailto:sage [2011/10/23(日) 21:58:56.17 ] >>762 少しは勉強しろ
764 名前:デフォルトの名無しさん mailto:sage [2011/10/23(日) 22:06:44.84 ] >>750 atomic_int a = 0, b = 0; //thread1 a.store_release(1); int v = a.load_acquire(); int x = b.load_acquire(); //thread2 b.store_release(1); int w = b.load_acquire(); int y = a.load_acquire(); のときでも x == 0 && y == 0 はありうる?
765 名前:デフォルトの名無しさん mailto:sage [2011/10/23(日) 22:06:59.86 ] 意味不明なこと言ってるのがわかってないの?
766 名前:デフォルトの名無しさん mailto:sage [2011/10/23(日) 22:07:49.18 ] >>765 自己レス?
767 名前:デフォルトの名無しさん mailto:sage [2011/10/23(日) 22:09:36.03 ] >>764 //thread1 int v = a.load_acquire(); int x = b.load_acquire(); a.store_release(1); //thread2 int w = b.load_acquire(); int y = a.load_acquire(); b.store_release(1); リオーダーされてこうなったら全部0
768 名前:デフォルトの名無しさん mailto:sage [2011/10/23(日) 22:11:32.64 ] >>767 てきとーなこと書くなよ
769 名前:768 mailto:sage [2011/10/23(日) 22:24:48.00 ] >>767 すまん勘違いしてた。同じa同士のloadとstoreはひっくり返るはずが無いと思ったが実際の動作ならそうなりえるよね。
770 名前:デフォルトの名無しさん mailto:sage [2011/10/23(日) 23:05:40.90 ] >>760 それvolatile無くてもJavaのvolatileと同じ。 volatile変数としてatomicを使えるようになってるだけで、 特別扱いはない。
771 名前:デフォルトの名無しさん mailto:sage [2011/10/23(日) 23:19:22.09 ] >>767 ,769 同じスレッド上でのリオーダーの話と別のスレッドから見たときの順序の話がごちゃ混ぜになってないか? a.store_release(1); int v = a.load_acquire();//a.store_releaseとa.load_acquireは同じオブジェクトなのでリオーダーできない。 int x = b.load_acquire();//その結果b.load_acquireも上に移動できない。 しかしながらseq_cstじゃ無いので他のスレッドから見たときの順序が保障されないので x == 0 && y == 0 はありうる これでいいんじゃね?
772 名前:デフォルトの名無しさん mailto:sage [2011/10/23(日) 23:32:07.62 ] そのコードで会話が成立してるところが凄いかも
773 名前:デフォルトの名無しさん mailto:sage [2011/10/24(月) 00:06:26.80 ] いまから一生懸命C++11での質問してる人がいるけど、 まともに使えるコンパイラでてんの? メモリバリアとかよくわかんないなら、 今使えるライブラリを動かして勉強した方が早いんとちゃう? 3年後11に本腰入れたって出遅れはしないだろ。
774 名前:デフォルトの名無しさん mailto:sage [2011/10/24(月) 00:09:00.47 ] 3年後には次の規格が出てるよ
775 名前:デフォルトの名無しさん mailto:sage [2011/10/24(月) 00:19:19.45 ] >>738 なみの処理じゃ、IOの影響がでかすぎて、 速度の優劣はIO次第になるな。 例えば、1600個の画像からMD5を採ったとき、 IO状態次第で0.7秒から、1分40秒もの差がでる。 恐らく前者はキャッシュ効果だろう。 スレッドを4本でスレッドプール使って計算したが、 確かに計算は速いものの、結局IOがもたつくとどうしようもなく遅い。
776 名前:デフォルトの名無しさん mailto:sage [2011/10/24(月) 00:20:20.50 ] >>774 03から11の間に規格あったっけ?
777 名前:デフォルトの名無しさん mailto:sage [2011/10/25(火) 11:21:35.66 ] 【OS】 WindowsXP SP3 【言語】 c++ 【実行環境】VC++ 2010 + boost 【その他特記する事項】- 以下に示す2パターンの記述で、どっちでもイイヨ…、どちらが良い、どちらもダメで他の方法が良いか、ご指導お願いします。 マルチスレッド処理するクラス(以下、クラスA)をつくっています。 以下のスレッドを生成します。 ・ネットワーク経由でデータを受信する ・受信したデータを内部で加工する ・加工したデータを画面に表示する スレッドを実行する方法について考えています。 { クラスAのインスタンスaを作成 aとスレッド関数名を指定してスレッド生成・開始×3 join } とするか { クラスAのインスタンスを生成して コンストラクタ内でスレッドを生成・開始 }// デストラクタ内でjoin とするか迷っています。 普通は前者のようにする気がします。 後者にすると、一見スレッドが生成されていることに気がつきません。 ですが、クラス・インスタンスの独立性的なもので考えると後者でも良いような気がしました。 が、結局、デストラクタでjoinすることで、 元のスレッドが、a配下のスレッドの終了を待機してしまう、という訳のわからなさがあります。 以上、よろしくお願いします。
778 名前:デフォルトの名無しさん mailto:sage [2011/10/25(火) 11:37:57.33 ] どうでもいいよ どっちみちそんな手軽にあちこちで無意識に使うもんじゃないでしょ
779 名前:デフォルトの名無しさん mailto:sage [2011/10/25(火) 11:46:17.15 ] デストラクタでJoin失敗したらどうすんの
780 名前:デフォルトの名無しさん mailto:sage [2011/10/25(火) 12:39:33.84 ] スレッドがどうとかより機能別に関数を作れ
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 正しいだろ。