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】 【言語】 【実行環境】 【その他突起する事項】
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しか知らない癖にバカにしてたなんて 恥ずかしい理由じゃありませんよねぇ当然。
549 名前:デフォルトの名無しさん mailto:sage [2009/04/20(月) 16:23:18 ] | J
550 名前:デフォルトの名無しさん mailto:sage [2009/04/20(月) 19:35:31 ] 【OS】WindowsXP SP3 【言語】C ソース ttp://f50.aaa.livedoor.jp/~iwazaki/uploader/src/up2117.txt ↑をcygwinでコンパイルすると In function `thread_func': 14: warning: assignment makes integer from pointer without a cast In function `main': 54: warning: passing arg 3 of `pthread_create' from incompatible pointer type というエラーが出ます。 14行目と54行目が悪いことはわかりますが具体的な原因がわかりません。 ちなみにexeファイルは生成されます。 よろしくお願いします。
551 名前:デフォルトの名無しさん mailto:sage [2009/04/20(月) 20:32:51 ] >>550 4: warning: assignment makes integer from pointer without a cast In function `main': キャスト無しじゃ整数をポインタにできないっていうような事書いてあるね。 pthreadのプロトタイプはこんな感じで第3引数には関数ポインタを、第4引数にはvoidポインタを取るように なってる? int pthread_create(pthread_t * thread, pthread_attr_t * attr, void * (*start_routine)(void *), void * arg); 君のコードだといずれもdoubleにキャストしているけど何故だい? pthread_create(&a[i], NULL, (double *)thread_func, (double *)array); ※スレッドなんて飛躍したものに手を出す前にこの手のエラーを自己解決できる 程度には言語機能を勉強し直した方がいい。
552 名前:デフォルトの名無しさん mailto:sage [2009/04/20(月) 20:41:56 ] >>550 んだんだ、 それに、Cなんだから、void * が絡むときはキャストしない方が 素直で、読みやすいコードになる。 たとえば、 double *data = (double *) arg; は、 double *data = arg; としろ、ってことね。C++から来た人はこれをやりたがるのね。 C++だとこの場合にもキャストが必要だから。 乱文澄まそ
553 名前:デフォルトの名無しさん mailto:sage [2009/04/21(火) 01:49:59 ] >>551 pthread_create(&a[i], NULL, (double *)thread_func, (double *)array); は単に見落としていたようです。 お手数掛けて申し訳ないです。 直したらこの行のエラーは出なくなりました。 >>552 C++をやっていたわけではないのですが、配布されたソースコードの例にはこの形で書かれていたのでそれに準じて書きました。 そしてまだ14行目でエラーが出ますがpthread_selfの扱い方はそもそもこれでよいのでしょうか? ちょろっと調べて出てきたものを使っただけなのでよく理解していません。
554 名前:553 mailto:sage [2009/04/21(火) 02:06:23 ] すみません、調べたらわかりました。 ただし他の問題が浮上しました。 pthread_t型をint型か何かに変換できないんですかね・・・。
555 名前:デフォルトの名無しさん mailto:sage [2009/04/21(火) 02:31:33 ] >>554 pthread_tはポインタか構造体かなんかでしょ。 そもそも、別の型に代入しちゃいけない。 語のライブラリだと結構やろうと思えば別の型 に無理やり代入する事も出きるけどしちゃいけない、 内部に干渉しちゃいけないものがある。 大体識別値(discriptor)と呼ばれるものなんかがそう。 あと、初心者の内はメモリ操作が簡単にできる事が解って乱用する 人がいるがポインタのキャストはやたらめったらつかうもんじゃない。 てか、君の悩みはスレッド以前の問題だから、Cの初心者スレなんか で質問しなさい。
556 名前:デフォルトの名無しさん mailto:sage [2009/04/21(火) 20:37:55 ] 言い方は気にくわないなw 小さい芽潰して楽しんでるふうにしかみえねーよ老害 >>554 pthread_tはunsinged longのtypedefだよ
557 名前:デフォルトの名無しさん mailto:sage [2009/04/21(火) 21:56:02 ] >>556 何を言ってるんだおまえは? >>550 のwarningを100回読み直してから出直してこい
558 名前:デフォルトの名無しさん mailto:sage [2009/04/22(水) 00:05:38 ] >小さい芽潰して楽しんでるふうにしかみえねーよ老害 ふーん 芽をつぶして楽しんでて害なんだ ふーん
559 名前:デフォルトの名無しさん mailto:sage [2009/04/22(水) 01:49:54 ] そうなんじゃね、多分。
560 名前:デフォルトの名無しさん mailto:sage [2009/04/22(水) 02:46:06 ] 大人なんだからもっと仲良くしろよ
561 名前:デフォルトの名無しさん mailto:sage [2009/04/22(水) 21:38:45 ] 歯痛制御で俺の虫歯を何とかしてくれ
562 名前:デフォルトの名無しさん mailto:sage [2009/04/22(水) 22:28:22 ] チュイーン ギキィィーー
563 名前:555 mailto:sage [2009/04/22(水) 22:56:29 ] >>556 俺、21歳なんだが。3D関連でC++始めて5年以上にはなるが、 そうか俺も、もう老害か・・・。
564 名前:デフォルトの名無しさん mailto:sage [2009/04/23(木) 00:01:02 ] >>561 本業歯医者の趣味グラマだけど何か用?
565 名前:デフォルトの名無しさん mailto:sage [2009/04/23(木) 02:10:25 ] >>564 医者の趣味グラマっておおいな。 LHAも医者だし猫プロの筆者も医者。 しかも、本業より優秀そうなんだよな・・・。
566 名前:デフォルトの名無しさん mailto:sage [2009/04/23(木) 02:33:52 ] 本当は工学系にいきたかったのに、 なまじっか頭いいと医療系への進学を勧められちゃう奴って多いからな
567 名前:デフォルトの名無しさん mailto:sage [2009/04/23(木) 09:19:51 ] いつも思うんだけど、歯科治療技術も日々発展してるだろうから 古い医者より新しいところの方がいいのかねえ
568 名前:デフォルトの名無しさん mailto:sage [2009/04/23(木) 11:19:32 ] ジャストシステムのスタートアップにも医学生がいたな。 人間って本当に不公平にできてるよ。
569 名前:デフォルトの名無しさん mailto:sage [2009/04/23(木) 12:48:15 ] >>564 予約時間の十分前には歯科に着いているのに 待合室で一時間待たされ、診察室に通されたと思ったら また三十分以上待たされるのを何とかしてくれ どう見ても歯科医と歯科助手がデッドロックを起こしているようでなかなか回ってこない
570 名前:デフォルトの名無しさん [2009/04/23(木) 19:35:34 ] >>569 誰がうまいこと言えとw デッドロックは言いえて妙だったわ。
571 名前:デフォルトの名無しさん mailto:sage [2009/04/23(木) 23:58:32 ] >>567 少なくとも、レントゲン撮影したら「現像するから日を改めて」なんてところは止めた方がいい。 今時、治療椅子ごとに端末があってそこで見られるのが当たり前。
572 名前:デフォルトの名無しさん mailto:sage [2009/04/24(金) 09:00:21 ] >>571 端末は無いけど、数分で現像したフィルムができるのが普通じゃない? 2,30年前からそうだったと思うんだけど
573 名前:デフォルトの名無しさん mailto:sage [2009/04/24(金) 09:44:28 ] いい加減にしとけよ
574 名前:デフォルトの名無しさん [2009/04/24(金) 11:57:45 ] マルチスレッドと減増 関係あっても、遠い存在のような
575 名前:デフォルトの名無しさん mailto:sage [2009/04/24(金) 17:51:20 ] >>556 老害ではなく、基地害だ
576 名前:デフォルトの名無しさん mailto:sage [2009/05/02(土) 22:30:20 ] 俺の日記帳 今日は5月2日です。 何してるの?
577 名前:デフォルトの名無しさん [2009/05/04(月) 23:25:22 ] C++0xではマルチスレッドプログラムを組むのは 容易になるのであろうか
578 名前:デフォルトの名無しさん mailto:sage [2009/05/04(月) 23:26:23 ] C++でマルチスレッドは危険ですよ
579 名前:デフォルトの名無しさん mailto:sage [2009/05/04(月) 23:36:49 ] >>578 Win32本では平気でマルチスレッド走らせる例が書いてあるけど デッドロックについても詳しく説明してある
580 名前:デフォルトの名無しさん mailto:sage [2009/05/05(火) 04:20:22 ] >>579 なんだその会話になってないレスは
581 名前:デフォルトの名無しさん mailto:sage [2009/05/05(火) 06:50:37 ] CやC++の言語レベルではマルチスレッドについての取り決めはない。 ライブラリ(pthreadなど)やプラットフォーム(osやハードウェア)や実装(コンパイラ)レベルで、 扱いが決められているので、そういったものの前提抜きでマルチスレッドは語れない。
582 名前:デフォルトの名無しさん mailto:sage [2009/05/05(火) 09:33:35 ] メモリモデルの仮定が入っちゃうからやりにくいだろうなあ
583 名前:デフォルトの名無しさん mailto:sage [2009/05/05(火) 09:58:42 ] >577 concurrency 周りが大幅に強化されてるんで、恐らくは。
584 名前:デフォルトの名無しさん mailto:sage [2009/05/09(土) 12:04:34 ] マルチスレッドにする利点は何? 複数の処理を同時に走らせることができるなんて妄想は無しで。
585 名前:デフォルトの名無しさん mailto:sage [2009/05/09(土) 12:10:53 ] 世界の全てが妄想なので、答えは消滅しました。
586 名前:デフォルトの名無しさん mailto:sage [2009/05/09(土) 12:12:54 ] 複数の処理を同時に走らせることができる、妄想で無しに。
587 名前:デフォルトの名無しさん mailto:sage [2009/05/09(土) 13:11:27 ] 個人的には>>584 が何故「複数の処理を同時に走らせることができる」ことが妄想だなんて妄想を抱いたのか知りたい希ガス。 マルチスレッドの利点は全てそこから派生しているはずなのだが。
588 名前:デフォルトの名無しさん mailto:sage [2009/05/09(土) 13:25:02 ] >>587 TSSは同時ではないとでも言いたいんじゃないか?
589 名前:デフォルトの名無しさん mailto:sage [2009/05/09(土) 15:05:51 ] >複数の処理を同時に走らせることができる ってのはいわゆる手段なんで。 大元の目的は「暇をもてあましてるリソースを有効活用する」だな。 マルチスレッドはCPUがヒマしてる場合の、GPGPUはGPUがヒマしてる場合の手段だな。 >584がどんな妄想してるか迄はわからんが。
590 名前:デフォルトの名無しさん mailto:sage [2009/05/09(土) 15:53:09 ] >>589 それ以外にもあるぞ。むしろプログラマ的にいちばんうれしいのは、コンテキストの異なる処理を明示的な切り替え無しに同居させられることじゃなかろうか。 重い処理を別スレッドでガリガリ処理しつつ、その進行状況をGUIで表示するとか。
591 名前:デフォルトの名無しさん mailto:sage [2009/05/09(土) 23:10:29 ] ハァ? すべてをファイル・デバイスにしてそれをpollすればシングルスレッドで可能ですが何か?
592 名前:デフォルトの名無しさん mailto:sage [2009/05/09(土) 23:20:27 ] スレタイ無視
593 名前:デフォルトの名無しさん mailto:sage [2009/05/09(土) 23:39:00 ] 昔のunixはスレッドなしでもfork/execだけでたいていの事はやれてたな。
594 名前:デフォルトの名無しさん mailto:sage [2009/05/10(日) 05:27:53 ] >>591 ちょっと話違うが、Androidのセンサーまわりの設計もそんな感じ。 だが、そのファイルディスクリプタをもらう元が、1つしかなかったり してセンサーごとにドライバが作れない。 1.0のころはモジュール化すらされてなかったり、1.5になっても いまだダセー設計だし。設計したやつの顔が見たいな。
595 名前:デフォルトの名無しさん mailto:sage [2009/05/10(日) 08:32:10 ] ドライバといった低レベルI/O処理の基本はスレッドより割り込み。 割り込みがないディバイスだとポーリングも使うけど。
596 名前:デフォルトの名無しさん mailto:sage [2009/05/10(日) 09:07:05 ] 何かの処理で待ちも含めてぐるぐる回りながら、他の処理も同時にやりたい、とかいう場合に いちいち処理を細切れにしてpollを含むメインループから呼び出す形に縛られるのは面倒だわな。 マジレスすると。
597 名前:デフォルトの名無しさん mailto:sage [2009/05/10(日) 10:29:43 ] >>593 でも今はマルチスレッドがサポートされているということは、その煩雑な方式では力不足だったってことだよね。
598 名前:デフォルトの名無しさん mailto:sage [2009/05/10(日) 10:51:01 ] 今のところは、 やることを細切れにできるようにしておいて pollするスレッド(大半の時間は待機)が 少数のワーカーに仕事を振り分け ワーカーはひたすら仕事だけを待ちつづける、というやり方が I/O待ちやマルチCPU(コア)を有効に生かせ、 メモリやコンテキストスイッチのロスも少なく出来ると言われてるな。
599 名前:デフォルトの名無しさん mailto:sage [2009/05/10(日) 10:56:07 ] 開発効率という効率を無視すれば、それがベストだねw
600 名前:デフォルトの名無しさん mailto:sage [2009/05/10(日) 13:17:08 ] OSのスケジューラをエミュレートしてるだけのような
601 名前:デフォルトの名無しさん mailto:sage [2009/05/10(日) 15:04:43 ] コア数を大幅に越えるスレッドを生成すると、 コンテキストスイッチのせいでむしろ性能が低下する。ってのは本当なの? 実測して確かめたいんだけど、どういうコードを書けばいいのか解らん。 えろいひと教えて
602 名前:デフォルトの名無しさん mailto:sage [2009/05/10(日) 15:07:34 ] スレッドプールにすりゃ解決よ
603 名前:デフォルトの名無しさん mailto:sage [2009/05/10(日) 15:11:52 ] >>601 本当 スレッドに手を出した頃それに嵌ったことがある 各スレッドの同期にmutex/conditionを使う形で大量のスレッド作って試してみればわかるよ むやみにスレッド数を多くするのはそもそも設計が良くないです
604 名前:デフォルトの名無しさん [2009/05/10(日) 16:01:38 ] オーバーヘッドが増大する。 スレッドの多さは関係無し。 たとえば1ms以内で終了するスレッドを生成すれば効率悪い。
605 名前:デフォルトの名無しさん mailto:sage [2009/05/10(日) 16:02:56 ] >>601 スレッドって、一般にはコンテキストスイッチが入らない (だから軽い)というモノだろう? 原理的には性能低下は無い。 但し、実際のところコア間でキャッシュを共有してたり、 メモリバスを共有してるので、複数のコアを同時に使うことで シングルコアよりも性能低下することはありうる。
606 名前:デフォルトの名無しさん mailto:sage [2009/05/10(日) 16:22:26 ] マルチスレッドのプログラム組んでるんでて ある変数に複数のスレッドから同時にアクセスできるときは 排他的処理しないとだめ? というか たぶん今のエラーはそうだろうと思う
607 名前:デフォルトの名無しさん [2009/05/10(日) 16:24:10 ] 複数スレッドからアクセスしても、OSがエラーはいたことはないな。 値は、ぶっ壊れるけどね。
608 名前:デフォルトの名無しさん mailto:sage [2009/05/10(日) 16:28:00 ] 読むだけなら問題ない
609 名前:デフォルトの名無しさん [2009/05/10(日) 16:29:54 ] 読み書きしても、エラーでたことない。 たとえばグローバルsum=0に、複数スレッドから足し算してもエラーで停止しないが。
610 名前:デフォルトの名無しさん [2009/05/10(日) 16:31:49 ] どういった場合に、メモリーエラーが起こるのかが知りたい。
611 名前:デフォルトの名無しさん mailto:sage [2009/05/10(日) 16:33:36 ] >>605 > スレッドって、一般にはコンテキストスイッチが入らない 今コンキストスイッチしないのって絶滅危惧種だろ
612 名前:デフォルトの名無しさん mailto:sage [2009/05/10(日) 16:36:05 ] なるほど 変数がスタックで削除したり追加したりだからダメなのか
613 名前:デフォルトの名無しさん mailto:sage [2009/05/10(日) 18:23:53 ] >>605 マテ、スレッドでもコンテキストスイッチは発生するぞ。 スレッドが(プロセスに比べて)軽いのは、スタックとレジスタだけ 切り替えれば済む(これもコンテキストの切り替えだ)からであって、 コンテキストスイッチそのものが行われないからじゃない。
614 名前:デフォルトの名無しさん mailto:sage [2009/05/10(日) 18:26:42 ] 1CPUの場合はタイムスライスだけになるから減らないが、 CPUが複数ならスイッチ自体を減らせるという話じゃないかい。
615 名前:デフォルトの名無しさん mailto:sage [2009/05/10(日) 22:05:51 ] >>613 ユーザランドでのスレッド実装だと カーネルモードに入る回数が少なくて済むとかじゃね? というかこの手のは、何が重いか時代により激しく違ってくるから 一般論といってもそれが何時のものかによるなあ
616 名前:デフォルトの名無しさん mailto:sage [2009/05/11(月) 21:55:27 ] 昔を語るのが一般とは思えない。
617 名前:601 mailto:sage [2009/05/11(月) 22:46:47 ] 時代によって変わるもんなのか。 レジスタ、スタックの退避とか、カーネルに入って出てくる処理とかが重いのかとかとか思ってたんだけど。 fiberは軽いよ。とか聞くけど、それはおいといて。 >>603 mutexとか排他は考えないで、純粋に「コンテキストスイッチ」処理がどれくらい重いもんなのか 図りたい。 linuxでpthread使ってやろうと思ってるんだけど、どんなコードを書けばいいんだろ 単純に0から0xffffffffまで足す処理をシングルスレッドでやるか、 0〜0xffを足す処理を0x1010101個のスレッド立てて計算させて、どっちが早いか。とか?<そりゃないだろって
618 名前:デフォルトの名無しさん [2009/05/11(月) 22:57:13 ] >>617 CPUの数だけ分割するのが速い
619 名前:デフォルトの名無しさん mailto:sage [2009/05/11(月) 23:28:58 ] 例えば 20ms(OS次第)以上かかる計算処理を一つのJobとして Job計10000個をキューに入れる。 スレッドをプールしておいて、各スレッドはキューからJobを取り出してひたすら実行する。 この時、プールするスレッド数をプロセッサ数と同数の場合と2000個の場合とで実行時間を計る。 現実的には、スタック領域以外にも 各スレッドで多少の独立したメモリ領域は使うことが多いと思われるので ただの(レジスタやスタックで納まる)計算はではなく、 16Kなり64Kなりの領域をスレッド毎に確保しておいて その内部の値を使った計算とする。 等というのはどうだろうか。
620 名前:デフォルトの名無しさん mailto:sage [2009/05/11(月) 23:39:02 ] 別にキューに入れる必要無いな。 同じことを繰り返すだけなんだから、CASを使ったカウントアップだけして 一定の数字になったらスレッド終了で充分か。 これなら、共有メモリを使えば、プロセスとの比較も出来る。 ただ、スレッドは「スタートのシグナル」を全部同時に出すことが出来るけど プロセスだとどうなんだろ。全然知らない。
621 名前:デフォルトの名無しさん [2009/05/21(木) 21:54:47 ] 昔はPVM、今の時代はMPI そしてOpenMPとMPIのハイブリッド実行が主流なのだろうか
622 名前:デフォルトの名無しさん mailto:sage [2009/05/21(木) 22:39:20 ] >同じことを繰り返すだけなんだから、CASを使ったカウントアップだけして >一定の数字になったらスレッド終了で充分か。 こんな非現実的な処理の時間を計測して何の意味があるわけ?
623 名前:デフォルトの名無しさん mailto:sage [2009/05/21(木) 22:40:10 ] おそらくプロセッサ(コア)が増えれば増えるほど遅くなると思うけど。
624 名前:デフォルトの名無しさん mailto:sage [2009/05/21(木) 22:44:10 ] ああ読み違えてたすまんのう 単に処理繰り返し数のカウントで使うだけってことね…
625 名前:デフォルトの名無しさん mailto:sage [2009/05/21(木) 23:23:37 ] VC(VisualStudio2005)でコーディングしております。 「g_hThread = (HANDLE)_beginthreadex(NULL,0,MainLoop,0,0,&g_dwThreadId)」 で、スレッドを生成し、そちらで、 if(GetAsyncKeyState(VK_UP)&0x8000) ではキーが取得できるのに、 GetKeyboardState(diks) if(diks[VK_UP] & 0x80) ではキーが取得できません。 どうも、メッセージキューやらが原因みたいですが、理屈がイマイチわかりません。 解決策や問題点など、教えていただけると幸いです
626 名前:626 mailto:sage [2009/05/22(金) 00:14:01 ] 追記です。 そもそもGetKeyboardState()はメッセージキューに溜まったものを見るものであって、 新しく生成したスレッドでは、肝心のメッセージを取得することができない、、、 というあたりまではなんとなく理解できました ちなみにやりたいことはキー情報の一括取得(できればリアルタイムの)です。 (GetAsyncKeyState()では1つ1つしか取れないので・・・ 引き続き、解決策などありましたら、お願いします
627 名前:626 mailto:sage [2009/05/22(金) 01:06:46 ] 生成したスレッドの方で、 // Threadのインプットのアタッチ int targetThread, selfThread; targetThread = GetWindowThreadProcessId(GetForegroundWindow(), NULL); selfThread = GetCurrentThreadId(); AttachThreadInput(selfThread, targetThread, TRUE ); /*===== メインループ =====*/ // Threadを切り離す AttachThreadInput(selfThread, targetThread, FALSE ); とすれば、GetKeyboardState()でも一応取得できました。 荒療治な気がしますが・・・ もっと良い方法などありましたら、お願いします
628 名前: ◆0uxK91AxII mailto:sage [2009/05/22(金) 02:41:05 ] >>617 適当なsystemcallを行い、前後でCPUのtimestampでも読めば、 最も軽い場合については、調べられる。 >>625 DirectInputを使うとか。