1 名前:デフォルトの名無しさん mailto:sage [2008/07/05(土) 19:26:16 ] マルチスレッドプログラミングについて語るスレ ■前スレ マルチスレッドプログラミング相談室 その6 ttp://pc11.2ch.net/test/read.cgi/tech/1187008532/ ■過去スレ その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/ OS・言語・環境は問わないが、それゆえ明記すべし。 テンプレ 【OS】 【言語】 【実行環境】 【その他突起する事項】
448 名前:デフォルトの名無しさん mailto:sage [2009/02/27(金) 19:47:19 ] >>443 OpenMP に期待しすぎ。 何でもかんでも 3.9倍になる魔法なら俺も欲しいが。(w
449 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 02:39:25 ] >デュアルコアやクァッドコアのCPUだと、マルチスレッド化すると理論上 >2倍や4倍で動くと勘違いしているヤツもたまにいるよね。おまえのOSは >いったいいくつプロセスが動いていると思っているんだと、小一時間。(略 略とか言われても。誰か解読してあげてよ。 少なくとも実測で3.9倍でてるわけだから、理論上は4倍出ると言っても問題ないよな。 たくさんのプロセスが動いてるとき、マルチコアだとちゃんと速くなるよな。 意味不明。
450 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 03:13:14 ] どういう問題を解いて3.9倍なのか書かないと意味がないかと。 知人の計算屋さんがAMDの8CPU機にメモリしこたま積んで 巨大グラフを相手にした問題を解いていたことがありましたが、 問題の構造上メモリアクセスに局所性が全くないのでCPUの 速度や数以前にメモリ帯域が飽和して速度が頭打ちになると ぼやいていた事が。
451 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 14:17:04 ] >>450 まあその辺に桁違いのコストを掛けてクリアしてることが スパコンの存在意義だしね
452 名前:443 mailto:sage [2009/02/28(土) 16:53:30 ] >>448 期待するも何も、実験した結果だし。 >>450 >445に書いた通り、只管FFTを計算するようなプログラムと言うくらい。 その結果では、4core2cpuのシステムで、4並列まではびっくりするほどリニアリティがあるけど、 その先は一つ増やしても0.7個分くらいしかパフォーマンスが上がらなかった記憶が。 # 8並列で7倍くらいかな? 必要なら記録を探してくるけど。 尤も、自作のプログラムだと4並列でも8並列でも殆ど変わらなくて泣けた罠。 インテル某氏の話だと、MKLはOpenMPで並列化してもリニアリティを確保できるように 作られているそうで、折角FFTを使わない版を作ったのにお蔵入りになりそうだったり。
453 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 16:55:08 ] スパコンと言えばTOP500で10位にWin鯖クラスタが付けてたけど (CPUとメモリだけ)似たような構成の他のと比べて特に劣ってるようでも秀でてるようでもなかった
454 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 18:46:09 ] >>452 OpenMP に頼って満足してる人はこのスレに用はないでしょ。 どうぞお引取りください。
455 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 19:01:43 ] >>454 >452じゃないけどここはマルチスレッド全般でしょ? >1にも「OS・言語・環境は問わない」って書いてるんだからいいと思うけど ただし>452=443=440はおバカさんだと思うけどねw
456 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 21:22:08 ] OpenMP の話題がまずいと言ってるわけじゃなくて、「OpenMP に頼って満足してる人」って書いてあるんだが...。 スレタイに「相談室」って書いてあるのが見えませんか?
457 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 21:41:20 ] >>456 相談した人にOpenMPに頼って満足してるってレスするのは問題ないだろ
458 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 22:04:33 ] で、どこに相談した人がいるんだ? (w
459 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 22:09:48 ] 俺は>452個人の話はしてないんだが。お前誰と闘ってるんだ?
460 名前:452 mailto:sage [2009/02/28(土) 22:13:07 ] まぁ、私は「OpenMPに頼って満足してる」のではなく、「OpenMPを巧く使うMKLに勝てなくて泣いてる」のだけれどねw
461 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 22:13:48 ] よくわからないけど、置いときますね。 #light open System.Threading let tid = fun () -> Thread.CurrentThread.ManagedThreadId let sleep = fun (t:int) -> System.Threading.Thread.Sleep t let x1() = [|1..100|] |> Array.map(fun x -> sleep(100); [|x ; tid()|]) let x2 = [|1..100|] |> Array.map(fun x -> async { sleep(100); return [|x ; tid()|] } ) |> Async.Parallel let _ = printfn "%A" (x1()); printfn "%A" (Async.Run x2)
462 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 22:35:01 ] >>450 おれは、>>452 個人の話をしてるんですけど。 まさか、>>454 に書いてあるアンカーすら見えなくなるほど 頭に血が上ってるとか? (w
463 名前:デフォルトの名無しさん mailto:sage [2009/02/28(土) 22:48:56 ] >>462 俺は「OpenMPに頼って満足してる」のを理由に追い出そうとしたことに ついて話をしている。>>452 個人のことはどうでもいい。 どうやらただの煽りあいになりそうだからこの話題は終了する。
464 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 02:32:16 ] >>460 何故勝てなくて泣く必要があるのか少し気になる。
465 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 16:47:46 ] >>463 「相談した人もいないのに勝手に OpenMP に頼って満足してる人」は このスレに用はないでしょ。 これでいいか? > >>452 個人のことはどうでもいい。 # >>452 にレスしてるのに、勝手に割り込んできて逆切れかよ...
466 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 18:49:02 ] OpenMPってどんなの?たとえば、Videoのエンコード・デコード 処理が書いてある逐次処理のCなりC++のソースコードが あったら、ほとんど変更なしに並列化できるん? それとも、既存のソースは一から書き直しくらいしないと パフォーマンスは出ない?
467 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 18:53:11 ] 相談者が現れたので>>452 の出番ですwww
468 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 18:55:20 ] それ以前に446にふさわしい言葉は「ググれカス」だろう。
469 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 19:14:45 ] >>466 OpenMPスレという物もあってだな(ry
470 名前:デフォルトの名無しさん mailto:sage [2009/03/02(月) 02:02:51 ] OpenMP詳細しらんが、既存のソースは1から書き直しまで いかなくても、大幅に書き直さないとパフォーマンスは でないのだろうな。常識的に考えて。 コア数に応じてリニアにパフォーマンスがあがって、既存 のソースから簡単に移行できますよ、っつーなら神なのだが。
471 名前:デフォルトの名無しさん mailto:sage [2009/03/02(月) 02:35:03 ] それを可能にするには関数型など副作用のない言語が有利 今更言うことでもないが
472 名前:デフォルトの名無しさん mailto:sage [2009/03/02(月) 02:38:08 ] >>471 んなこたーわかってんだよ。新規にはじめる分野はそれでもえーよ。 資産の移行も重要なんだよ。
473 名前:デフォルトの名無しさん mailto:sage [2009/03/02(月) 02:42:00 ] おまえの書いたコードなんぞ資産と呼ぶ価値も移行する価値も無いから気にすんな
474 名前:デフォルトの名無しさん mailto:sage [2009/03/02(月) 02:46:42 ] >>473 俺の書いたコードが資産だなんて、いついったんだよ? 煽るにしろ、頭の悪さが透けてるんだよ。
475 名前:デフォルトの名無しさん mailto:sage [2009/03/02(月) 03:08:36 ] >>472 の「おまえ」が>>474 だなんて、いついったんだよ? 煽るにしろ、頭の悪さが透けてるんだよ。
476 名前:デフォルトの名無しさん mailto:sage [2009/03/02(月) 11:59:03 ] これは惨めなミス。
477 名前:デフォルトの名無しさん mailto:sage [2009/03/02(月) 13:39:15 ] >デュアルコアやクァッドコアのCPUだと、マルチスレッド化すると理論上 >2倍や4倍で動くと勘違いしているヤツもたまにいるよね。おまえのOSは >いったいいくつプロセスが動いていると思っているんだと、小一時間。(略
478 名前:デフォルトの名無しさん mailto:sage [2009/03/02(月) 23:44:21 ] >>477 こいつの言ってることまじでわからんのだが・・・。 こいつがアフォなのか、俺がアフォなのか誰か解説よろしく!
479 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 00:03:02 ] コア1 ●◎◎◎◎◎◎◎◎◎ コア2 ●○○○○○○○○○ コア3 ●○○○○○○○○○ コア4 ●○○○○○○○○○ ↓ コア1 ●◎◎◎◎◎◎◎◎◎ コア2 ●◎◎◎◎◎◎◎◎◎ コア3 ●◎◎◎◎◎◎◎◎◎ コア4 ●◎◎◎◎◎◎◎◎◎ ○ 空き ● 別プロセス ◎ 自プロセス 4倍になる
480 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 00:28:55 ] >>477 基本的には>>477 がちょっとずれていると思う。 コア数に比例してリニアに2倍4倍にならないのは事実。 でもハウスキーピングなプロセスの数云々は性能を押し下げる 理由としてはどちらかというとマイナーな部類だと思う。
481 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 00:29:19 ] ちょっとゲロでちゃった
482 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 00:35:18 ] 並列化効率の話がまず最初だよね。 アムダールの法則。
483 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 00:38:03 ] >>480 いや、こうまで単純化していいかどうかわからんが、 ハウスキーピングのプロセスがほぼsleep状態と 仮定したら無視できるわけで。 というより、4コア100%使用する処理走らせるんだったら、 無視できるほどなわけで(スワップデーモンとか ハードアクセスの重いスレッドが走らない前提なら)。 バスネックでリニアに伸びないとか、キャッシュの競合 だとかいうならまだしも。やっぱり俺には>>477 はさっぱ りわからん。
484 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 01:50:33 ] アイドル状態のプロセスでもビジーループでCPU消費してる とか思ってんじゃないの
485 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 01:56:06 ] >>484 単に1つのプロセスが1コアを占有し続けると考えているのではあるまいか。
486 名前:デフォルトの名無しさん [2009/03/14(土) 05:22:42 ] マルチスレッドについて質問です。 環境は VC++2005 SDK です。 子ウィンドウの WM_CREATE にて無限ループをさせても 親ウィンドウが操作できる 事を実現したいです。 他スレにて、 >Windowsのウィンドウはスレッドに属する。 >ウィンドウプロシージャはウィンドウの属するスレッドで実行される。 >さて、どのスレッドに属するかというと、CreateWindow(Ex)を呼んだスレッド。 というレスをいただき、新しいスレッドにてCreateWindow する手段を取りました。 子ウィンドウの WM_CREATE までは処理が進むのですが、 無限ループどころか for (i=0; i<100; i++) { i = i; } を WM_CREATE 内に 記述した途端にフリーズする様になってしまいました。 コメントアウトすれば、問題なく動作します。 ファイルをアップロードしたので、見ていただけないでしょうか? ttp://www3.uploda.org/uporg0077.cpp.html 受信パスは test です。 どのように修正すれば良いか、ご教授願います。 よろしくお願いします。
487 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 05:54:15 ] >>486 windowsのウィンドは、プライマリスレッドで生成しないと いろいろいろいろいろいろいろいろトラブルが起こるので、そういう設計は見直した方がいい。 そもそも子ウィンドウは親ウィンドウと同じスレッドで生成しないとトラブルになる。 例えば親をAスレッドが、子をBスレッドが作ったりすると、 親のプロシージャはAスレッドが実行し、子のプロシージャはBスレッドが実行することになる。 子から親への通知や親から子への通知がメッセージで発生したら発生したら、 デッドロックの宝庫になることは想像に難くない。 それ以前にメッセージループって親子で共通のような気が・・・
488 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 06:05:38 ] >>486 アップロードしたプログラムだとそもそも子ウインドウは表示されないだろ。 動くようにするには子ウインドウと呼んでいるものを、新しいスレッドのウインドウにすること。 つまりメッセージループをそこでまわす。 MSG msg; ShowWindow(hChild, SW_SHOWDEFAULT); UpdateWindow(hChild); while(GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } //static int k = 0; //k = 1; //while (1) // k++;
489 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 06:16:38 ] WM_CREATEで無限ループしたらCreateWindowから制御が戻らないわけだが
490 名前:486 [2009/03/14(土) 15:00:34 ] >>487 色々と問題があるという事ですか... そこまでは考えておりませんでした。 ですが、今はこの枠組みで作ろうと思います。 アドバイスありがとうございます。 >>488 メッセージのループを回すのを忘れておりました。 ありがとうございます。 ただ、今回はメッセージのループのみが欲しいので ウィンドウは非常時で構いません。 >>489 確かにそうでした。 あるメッセージを受けた時に その中で Sleep(1000); を実行する事にしました。 ・・・が、それでも親ウィンドウが 1000 ミリ秒 固まってしまいました。 以下の様にしておりますが、 これでは各ウィンドウは別スレッドで動かないのでしょうか? ttp://www2.uploda.org/uporg2088151.cpp.html 受信パスは test です。 よろしくお願いします。
491 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 15:07:12 ] 作ろうと思います、じゃねー 動作が未定義なんだからそんなプログラミングすんな
492 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 15:18:07 ] >>491 互いのウィンドウでメッセージのやり取りを頻繁にするような事は致しません。 親スレッドとは独立したウィンドウプロシージャのメッセージループ (表現が合っているかは自信がありませんが)が欲しいのです。 以下、長文失礼します。 5 [msec] の情報が入るサイズのバッファを複数用意し 信号をバッファに入力し、あるバッファが満タンになったら windows からメッセージが投げられ、 受け取ったメッセージ内で信号処理をする、 というものを作っています。 この時、信号処理に時間がかかるため 常にメッセージを受け取った時の処理を行ってしまい メニュー操作が出来なくなる状態です。 アプリケーションを強制終了すると、信号処理した数値列が ちゃんとファイル出力されているので 信号の入力及び信号処理は問題なく進んでいます。 これを解決するにはメニューを持つウィンドウと メッセージループのあるウィンドウを別スレッドで走らせれば良い と考えました。
493 名前:492 mailto:sage [2009/03/14(土) 15:53:32 ] 連稿失礼します。 Sleep(1000); を int i, j; for (i=0, j=0; i<1000000000; i++) j++; としてみましたが、結果は同じでした。 親ウィンドウのスレッドにフォーカスが戻っていないのでしょうか?
494 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 16:43:47 ] 子ウィンドウ作る必要なんて無いところを、 わざわざ回りくどいやり方しているようにしか思えないんだけど。 ワーカースレッドにデータ送りたいだけじゃないの?
495 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 18:10:18 ] >>494 ワーカースレッドについて知識が無かったのでググってみました。 MFCでのみ使用可能な関数でしか作れない事が判りました。 今はSDKで組んでおり、MFCは使った事が無いので今の私には使えそうにありません。 情報ありがとうございました。
496 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 18:28:36 ] >>495 ワーカースレッドは概念であって、SDKのみだから作れないということは無いよ そもそも、貴方のやろうとしていること自体がワーカースレッドの利用だ
497 名前:デフォルトの名無しさん mailto:sage [2009/03/15(日) 15:23:44 ] >>496 ワーカースレッドについて調べ方が間違っていたようです。 もっと調べを進めます。ありがとうございます。
498 名前:デフォルトの名無しさん mailto:sage [2009/03/15(日) 20:09:14 ] >>492 ワーカースレッドというのは、作業を行うスレッドという程度の意味です。 信号処理中はGUIが不要のようですので、GUIは1個のスレッドにまとめて下さい。 以下、基本は次のような処理になります。Q0とQ1のアクセスを排他制御して下さい。 プライマリスレッド メインウィンドウの作成。 バッファ群を作成する。例えば5ms用のバッファをN個作成して、 2個のキューQ0(未使用バッファ用)とQ1(充填済みバッファ用)を作成する バッファを全てQ0に格納し、スレッドA・Bを作成・実行する。 以降はGUIによるスレッドA・Bのコントロールを行う スレッドA(バッファ充填処理) 1.信号受信処理の初期化 2.Q0からバッファを取り出す。無ければ待つ。 3.バッファを充填する処理(この辺で外部からのスレッド終了通知チェック) 4.バッファが一杯になったらQ1へ入れ、2へ戻る スレッドB(信号処理スレッド) #スレッドAで、Q1の格納数が0->1になったとき起こされる。 1.Q1からバッファを取り出す(なければ待つ) 2.信号処理(この辺で外部からのスレッド終了通知チェック) 3.結果の出力 4.バッファをQ0へ入れ、1へ戻る
499 名前:デフォルトの名無しさん mailto:sage [2009/03/15(日) 20:18:36 ] >>498 あー便所で説明してくれないと解らない
500 名前:デフォルトの名無しさん mailto:sage [2009/03/15(日) 20:42:55 ] >>499 ウホッいい男!
501 名前:492 mailto:sage [2009/03/15(日) 20:45:19 ] >>498 詳しい構成、本当にありがとうございます。 頑張って理解してみます。
502 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 03:19:19 ] void A::sync_fun() { boost::mutex::scoped_lock lock(m_); // 何かの処理 } 上のlockで待機しているスレッドがあるときにAのオブジェクトをdeleteするとスレッドは待機したままですね。 下のようにするかtimed_waitにする必要があるのか、そこまで気にすることもないのか。 みなさんはどうされますか? void A::sync_fun() { boost::mutex::scoped_lock lock(m_); cond_.wait(lock, bind(&A::pred, this)); if (invalid_) return; // 何かの処理 } bool A::pred() const { return stat_ || invalid_; } A::~A() throw() { { boost::mutex::scoped_lock lock(m_); invalid_ = true; } cond_.notify_all(); }
503 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 18:55:17 ] >>502 どうするかは、何のクラスかによるだろう。 一般論でAが、sync_fun()実行中に破棄される可能性があって、 どうしても回避できないならAのデストラクタでunlockする。
504 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 16:12:48 ] ダウンローダをマルチスレッドで作成しようと思っているのですが スレッドを10個作り それぞれにURLを追加して、次々にダウンロードさせる仕様にしようかと思っていますが このスレッドの終了タイミングはどういった条件で終了すればいいでしょうか? メインスレッドが終了するとこの10個のスレッドも終了するので どうしたものかと考えています
505 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 16:19:45 ] あげます すいません
506 名前:デフォルトの名無しさん [2009/04/04(土) 16:20:37 ] .
507 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 16:36:26 ] >>504 何を聞きたいのかよく分からんけど、 メインスレッドで10個のスレッドの 終了待ちさせれば良いんでないの。
508 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 16:45:56 ] >>507 なるほど そういう手がありましたか ありがとうございました
509 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 17:26:41 ] 何か一冊マルチスレッドの本読むのおすすめする
510 名前:デフォルトの名無しさん mailto:hage [2009/04/05(日) 04:12:53 ] class Hoge{ public: void End(){ /*他のスレッド、シグナルハンドラとかから呼ばれる */ Lock_.GetLock(); // 実際はRAII使ってるよ continuable_ = false; //その他のリソース会報処理 } void Task(){ // thread poolから実行されるタスク。 Lock_.GetLock(); if( continuable_ == false ){ return; } // IO処理とか色々非同期でやる } }; なんか、フラグ使ってやるのが嫌なんだけど、 非同期で実行されるオペレーションをキャンセルさせる スマートな方法ってない他にない? この実装は間違ってる?
511 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 11:59:52 ] いいんじゃねえの。 スレッドを自発的に終了させるには スレッド自身が何かをチェックしなけりゃならんし。
512 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 13:17:02 ] 間違ってないし、フラグを使う方法は普通によくある
513 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 19:31:13 ] 別プロセスにしてkill -9、これが最強。
514 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 19:36:59 ] せめてSIGTERMでやんわり殺してやれよ。
515 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 12:50:48 ] そうそう、せめて覚悟する時間くらいは与えてあげないと。 尤も、そうすると逆切れして殺しに来るかも試練が。
516 名前:デフォルトの名無しさん [2009/04/09(木) 00:33:31 ] 変数か構造体かクラスのインスタンスa,b,c,dがあるとして、 まず、スレッド1がaとbを使用、スレッド2がc,dを使用する。 その後、スレッド間通信とかでスレッド1も2も上のa,b,c,dを使用した処理が完了したことをスレッド1,2に伝える。 そして、スレッド1がa,cを使用、スレッド2がb,dを使用する。 といったような処理をするときに、特別にロックとか必要ですか。
517 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 00:58:51 ] >その後、スレッド間通信とかでスレッド1も2も上のa,b,c,dを使用した処理が完了したことをスレッド1,2に伝える。 これで同期取ってるから、そこをちゃんとすればよい。
518 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 01:47:33 ] 弱い順序付けの場合だめな場合がありえるかもね
519 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 17:49:21 ] ねーよw
520 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 19:12:35 ] >>518 お前にとって同期ってなんだ?
521 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 19:52:20 ] グローバル変数keyに対して、他のスレッドで値を変更してループの続行、終了を決める場合に while ( key ){ count++; } というコード書くとコンパイラの最適化によって、無限ループになる可能性があるということですが、 while ( *pk ){ count++; } のようにアドレスから参照しようとしても同じことになるのでしょうか。
522 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 20:54:12 ] わかんない。 つーか key を volatile にすりゃいいんでない?
523 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 21:01:11 ] >>521 うん。十分ありえる。
524 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 21:07:43 ] volatileで大丈夫そうですね。ありがとうございました。
525 名前:デフォルトの名無しさん mailto:sage [2009/04/12(日) 11:51:26 ] マルチスレッドがどういうタイミングで割り込まれるのかわからないのですが たとえば、if(++i == n) のコードなら iをインクリメントしてからnを比較するまでの間で 割り込まれる可能性はあるんでしょうか?
526 名前:デフォルトの名無しさん mailto:sage [2009/04/12(日) 12:30:10 ] あるよ そもそも正しくインクリメントされることも保証されない (CPUやコンパイル出力によるけど) なぜなら、 (1) メモリからiの値を読み出す (2) 値+1を計算する (3) iの領域に計算結果を書き込む という3ステップになる可能性があるから
527 名前:デフォルトの名無しさん mailto:sage [2009/04/12(日) 12:43:39 ] >>526 そのステップ間で割り込まれるんですか、結構分割されるものなんですね ありがとうございました
528 名前:デフォルトの名無しさん mailto:sage [2009/04/12(日) 14:33:39 ] >>527 ただし、いつもそのように分割されるとは限らない。
529 名前:デフォルトの名無しさん [2009/04/13(月) 22:54:34 ] volatile最強杉www
530 名前:デフォルトの名無しさん mailto:sage [2009/04/14(火) 10:18:14 ] fread等でのデータ読み込みをシングルスレッドで実行する場合と マルチスレッドで実行し、メインスレッドでは出来るだけ何もしない場合の速度は同程度になるものでしょうか?
531 名前:デフォルトの名無しさん mailto:sage [2009/04/14(火) 10:27:26 ] >>530 速度は実測が基本。 たぶんその比較内容だと、激しく環境(ハードウェア、OS、コンパイラ)に依存する。
532 名前:530 mailto:sage [2009/04/14(火) 10:57:26 ] WindowsXP、vc2003、C2D E7200です。 timeGetTimeで測定した所、 マルチスレッド側の速度が安定しないのですが、 100kb程度のデータで2倍、1mb程度だと4割程度の速度差になりました メインスレッドは以下のようなループになっていています while(1){ if(PeekMessage(&msg,0,0,0,PM_NOREMOVE)){ TranslateMessage(&msg); DispatchMessage(&msg); } else { // メインスレッド } }
533 名前:デフォルトの名無しさん mailto:sage [2009/04/14(火) 11:00:25 ] 色々条件がよく判らんが、ここが一番判らん。 >100kb程度のデータで2倍、1mb程度だと4割程度の速度差になりました 2倍の速度差と4割の速度差ってどういう意味なんだか。 シングルスレッドに対してマルチスレッド版は2倍の速度差、つまり3倍所要時間が掛かったのか?
534 名前:530 mailto:sage [2009/04/14(火) 11:11:23 ] すみません、 所要時間 シングル マルチ 100kb 0.013秒 0.025秒 1mb 0.100秒 0.140秒 です
535 名前:デフォルトの名無しさん mailto:sage [2009/04/14(火) 11:17:22 ] >>530 マルチスレッドは、複数のことを同時にしたいときに使う技術なので、 そういう視点で選択した方がいいですよ。 ただ速度といっても、プライマリスレッドからストレージアクセスを しているときキャンセルボタンを押したいんだけどその反応が鈍い、とか、 ストレージをアクセスしながらムービーを表示しているのだけれどコマ落ちする、とか、 単純コピーを速くしたい、では、とるべき手段に違いがありすぎます。 単にあるデータをストレージから読み込む処理だけに着目するなら、シンプルな シングルスレッドの方が高速になることが多いと思います。 予め別のスレッドで利用するファイルを予測してアクセスし、キャッシュに入れておく などというのはまた別の問題ですが。
536 名前:530 mailto:sage [2009/04/14(火) 11:33:30 ] >>535 ありがとうございます 極力シングルで動作できるような方法考えることにします
537 名前:デフォルトの名無しさん mailto:sage [2009/04/19(日) 14:10:04 ] >>435 Phenomの2コアで2スレッド動かしたら2.2倍以上のスコアを叩き出した。 確かに2倍になる訳じゃないね。但し、配列をL2とL3に合わせて巧く分割 できた場合に限るけど。あと、OSのや他プロセスのボトルネックがある分 やっぱりマルチコアの方が早いね。実質90%でしか動けないシングルは倍 にしても180%だけど、90%+100%で動けるマルチコアだと実質190%で10% ぐらい早くなる。
538 名前:デフォルトの名無しさん mailto:sage [2009/04/19(日) 14:41:22 ] >>521 別にvolatile使わなくても問題なくね? static int key=1; void Thread0() { key=0;//volatile指定が無い場合消失する可能性がある。 Sleep(100); key=1; } void Thread1() { while ( key ){ count++; } } こんな事でもしない限り無限ループにならんべや。 こんなコード書くことまず無いだろ。 それと、そもそも、グローバル変数使うなよ。
539 名前:デフォルトの名無しさん mailto:sage [2009/04/19(日) 19:33:59 ] >>538 バカでしょ
540 名前:デフォルトの名無しさん mailto:sage [2009/04/19(日) 22:08:19 ] >>538 まず、ネタなのかマジなのかを書いてくれ。
541 名前:デフォルトの名無しさん mailto:sage [2009/04/19(日) 22:25:33 ] >>538 バカなの?死ぬの?
542 名前:デフォルトの名無しさん mailto:sage [2009/04/19(日) 22:53:09 ] >>539-541 まじか。何で?
543 名前:デフォルトの名無しさん mailto:sage [2009/04/19(日) 23:02:48 ] volatileを使うと排他制御しなくて よくなるから必要
544 名前:デフォルトの名無しさん mailto:sage [2009/04/19(日) 23:19:55 ] それは誤り
545 名前:デフォルトの名無しさん mailto:sage [2009/04/19(日) 23:50:48 ] keyをテストする所にメモリバリア入れないと駄目じゃないかね
546 名前:デフォルトの名無しさん mailto:sage [2009/04/20(月) 01:29:15 ] 例えばJavaやC#などだと参照してる変数がvolatileだと期待通りに動くが、 そうじゃないとどうなるか分からんのじゃない?
547 名前:デフォルトの名無しさん mailto:sage [2009/04/20(月) 15:54:13 ] >>543 volatileと排他制御はなんの関係もないぞ。 volatileは最適化の抑止で、せいぜい>>538 の様な事や レジスタだけでなくメモリ側にも変数を割り当てるぐらいだ。 そもそも、CやC++に排他制御なんて概念は無いから クリティカルセクションなんかを使う他無い。 ちなみに、Javaは排他制御がかかるが、グローバル変数 と言っているからCかC++だ。もしかして、間違えてないか?
548 名前:デフォルトの名無しさん mailto:sage [2009/04/20(月) 16:04:59 ] で、>>539-541 は、人をバカ呼ばわりしただけの まっとうな理由あるんでしょうねぇ。まさか、Javaや C#のvolatileしか知らない癖にバカにしてたなんて 恥ずかしい理由じゃありませんよねぇ当然。