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 正しいだろ。
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 読み込み時間を差し引いた計算時間はどれぐらいだったの?
882 名前:デフォルトの名無しさん mailto:sage [2012/02/23(木) 02:05:32.93 ] >>879 300MB/sってのは、MD5の関数なりクラスなりが1秒間に 計算できた情報量という理解であってる?
883 名前:デフォルトの名無しさん mailto:sage [2012/02/23(木) 02:07:57.39 ] 読み込みと計算は別スレッドで同時にやってるから正確には分からんな。 まあいろいろ状況によって時間が変わるけど、計算だけなら最速時で400MB/sくらいだった希ガス。 ああもちろん、読み込みやってもキャッシュに乗ってたら最速だとほぼ同じくらいまで行くよ。
884 名前:デフォルトの名無しさん mailto:sage [2012/02/23(木) 02:31:42.72 ] 純粋な計算速度が負けるってのは構成が gcc+linux+Phenom X4 1.8Ghz だからなのかねぇ
885 名前:デフォルトの名無しさん [2012/02/25(土) 14:26:44.01 ] ちょっとスレッドとは違うかもしれないんだけど メッセージキューを設計しています シグナルハンドラからキューに積みたいんですが どうしても排他制御ができません うまい方法はありますでしょうか
886 名前:885 mailto:sage [2012/02/25(土) 14:28:07.28 ] 自己解決しました
887 名前:デフォルトの名無しさん mailto:sage [2012/02/28(火) 00:27:52.96 ] C# の.NET4.0なんですけど List<Double> hoge は適当な値が入っているとして Parallel.For(0,hoge.Count,(val)=> { hoge[val] = 0.0; }); とした場合、常にhogeの中身が全て0.0になりますか? この処理はLockしなくても大丈夫のような気がするんですが少し心配です。
888 名前:デフォルトの名無しさん mailto:sage [2012/02/28(火) 00:38:36.19 ] MSの今のList<T>の実装では問題ないはずだけど保証されているわけではない でもそれデリゲート呼び出しのコストがかさむから普通にループ回したほうが速いだろ 並列でやるんなら、4コアなら領域を4分割して中でループ回したほうがいい
889 名前:デフォルトの名無しさん mailto:sage [2012/02/28(火) 00:46:40.99 ] つまり、>>887 を Parallel.Invoke(()=> { for(int i = 0;hoge.Count/4;i++) { hoge[i] = 0.0; } }, ()=> { for(int i = hoge.Count/4;(hoge.Count/4)*2;i++) { hoge[i] = 0.0; } } ・・・(以下略) とした方が良いということですか?
890 名前:デフォルトの名無しさん mailto:sage [2012/02/28(火) 00:47:12.66 ] 訂正 読み取りだけならスレッドセーフだと書いてあるな
891 名前:デフォルトの名無しさん mailto:sage [2012/02/29(水) 12:48:47.15 ] いくつかstatic変数があって、それぞれに書き込み続ける スレッドを作ったのですが、コンテキストスイッチが発生 しまくってます(2000〜3000/秒) int a, b, c; DWORD __stdcall A(void*){ a = ... } DWORD __stdcall B(void*){ b = ... } DWORD __stdcall C(void*){ c = ... } それぞれのスレッドを単独で実行させた場合は、それほど スイッチしないので、キャッシュ競合が原因なんでしょうか。 それぞれの変数が同じキャッシュラインに乗らないようにするには どうすれば良いですか? それともキャッシュは関係ないですか? VC10です。
892 名前:デフォルトの名無しさん mailto:sage [2012/02/29(水) 21:27:49.37 ] なんでキャッシュでコンテキストスイッチが起こるのよ…
893 名前:デフォルトの名無しさん mailto:sage [2012/02/29(水) 22:05:31.00 ] >>891 コンテキストスイッチは関係ない。 >それぞれの変数が同じキャッシュラインに乗らないようにするには キャッシュは8〜32バイトぐらいの単位で管理しているから、 適当に無駄なメモリを確保して、それぞれのメモリアドレスが 隣接しないようにすればよい。
894 名前:デフォルトの名無しさん mailto:sage [2012/02/29(水) 22:19:38.86 ] >それぞれのスレッドを単独で実行させた場合 はああ?
895 名前:デフォルトの名無しさん mailto:sage [2012/03/01(木) 00:23:04.48 ] メモリバリアの間違い?
896 名前:デフォルトの名無しさん mailto:sage [2012/03/01(木) 00:47:56.20 ] なんでメモリバリアが出てくんだよ
897 名前:デフォルトの名無しさん mailto:sage [2012/03/01(木) 00:55:22.06 ] コンテキストスイッチみたいなのはCPUを占有すると起こるものなの 無限ループしてパソコンがハングしたらどうするつもりなんだろうね
898 名前:デフォルトの名無しさん mailto:sage [2012/03/01(木) 01:28:54.69 ] 1スレッドで実行→コンテキストスイッチが起こらない 3スレッドで実行→コンテキストスイッチが起こりまくる これのどこが悪いのか俺にはわからないのだがとりあえずCPUはいくつある?
899 名前:デフォルトの名無しさん mailto:sage [2012/03/01(木) 08:36:10.06 ] >>898 cpuは4コアです。 >>897 各ループにSleepは挟んでます。 >>893 無駄なメモリを置いて、キャッシュ対策しようと思います。 また、コンテキストスイッチ数が多いのは、別の原因を探してみます。
900 名前:デフォルトの名無しさん mailto:sage [2012/03/01(木) 08:45:24.09 ] Sleep入れたらそりゃぁ、コンテキストスイッチもするだろうよ。
901 名前:デフォルトの名無しさん mailto:sage [2012/03/01(木) 15:54:56.63 ] コンテキストスイッチさせるのがSleepの目的のひとつだもんよ。
902 名前:デフォルトの名無しさん [2012/03/01(木) 16:16:45.26 ] static変数に書き込み続けるスレッドとか Sleep挟んでますとか キャッシュ競合を避けるとか 何 考 え て る の よ ?
903 名前:デフォルトの名無しさん mailto:sage [2012/03/01(木) 16:43:35.12 ] マルチプロセスほど枯れきっちゃいない技術だから、ということでしょうがあんめぇ
904 名前:デフォルトの名無しさん mailto:sage [2012/03/01(木) 17:01:12.69 ] スレッドとかどう捉えてるんだろうね?
905 名前:デフォルトの名無しさん mailto:sage [2012/03/01(木) 19:41:07.35 ] >Sleep 噴いたわw
906 名前:デフォルトの名無しさん mailto:sage [2012/03/01(木) 20:09:58.15 ] Windowsなんて常時、100スレッド以上動いてるのに。
907 名前: ◆0uxK91AxII mailto:sage [2012/03/01(木) 20:27:46.46 ] 4CPU環境、速い順に キャッシュラインを別にした3thread キャッシュラインが同じっぽい3thread threadを作らずに1thread
908 名前:デフォルトの名無しさん mailto:sage [2012/03/01(木) 20:42:09.96 ] >>907 >キャッシュラインが同じっぽい3thread >threadを作らずに1thread このふたつどっちが早いかは環境やプログラムによるだろ。 後者の方が早くなる事もあるよ。
909 名前: ◆0uxK91AxII mailto:sage [2012/03/02(金) 10:33:44.96 ] 環境と粒度に依存。
910 名前:デフォルトの名無しさん mailto:sage [2012/03/26(月) 15:59:30.82 ] メインプロセスと同じ物理コア内のHyperThreading論理コアで実行されている サブプロセスが、メインプロセスの動作を邪魔しないようにするためのAPI関数は ありませんか? 例えば、SetProcessAffinityMaskを同じ値にした2つのプロセスは SetPriorityClassでサブの優先度を下げれば、メインプロセスが 動いているときはサブプロセスはほとんど動作しなくなります。 しかし、SetProcessAffinityMaskを、メインプロセスで1、サブプロセスで2に した場合、サブプロセスの優先度が低いにもかかわらず、メインプロセスと CPUリソースを均等に割り振っているようです。 これを防ぐための、SetProcessPriorityに変わるようなAPI関数はありませんか?
911 名前:910 mailto:sage [2012/03/26(月) 16:18:58.25 ] superπを2つのフォルダにコピーして1つをメイン、もう1つをサブとする。 メインのPriorityClassをNORMAL、AffinityMaskを1に固定。 サブのPriorityClassとAffinityMaskを変化させたときの、2つのsuperπの 838万桁計算時間を比較。 記号 P サブのPriorityClass, A: サブのAffinityMask: メインの時間/サブの時間 A P NORMAL, A 1: 5:19/5:22 B P BELOW, A 1: 2:57/5:38 C P NORMAL, A 2: 3:31/3:30 D P BELOW, A 2: 3:30/3:30 E P NORMAL, A 4: 2:53/2:47 F P BELOW, A 4: 2:52/2:47 Dのパターンでのタイムを見ると、サブの優先度がメインより低いにもかかわらず Cのパターンと同じになっています。 この状況でメインのタイムはFと同等で、サブのタイムはBよりは短くなるような、 SetPriorityClassのような関数はありませんか?
912 名前:デフォルトの名無しさん mailto:sage [2012/03/26(月) 16:27:27.46 ] そんなaffinity maskを設定するのが悪い
913 名前: ◆0uxK91AxII mailto:sage [2012/03/26(月) 16:47:02.42 ] 下手の考え休むに似たり。
914 名前:910 mailto:sage [2012/03/26(月) 16:56:47.14 ] AffinityMaskを設定したのは、確実に再現させるためです。 実際には設定しなくても、多くのプロセスが動いている場合に 優先度の高いプロセスが、優先度の低いプロセスに阻害される 可能性を排除したいのです。
915 名前:デフォルトの名無しさん mailto:sage [2012/03/26(月) 20:42:35.46 ] そんなπとかどーでもいいもん計算せずに実用的なもんつくれよ。 πなんて20桁でもあれば地球の外周を計算できるぞ。
916 名前:デフォルトの名無しさん mailto:sage [2012/03/26(月) 22:29:33.41 ] >>910 >メインプロセスの動作を邪魔しないようにするためのAPI関数はありませんか? OSは何? >Dのパターンでのタイムを見ると、サブの優先度がメインより低いにもかかわらず >Cのパターンと同じになっています。 もしかしてWindows? Windowsにはプライオリティブーストなど、CPU占有率の高いプロセスのプライ オリティを強制的に下げる機能や、アクティブウィンドウを持つプロセスの プライオリティを強制的に上げる機能があるから、設定した通りのプライオリティ で動作している事は保証されないよ?
917 名前:910 mailto:sage [2012/03/27(火) 09:12:32.64 ] >そんなπとか superπを作っているのではなく、優先度の制御ソフトを作ろうとしています。 具体的には動画エンコードしながらゲームしているのですが、 core 2のときはエンコーダのプロセス優先度をIDLEかBELOW_NORMALにしておけば ゲームのフレームレートが落ちることはなかったのですが、 core i7にしたら落ちるようになってしまったのです。
918 名前:910 mailto:sage [2012/03/27(火) 09:28:22.17 ] >OSは何? Windows全般ですが、7固有のAPIでもかまいません。 PriorityBoostで優先度が動的に上下するのは知っています。 BのパターンのメインプロセスはE/Fに比べて 若干時間が長くなっており、これがPriorityBoostなどによる 効果だと思いますが、これくらいは問題としていません。
919 名前:デフォルトの名無しさん mailto:sage [2012/03/27(火) 09:36:39.40 ] >>917 動画エンコードプロセスに対して、Battle Encoder Shirase みたいな制御をするとか?
920 名前:デフォルトの名無しさん mailto:sage [2012/03/27(火) 10:12:01.02 ] >優先度の高いプロセスが、優先度の低いプロセスに阻害される HTに係るCPUの内部状態を、そのCPU上で動いているプロセスから、 ソフト的に制御する方法なんて無いよ。 ICEでも使って外部からコントロールするなら兎も角。 ・・・っていうか、そのアプローチは不可能に近いって何となくわからない? >Cのパターンと同じになっています。 ソフト(OS)から見たら、HTなんて関係ないし、二つのCPUは等価なのだから、 ソフトにスケジューリングを任せてたら、 二つのスレッドの実行時間がほぼ同じになるのは当然。 >>917 >core i7にしたら落ちるようになってしまったのです。 それホントにCPU依存の話か? Core2とi7はソケット形状が違うので、CPU以外にも色々と構成が違うはずだが。 VIAとかの互換CPUならともかく、インテル純正CPUでその手の話って聞かないからさ。 もしかしてCore i7のCPU内蔵GPUを殺すと意図したとおりに動いたりとかしないか? だとしたらGPUとCPUでメモリバス食いあってるか、GPUのハードウェアエンコーダが 有効になってて、GPU食いあってるだけだと思うぞ。
921 名前:910 mailto:sage [2012/03/27(火) 10:53:19.74 ] >919 このソフトを試してみたいと思います。 これでうまくいくようなら、メインプロセスと同じ物理コアの別論理コアで 動くスレッドに対して同じような処理をするプログラムを作ってみようと思います。 >920 ハード的に制御してくれるAPIがないか知りたかったのです。 エンコーダはマルチスレッドですが、GPUは使っていません。 ゲームとエンコーダをE/Fのパターンのように違う物理コアのAffinityMaskにしてしまえば ゲームのフレームレートが落ちないことは確認しました。
922 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/03/29(木) 23:58:28.02 ] >>911 その計算時間どういう操作してどう計ったの? 838万ケタを同時に計算開始しただけ? 論理CPUの割り当てが別なら優先度なんて関係ないに決まってるんだが、意味分かってるか? ゲームメインを物理コアにだけマスク指定したら問題なさそうな気がするが、それじゃうまくいかないか?
923 名前:910 mailto:sage [2012/04/02(月) 12:23:22.30 ] 計算時間はsuperπが計測しています。 同時に計算開始しました。 2つの開始ボタンを押す間の数百ミリ秒は、今回は無視です。 >論理CPUの割り当てが〜 だから、それを優先付けるAPIはないかという質問です。 HyperThreadingを使用するとパフォーマンスが落ちると問題視され Pentium4からずいぶん時間がたったので、そろそろ出ていないかと思いました。 ないので代替案を提示してくださってるのだと思いますが。 >ゲームメインを物理〜 それだと、論理コアが1つ遊んでしまいます。
924 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/02(月) 17:53:01.73 ] 遊べば他方を圧迫しない、働けば圧迫する HTのために2つあるのは状態に関するレジスタ類だけだもの
925 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/02(月) 20:40:06.53 ] 自分で設定する気が無いんならOSに任せろ
926 名前:915 mailto:sage [2012/04/02(月) 20:57:35.84 ] >>923 SetProcessAffinityMask msdn.microsoft.com/ja-jp/library/cc429334.aspx ムダだろうがこれ使ってみれば?
927 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/02(月) 21:05:59.53 ] 既出か。メンゴメンゴ。
928 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/02(月) 21:25:52.93 ] >>ゲームメインを物理〜 >それだと、論理コアが1つ遊んでしまいます。 何を言ってるのか分からなくなってきた。 論理コアをあそばせるのがもったいないほどCPUを使い切るマルチスレッド化が出来てるのか? もうちょっと詳しくどういう動作をさせてるのか、どういうスレッド構成になってるのか書いてくれ。 まさかCPUパワーが余ってるのに論理コアが遊んでるのは許せないとかとち狂ったこと言ってないよな、念のために聞くが。
929 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/02(月) 21:29:09.18 ] >>928 どんな理由でもかまわないだろ・・・
930 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/02(月) 21:44:51.68 ] 結局のところ>>924 でどうにもならないんじゃないの?
931 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/02(月) 23:47:25.54 ] 元の質問に誰も答えないのは、万が一あったりするとアレだからだろうねぇ。 でも、さすがに無いと思うよ、そんなAPIは。 別な方法で妥協するしかないんじゃないかな。
932 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/03(火) 07:42:04.28 ] あるか否かは、CPUのニーモニックコードのリストを見ればわかるよ。 そこに命令が用意されていないなら、CPUの内部状態をコントロールしようがない。 非公開命令が用意されている可能性は残るけどな。
933 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/03(火) 11:36:54.07 ] 結局一緒じゃねーか。 あとそういうニーモニックがあるかどうかじゃ確実には分からんよ。 無いと思うけどね仕組み上から考えても。
934 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/03(火) 14:07:48.98 ] なんでハードウェアの話になってしまったのかよくわかんないけど、 OS のスケジューリングの話じゃないの? こんなのとか。 ttp://kerneltrap.org/node/391 Windows も HT を意識したスケジューリングをしてくれればいいのにね。
935 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/03(火) 15:03:29.48 ] そりゃOSレベルじゃ制御してない部分の話だもん。 どころかハードレベルでも制御不能だろってのが優勢。
936 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/04(水) 07:28:13.10 ] >>934 してるよ www.dosv.jp/feature/0912/04.htm APIでプログラマに公開されてるかは知らんが
937 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/04(水) 10:42:53.69 ] 物理マルチコアにHTなんていらないんじゃないかな
938 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/04(水) 10:44:43.96 ] HTをONにすると2000ではひっかかりまくるが、XPではスムーズ。 どうみても対応している。
939 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/04(水) 11:02:06.05 ] ただlinuxみたいに同一物理コアの別論理コアに割り当てられたスレッドの優先順位を考慮して タイムスライスの比率を変えるようなことはしてないね。
940 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/04(水) 11:08:09.89 ] 別コアなのにタイムスライスって、スレッドを一時停止してるっことなんだが、 Linuxではそんなことしてるのか。逆にコスト高くつくんじゃないのか。
941 名前:910 mailto:sage [2012/04/04(水) 11:42:02.39 ] HyperThreadingは空いている演算器を有効に使うためのものなのに メインで使っている演算器も奪ってしまうのはおかしいと考えており 別のOSでは実際にそれを回避するようにもなっているということで とりあえず安心しました。
942 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/04(水) 13:07:41.32 ] なんというか・・・ 同時に動かすから、空いてるのを有効に使えるのよ そして同時に動かせば他方を圧迫する 圧迫を回避する=片方を止める=空いてるのを使えてない なのよ
943 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/04(水) 14:29:03.38 ] >>941 なってねーよ馬鹿かお前は。
944 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/04(水) 14:30:35.88 ] あいつは人の話を聞かないからなあ。 何でも都合よく解釈しやがる。
945 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/05(木) 13:36:26.86 ] そんな理論武装で大丈夫か?
946 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/06(金) 15:00:20.07 ] pthread_rwlockの使い方をおしえて
947 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/06(金) 16:30:03.14 ] >>946 その前に聞くが、pthread_mutex_lockの使い方くらいは知っているのか? pthread_rwlockはそれより厄介だぞ。 www.tsoftware.jp/nptl/ の図4が理解できないならやめとけ。 つーか、本当にrwlockが必要なのか?
948 名前:デフォルトの名無しさん mailto:sage [2012/05/11(金) 15:36:21.96 ] 2CoreのCPUなら問題ないのに、 HTをONにするとフリーズしたり不安定になるプログラムって何が原因なんだろう?
949 名前:デフォルトの名無しさん mailto:sage [2012/05/11(金) 15:41:22.67 ] 複数のスレッドを使うプログラムだろうから、スレッド間の同期がいい加減なのだろう。
950 名前:デフォルトの名無しさん mailto:sage [2012/05/12(土) 01:16:48.20 ] 同時に動くとまずいコードがあるんだろう
951 名前:デフォルトの名無しさん mailto:sage [2012/05/12(土) 12:53:15.98 ] 2Coreなら大丈夫というのがおかしい。
952 名前:デフォルトの名無しさん mailto:sage [2012/05/12(土) 13:07:54.49 ] 別におかしくないよ。
953 名前:デフォルトの名無しさん mailto:sage [2012/05/12(土) 13:38:09.65 ] いやおかしい。 おかしくないなら、2CoreでOKで、HTだとダメなパターンプリーズ。
954 名前:デフォルトの名無しさん mailto:sage [2012/05/12(土) 13:45:24.65 ] ドライバレベルなら昔あったな。 省電力でCPUクロックダウン/休止させる時にHTなので全部止まっちゃいました(テヘっ)ってのが。
955 名前:デフォルトの名無しさん mailto:sage [2012/05/12(土) 13:47:28.79 ] 試してみて動いた=OKだと思ってるなら根本的に勘違いしてる
956 名前:デフォルトの名無しさん mailto:sage [2012/05/12(土) 13:51:32.68 ] >>953 そんなこと考えてる暇あったら、HT時に起こってる問題を正確に掴むべき。 ちょっとしたタイミングの違いで動いたり、動かなかったりなんてのはいくらでもある。
957 名前:デフォルトの名無しさん mailto:sage [2012/05/12(土) 13:53:22.20 ] おまえの勘違い半端ねぇ
958 名前:デフォルトの名無しさん mailto:sage [2012/05/12(土) 13:54:19.83 ] たまたまの話ならどうでもいい。 頭の悪い突っ込みは必要ないから。
959 名前:デフォルトの名無しさん mailto:sage [2012/05/12(土) 13:55:56.52 ] 突っ込みはしたものの、 HTだけダメなパターンはなに一つも思いつきませんでした。 ごめんなさい。
960 名前:デフォルトの名無しさん mailto:sage [2012/05/12(土) 14:01:26.21 ] お前に思いつくかどうかなんてどうでも良いんだよ。
961 名前:デフォルトの名無しさん mailto:sage [2012/05/12(土) 14:03:59.23 ] >ちょっとしたタイミングの違いで動いたり、動かなかったりなんてのはいくらでもある。 この原因は二つ。 ・同期処理をしていない。 ・同期処理が必要な部分を洗い出せていない。 HTがダメで2CoreがOKな理由になってないなぁ。 考える暇がないのか考える頭がないのか。
962 名前:デフォルトの名無しさん mailto:sage [2012/05/12(土) 14:06:39.92 ] 相談スレで相談したら自分でやれって言う奴を相手にするな。 ただ煽りたいだけの馬鹿なんだから。
963 名前:デフォルトの名無しさん mailto:sage [2012/05/12(土) 14:06:45.64 ] 現に原因不明の不具合を目の前にして、そんな事考えるだけ無駄だと分からないやつは開発向いてない。
964 名前:デフォルトの名無しさん mailto:sage [2012/05/12(土) 15:03:57.50 ] 問題の起きるメカニズムを解明するのは興味深いが、 解明したところで自己満足以外に得られるものがないからな 結局きっちり同期するしかないんだし
965 名前:デフォルトの名無しさん mailto:sage [2012/05/12(土) 15:05:54.53 ] 二つの処理が30ナノ秒以内に終わらないとタイムアウト するウンコな処理があって2CPUだと偶然動いたとか。 KUSOなコードに論理性を求めるほうが時間の無駄。 単にHT環境で再現するという明らかな不具合を直せばよろしい。
966 名前:デフォルトの名無しさん mailto:sage [2012/05/12(土) 18:26:42.65 ] Pen4の頃のHTを使っていた時は明らかに普通のデュアルCPUと タイミングが違ってバグの出方も全然違ったよ >>965 の言っているように運よく再現できる環境があるなら そこで治せばいいんじゃない
967 名前:デフォルトの名無しさん mailto:sage [2012/05/12(土) 20:16:48.32 ] >>953 1スレッドがループ内でレジスタを使い切るパターンだろ フリーズまではいかんが、挙動が悪くなる
968 名前:デフォルトの名無しさん mailto:sage [2012/05/12(土) 20:37:58.42 ] 自分で2CoreではセーフなのにHTをオンにしたら動かない!って言ってるのに、 「そんなパターンは無い!」とか分裂症ですか?って感じ。 そんなパターンがあるからその現象が発生してるのは明らかなのに。 現実逃避もいい加減にしろよ。
969 名前:デフォルトの名無しさん mailto:sage [2012/05/12(土) 21:02:29.35 ] スペック厨で、自分の最強ハードに問題が有るって事が気に入らないんだろう 目の前で起きてる問題をどう解決するかが問題なんだがオタクは空気がよめないね
970 名前:デフォルトの名無しさん mailto:sage [2012/05/12(土) 21:07:20.42 ] HTをオフにしたら動きました。
971 名前:デフォルトの名無しさん mailto:sage [2012/05/12(土) 21:19:10.76 ] >>953 void threadA(){ while(1); } void threadB(){ while(1); }
972 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 02:00:44.76 ] それのどこがHTがダメなんだ?
973 名前:デフォルトの名無しさん mailto:sage [2012/05/14(月) 09:08:39.75 ] >>971 シングルコアならOSがタイムシェアリングして均等に実行してくれる。 マルチコアならOSがそれぞれのコアに割り当てて均等に実行してくれる。 HTだとOSはそれぞれの仮想コアに割り当てて均等に実行しているつもりでも、 片方のスレッドが動いている間、もう片方のスレッドは満足に実行されない。 上のようなBusyLoop場合とくに顕著で、何もしない処理がCPUを占有する事になる。 これを防ぐために何もしないから他の仮想コアに処理を渡してよい事を示す 命令が追加されている。
974 名前:デフォルトの名無しさん mailto:sage [2012/05/14(月) 16:30:14.82 ] htでもだいたい均等に割り振られるが。
975 名前:デフォルトの名無しさん mailto:sage [2012/05/14(月) 17:15:11.15 ] HT非対応なんだろ
976 名前:デフォルトの名無しさん [2012/05/18(金) 21:50:52.80 ] すいません。教えてください。 signalマスクをかけたスレッドの関数内で、popenをコールしてるんですが、ctrl+Cするとポインタ(NULLでないpopenの戻り値)からのfgetsが成功する時としない時があるんですが留意する事って何かありますか? ちゃんとpthread_joinは出来ているのでマスクには問題無いと思うのですが。 宜しくお願いします。