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】 【言語】 【実行環境】 【その他突起する事項】
376 名前:デフォルトの名無しさん mailto:sage [2009/01/20(火) 11:21:30 ] >>375 このパターン自体は典型的なケースだろ APIによっては、ReaderとWriterの他に「Writerに変更可能なReader」が用意されていることもある
377 名前:デフォルトの名無しさん mailto:sage [2009/01/27(火) 16:00:09 ] WindowsでCreateThread中Cランタイムに含まれる関数を使うとリークを起こすとありますが、 普段からCreateThreadは使わずbeginthreadを使ったほうがいいんですか? 完全にCランタイム使わずってのも面倒だし、内部で使ってる関数があるかもしれない そういうことまで考えてあえてCreateThreadを使うメリットはあるのでしょうか?
378 名前:デフォルトの名無しさん mailto:sage [2009/01/27(火) 16:06:34 ] 軽い
379 名前:デフォルトの名無しさん mailto:sage [2009/01/27(火) 16:14:38 ] ない
380 名前:デフォルトの名無しさん mailto:sage [2009/01/27(火) 17:56:15 ] _beginthreadexでおk
381 名前:デフォルトの名無しさん mailto:sage [2009/01/28(水) 14:15:26 ] ないな
382 名前:デフォルトの名無しさん mailto:sage [2009/02/01(日) 13:59:30 ] pthreadでmutexで 再起ロックする場合と 依存関係をハッキリさせてスレッドIDとFAST_MUTEXで判別 どっちが高速ですか?
383 名前:デフォルトの名無しさん mailto:sage [2009/02/01(日) 15:33:29 ] 後者。 以前計測したことがある。 ただし、依存関係の洗い出し作業がとても大変だった。 デッドロックに直結するから、とても気をつけないといけない。 要求性能がシビアだったから後者で仕事のためにやったけど、趣味ならば前者をお薦めする。 排他制御がボトルネックになるようなら、前者で実装すればいい。 俺の場合は、本当に特殊で制限が厳しかったから前者でやっただけ。
384 名前:デフォルトの名無しさん mailto:sage [2009/02/01(日) 15:35:13 ] ×排他制御がボトルネックになるようなら、前者で実装すればいい。 ○排他制御がボトルネックになってから、後者で実装すればいい。
385 名前:デフォルトの名無しさん mailto:sage [2009/02/01(日) 15:38:02 ] FAST_MUTEXって何?
386 名前:383 mailto:sage [2009/02/01(日) 16:18:24 ] 色々ぐだぐだだな。 お家で寝たいよ。
387 名前:デフォルトの名無しさん mailto:sage [2009/02/01(日) 23:25:11 ] struct hoge{ int var pthread_mutex_t m; struct hoge * next; }; こんな構造体あって while(h){ pthread_mutex_lock(h->m); h->var++; pthread_mutex_unlock(h->m); h = h->next; } こんな風にリンクリストを舐める前後を排他して 舐めていくという処理は正しいでしょうか?
388 名前:デフォルトの名無しさん mailto:sage [2009/02/01(日) 23:54:31 ] 加算をアトミックにしたいなら正しいんじゃない。
389 名前:デフォルトの名無しさん mailto:sage [2009/02/02(月) 00:06:27 ] >>388 では、これもレースコンディション無く 検索可能ですかね? struct hoge{ int var; int id; pthread_mutex_t m; struct hoge * next; }; void search(id) { while(h){ pthread_mutex_lock(h->m); if( h->id == id){ h->var++; pthread_mutex_unlock(h->m); return; } pthread_mutex_unlock(h->m); h = h->next; } }
390 名前:デフォルトの名無しさん [2009/02/09(月) 14:04:10 ] shared_ptrで管理するオブジェクトAをスレッドXに渡し、スレッドXからdllを呼んで、dll内でオブジェクトAのメモリを確保する、 ということをしたいのですが、以下のコードでjoin終了時、shared_ptr<A>の解放処理のところで例外が発生します。 どういった理由が考えられるでしょうか? マルチスレッドでもdllを使わなければ問題なし、dllを使ってもマルチスレッドにしなければ問題なしでした。 struct A {}; // スレッドXにshared_ptrで渡されるデータ typedef void (__cdecl* DllFunc)(std::tr1::shared_ptr<A>& a); // スレッドから呼ばれるDLL struct X { // boost::threadに渡すスレッドオブジェクト std::tr1::shared_ptr<A> a_; X(std::tr1::shared_ptr<A> a) : a_(a) {} // DLLに渡すデータ void operator()(void) { // スレッド実行時に呼ばれる関数 HMODULE handle = LoadLibrary(L"dll_func.dll"); DllFunc dll_func = (DllFunc)GetProcAddress(handle, "dll_func"); dll_func(a_); FreeLibrary(handle); c.notify_one(); } }; int main(int argc, char** argv) { std::tr1::shared_ptr<A> a(new A); std::tr1::shared_ptr<X> x(new X(a)); boost::thread th(*x); th.join(); // ここで例外発生 } <dll_func.cpp> BOOL WINAPI DllMain (HINSTANCE hinstDll, DWORD fdwReason, LPVOID lpvReserved) { return TRUE; } extern "C" __declspec(dllexport) void __cdecl dll_func(shared_ptr<A>& a) { a.reset(new A); // これがなければ大丈夫 }
391 名前:デフォルトの名無しさん mailto:sage [2009/02/09(月) 15:33:18 ] よりによってここに書くか。すれ違いだWin32スレ行け。 DLLの勉強一からやりなおせ。 最初から全コードのせときゃもっと早く回答ついたんだろうが、ウザイからオシエネ。
392 名前:デフォルトの名無しさん mailto:sage [2009/02/09(月) 16:58:44 ] DLL内でnewしたのをEXE内で解放したらエラー出るんじゃない? そもそもshared_ptrだって内部で参照カウント用にnewしてるからDLLじゃ使えない気がするなー。
393 名前:392 mailto:sage [2009/02/09(月) 17:02:58 ] スレッドは全然関係ないね。うん。
394 名前:デフォルトの名無しさん mailto:sage [2009/02/10(火) 05:13:43 ] >>390 たぶんこれだけで死ねる。 std::tr1::shared_ptr<A> a(new A); X(a)();
395 名前:デフォルトの名無しさん mailto:sage [2009/02/10(火) 21:54:55 ] DLLか・・・COMについて調べたほうがいいんじゃないですかね いろいろヒントあるよ
396 名前:デフォルトの名無しさん mailto:sage [2009/02/14(土) 15:33:17 ] shared_ptr使ってるくせにdeleter知らないとか
397 名前:デフォルトの名無しさん mailto:sage [2009/02/19(木) 23:31:28 ] >>288 Windows Xp home SP3 で自作のTCPサーバ運用してるけど、インバウンド接続の 同時接続数の制限が10ってことはないよ。 今モニタ見ても20人くらい繋がってる。 p2pがすごい数でつながってるだろうし この件についてはいろいろなひとがよく確かめずにいろいろ書いてる。 自分でちょっとやってみればすぐわかる。
398 名前:デフォルトの名無しさん mailto:sage [2009/02/19(木) 23:33:34 ] >>397 実装はともかくライセンスで制限されてるはず
399 名前:デフォルトの名無しさん mailto:sage [2009/02/19(木) 23:37:37 ] そうなんだよね。 使わないでくれという約束で みんな破って使ってるわけだ。
400 名前:デフォルトの名無しさん mailto:sage [2009/02/19(木) 23:46:20 ] SQLだったかで試してたときにイベントログに制限されたメッセージが 出たことある。あとShare動かしてる時とか頻繁に出る気がする。 単純にセッションの制限では無かった筈。
401 名前:デフォルトの名無しさん mailto:sage [2009/02/20(金) 00:12:50 ] MS製のサーバは独自に制限した実装 IISじゃなくてPWSだっけ WMEとかはレジストリいじって50人くらいつないだりしてたな。
402 名前:デフォルトの名無しさん mailto:sage [2009/02/20(金) 02:13:42 ] それとは別に、セキュリティ的な話で、 SYN_SENTなソケットをシステム全体で 10くらいしか持てないって制限もあったはず。
403 名前:デフォルトの名無しさん mailto:sage [2009/02/22(日) 19:23:55 ] 初心者な質問ですが、 Thread A Thread B for(;;) for(;;) printf("AAA\n"); printf("BBB\n"); という処理を行うと、AAA行とBBB行が入り乱れて表示されるんですが、 AABABB\n\n などと表示されることはありえないんでしょうか。 環境はWindows XPで、VC++2008EEでプログラムを書いてます。
404 名前:デフォルトの名無しさん mailto:sage [2009/02/22(日) 19:36:03 ] >>403 ここらへんに何か書いてあるんじゃねーの? msdn.microsoft.com/ja-jp/library/172d2hhw.aspx
405 名前:デフォルトの名無しさん mailto:sage [2009/02/23(月) 04:04:56 ] >>403 バッファリング
406 名前:デフォルトの名無しさん [2009/02/23(月) 21:19:24 ] スレッドに別のスレッドから信号を送って途中で処理をキャンセルしたいのですが、 現状、以下のようにしています。 void run() { // スレッド実行部 for () { // 長いループ ...処理... if (check()) return; // 処理をキャンセル } } check()でキャンセルのフラグをチェックし、このフラグを別のスレッドから書き換えるという方法です。 でもこの方法だとループ内の処理が重くなったときにキャンセル操作に対する反応も遅くなってしまうため どうしたものかと悩んでます。 スレッド内でタイマーのようなものを発行して、定期的にcancel()のチェックをするといった方法はできないでしょうか? 環境はVC9です。
407 名前:デフォルトの名無しさん mailto:sage [2009/02/23(月) 22:47:56 ] >>406 別スレッドから強制停止するとリソースリークの元だよ。 if (check()) return; // 処理をキャンセル を重い処理の途中に幾つか入れる方がまし。
408 名前:406 mailto:sage [2009/02/23(月) 23:51:22 ] >>407 > を重い処理の途中に幾つか入れる方がまし。 どうも。やっぱりこういう単純な方法しかないですか。 重い処理を別スレッドで行わせながら キャンセル操作の反応がよい安全な方法ってのはないんでしょうか。 cancel()を挿入しまくるというのもなんだかスマートじゃないなぁ・・・。
409 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 00:50:35 ] 非同期に飛ばされるぐらいならコードが汚くなる方が良い と思うのは俺だけじゃないよな?
410 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 01:12:42 ] その重い処理ってのがなんなのか スマートとか言うならその重い処理をスマートに分割すりゃいいじゃない どうしてもチェックしまくりたくないっていうなら処理を持ってるクラスのインスタンスを急にnullにしてやって 例外捕らえて終了してしまえ、最悪だけど
411 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 01:40:59 ] 別プロセスにして殺すってのは? 結局そういうのって要求されるキャンセル応答時間次第。 人間相手ならmsecオーダでおkでしょ。 きっとループ1回につき1msecもかからないのでは?
412 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 01:51:03 ] ワーカースレッド2つ以上用意にして 対処すればよくね? 複数個のスレッドでビジー状態になるなら その処理内容そのものを分割しタスク化した方がいい
413 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 02:50:07 ] 違う質問スレで質問した後でこちらを見つけたので一応こちらでも・・・ CreateThread関数で第三引数をクラスのメンバ関数にしたい場合は どういう記述をすればいいのか教えてください よろしくお願いします
414 名前:468 mailto:sage [2009/02/24(火) 02:56:15 ] >>410 >その重い処理ってのがなんなのか 例えば大きなサイズの行列計算や、待ち行列を使った探索問題なんかを想定しています。 問題を分割することはある程度はできるんですが、それはそれで頑張るとして、 それ以外のアプローチははないかなと。 >>411 > 別プロセスにして殺すってのは? すみません。よくわかりません。 別プロセスならば殺しても元のプロセスに影響がでないという意味でしょうか。 >>410 の後半で言ってることに近い >>412 > ワーカースレッド2つ以上用意にして 対処すればよくね? 同じスレッドオブジェクトをAとBの2つ用意して、 Aが動いてるときにキャンセルしたときはキャンセルしたふりをして (Aの計算は次のcancel()チェックまで続いてる)、 新規の呼び出しがあったときはBを動かすというイメージですか?これはいけるかも…。
415 名前:468 mailto:sage [2009/02/24(火) 02:58:01 ] 一部修正 >>410 の後半で言ってることに近い ↓ >>410 の後半で言ってることに近いですか?
416 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 07:10:44 ] >>413 コールバック関数にはstaticなメンバ関数(クラスメソッド)しか使えない。 コールバック関数を使うAPIは大抵ポインタ型の引数を渡せるから、 クラスを使いたいときはそこにthisポインタを渡して使う。
417 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 08:52:04 ] >>413 できない 普通の関数作ってその中で呼び出す
418 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 16:53:09 ] >>416 ‐417 ありがとうございます とりあえず、>>417 の方法でやってみます
419 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 20:52:23 ] >>414 別プロセスにすると、ターミネートしたときのリソースの開放をOSがやってくれる ってことではあるまいか。 それはともかく、その長い処理がうまく分割できず、どうしても時間がかかる場合は 汎的には、キャンセルボタンの入力を取得する側(フラグを立てる側ね)で、キャンセルが 押されたからしばらく待てっていうサインをユーザーに与える方が重要な希ガス。
420 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 21:45:33 ] 別プロセスのほうがクリーンアップの点では簡単&安心だなあ ただ、多くの情報を受け渡したり、途中で通信が必要だったりすると しんどいけどな
421 名前:デフォルトの名無しさん mailto:sage [2009/02/24(火) 23:05:03 ] しんどいと言うか、性能の問題がでるかも
422 名前:406 mailto:sage [2009/02/25(水) 00:45:53 ] >>419- なるほど。別プロセスにすることも検討できそうです。 なんとなく雰囲気は分かりました。どうもありがとう。
423 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 18:38:04 ] 処理毎に別プロセスって、昔の業務アプリみたいだな。っていうか、 今でもVBあたりでそんな開発やってそう。 1画面=1exeファイルで、画面間はsystem()でプロセス呼び出し。 画面フォーム上で入力したデータ等は、ファイルに書き出して渡す。 大抵、exeファイルの名前は全部数字と意味不明なアルファベットで、 メモリ食いまくりで、やたらに遅い。(w
424 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 19:28:47 ] 大規模なアプリはマルチプロセスの方が開発しやすいね Windowsの場合は性能的にマルチタスクに向かないけど
425 名前:デフォルトの名無しさん mailto:sage [2009/02/25(水) 21:04:19 ] >>423 unixだとマルチプロセスは多いけどな。 VB6のアプリだとそういう作りになるのは仕方ない。 モジュール分割の手段がCOMしかない。 20画面もあるとロードモジュールが10M超える。 IDEに読み込んだりコンパイルするのにも一苦労。 プロセス間でDBのセッションを引き継げたらマルチプロセスでも軽くなるはずなのだけど、 それも出来ないからDBの接続でどうしても画面遷移が重くなってしまう。
426 名前:425 mailto:sage [2009/02/26(木) 01:19:09 ] >>424 マルチスレッドは、スレッド間のメモリ保護機構がないので、他スレッド による破壊のリスクと引き換えに、高速なデータ共有が可能と思うが? Windowsがマルチタスクに向かないとか、何を根拠に? >>425 昔はメインメモリが少なく高価だったという事情もあるし、「unixだと」 という括りはどうかな? 20画面なんて、そんなに大きな規模なプログラムじゃないよね?その程度 の規模で単純にVBのソースだけなら、10MBを超えるようなことはないの では? 確かにVB6当時のハード環境(Pentium 300MHz〜1GHz, メモリ64MB程度?) でのビルドは遅かったかもしれないが、VBはVCよりは速かった様に記憶 しているけど? それと、プロセス間でDBのセッションを引き継げないのは、VBや、Windows に限定された話ではないのでは? 極端に処理が遅い業務アプリは、データベースの設計自体に問題があり、 無駄にDB間でレコードをコピーしたり、テーブルのリンクが必要だったり ということが多い気がする。
427 名前:デフォルトの名無しさん mailto:sage [2009/02/26(木) 01:55:03 ] プロセス間のデータ共有なら共有メモリがあるよ 特に親子関係があれば、mmap ANON とかでお手軽極楽 スレッドのメリットは(スレッド間なら)高速にディスパッチ出来る点だね heap だろうとなんだろうとメモリは全部共有されるというのは メリットでもあるけど、デメリットでもあるかな。 バグの原因になりがちだよね
428 名前:デフォルトの名無しさん mailto:sage [2009/02/26(木) 03:45:35 ] 構造化されたデータを別プロセスと共有メモリ経由でやりとりするとして c構造体ならまあなんとかなるんだが(いやそれでも大変だが) c++クラスだとすんごいやりにくい 何かウマい方法あります? 受け渡し用にクラス作るのもアホらしいし・・・ 変態的テンプレートでなんとかなるもんだろうか それとも単なる通信バッファとしてしか使わない?
429 名前:デフォルトの名無しさん mailto:sage [2009/02/26(木) 03:52:42 ] C++ならCの構造体も使えるんじゃ…。
430 名前:デフォルトの名無しさん mailto:sage [2009/02/26(木) 04:07:16 ] そういうのはソケット使って単純化してる。 プロセス間共有メモリは後で環境や仕様が変わったときに 変更が大変だし流用も難しい。バグも入りやすい。 パフォーマンスを上げたいとか、よっぽどの理由でも ない限り使われないんじゃないかな。 スレッドと違って>>428 の言うデメリットもあるし。 ウマい方法はありません。
431 名前:デフォルトの名無しさん mailto:sage [2009/02/26(木) 04:53:41 ] >>426 酷いミスリードだな。>424はマルチプロセスによるマルチタスクという技法がWindows向けでないと言っているように見えるが。
432 名前:デフォルトの名無しさん mailto:sage [2009/02/26(木) 04:59:25 ] IE8はマルチプロセスですぜ
433 名前:デフォルトの名無しさん mailto:sage [2009/02/26(木) 05:49:22 ] >>426 お前は誰なんだ
434 名前:デフォルトの名無しさん mailto:sage [2009/02/26(木) 06:45:39 ] unixといえば今でもパイプをfork/execで分け合ってというイメージが強いな。 DBのコネクションは知らないがファイルハンドルならプロセス間で受け渡せる。 Windowsにもハンドルを複製して子プロセスに渡すオプションはあるのだが、 OS/2やNTは最初からスレッドをサポートしてたのであまり使われない。
435 名前:426 mailto:sage [2009/02/26(木) 17:42:01 ] >>425 ハンドルの複製に失敗しますた。orz 426=423です。 >>431 未だにWindowsがunixに劣っていると思っている原理主義者か、TRON房かも。 何を以ってunixを定義しているのか聞いてみたい。 >>434 ハンドルをコピーしたりは、MS-DOSにもあったかな。INT 28Hだか忘れたけど、 プリンタスプーラ用の割込使えば、一応擬似マルチタスクで一部のシステム コールを呼べた。 デュアルコアやクァッドコアのCPUだと、マルチスレッド化すると理論上 2倍や4倍で動くと勘違いしているヤツもたまにいるよね。おまえのOSは いったいいくつプロセスが動いていると思っているんだと、小一時間。(略
436 名前:デフォルトの名無しさん mailto:sage [2009/02/26(木) 18:11:07 ] WindowsがUNIXより優れてると思い込んでるなら まずはその幻想をぶち壊す!
437 名前:デフォルトの名無しさん mailto:sage [2009/02/26(木) 18:40:58 ] >>436 上条さん乙。 つか、んな事誰も言ってないから。
438 名前:デフォルトの名無しさん mailto:sage [2009/02/26(木) 23:22:19 ] マルチスレッドスレでマルチプロセス云々言ってる時に何の前提もなく 「マルチタスク」なんて言う奴は普通にスルーでいいと思うんだけど...
439 名前:デフォルトの名無しさん mailto:sage [2009/02/26(木) 23:47:59 ] よ〜し、おじさんもマルチプログラミングとかタイムシェアリングとかの古語を持ち出しちゃうぞ。
440 名前:デフォルトの名無しさん mailto:sage [2009/02/26(木) 23:51:02 ] >>435 実質、4coreXeonのシステムだとOpenMPで4スレッドにして3.9倍速くなるけどね。 逆に、>435のCPUはOSをアイドル状態で動かすだけでどんだけ負荷喰ってるんだって話だな。
441 名前:426 mailto:sage [2009/02/27(金) 10:22:04 ] >>440 スレッドでどんなコードを走らせているか知らないけど、スレッド内で アクセスするデータもコードも、CPU内のキャッシュに収まるくらい 小さなプログラムでもない限り、そういう結果はまずありえないと思うな。 それとも脳内キャッシュ?
442 名前:426 mailto:sage [2009/02/27(金) 10:43:15 ] 非同期I/Oを使わずスレッド内でファイルI/O待ちしているとか、ネット ワーク物理層の帯域幅に比べて通信速度が遅く、スレッド化でマルチ セッション化できるといった、ある意味冗長な造りのプログラムなら ありえるね。 OSのアイドル状態を持ち出すあたり、他に何個のプロセスがいつ走って いるか考えていないのかな?(w
443 名前:デフォルトの名無しさん mailto:sage [2009/02/27(金) 10:43:58 ] >>441 OpenMP知らないなら黙っていた方がいいと思うよ。
444 名前:デフォルトの名無しさん mailto:sage [2009/02/27(金) 10:45:51 ] >>443 3.9倍早くなるって 作ったプログラム全体?それとも特定の処理に 限定された内容?どっちなの?
445 名前:443 mailto:sage [2009/02/27(金) 11:04:31 ] >>444 私に聞くなw 恐らく演算に集中している部分じゃないの? MKLなんかは大き目のデータのFFTでそれくらいのリニアリティを叩き出すから。
446 名前:デフォルトの名無しさん mailto:sage [2009/02/27(金) 13:15:48 ] embarrassingly parallel なワークロードならそれくらい行ってもおかしくない でも大抵の処理は並列化不可能な部分が無視できない量存在してて、 アムダールの法則でもって高速化の限界が簡単に見えてしまうと思うよ
447 名前:デフォルトの名無しさん mailto:sage [2009/02/27(金) 13:58:29 ] >>436 コンシューマー相手のソフトウェアのパッケージ販売の観点からは 明らかに優れている。全然スレ違いだが。
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 ] これは惨めなミス。