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】 【言語】 【実行環境】 【その他特記する事項】
374 名前:デフォルトの名無しさん mailto:sage [2010/05/09(日) 22:01:03 ] Win32でスレッド間のイベント通知をやりたいんですが 2つのスレッドが同時にそれぞれSetEvent(), ResetEvent()を呼び出した場合の動作って定義されてるんでしょうか? やっぱりクリティカルセクションで囲ってやらないとまずいですか?
375 名前:デフォルトの名無しさん mailto:sage [2010/05/09(日) 22:39:08 ] >>374 囲む必要は無い。
376 名前:デフォルトの名無しさん mailto:sage [2010/05/10(月) 08:17:54 ] >>375 ありがとうございます。
377 名前:デフォルトの名無しさん mailto:sage [2010/05/10(月) 20:41:23 ] イベントオブジェクト自体の動作には問題ないけど、 使い方ミスりやすいから十分気を付けた方がいいよ。
378 名前:デフォルトの名無しさん mailto:sage [2010/05/10(月) 23:08:00 ] プロのコードではイベントオブジェクトは使われない
379 名前:デフォルトの名無しさん mailto:sage [2010/05/10(月) 23:37:24 ] 配布したときに問題が出るからな
380 名前:デフォルトの名無しさん mailto:sage [2010/05/11(火) 03:50:40 ] どんな?
381 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 22:45:33 ] 無名にすれば他のプロセスと衝突することも無いし、kernel32.dllだから別にDLLも不要だし問題が思いつかないな
382 名前:デフォルトの名無しさん mailto:sage [2010/05/13(木) 07:37:01 ] なんか勘違いしてんだろ
383 名前:デフォルトの名無しさん [2010/05/16(日) 21:15:32 ] wait-freeなキューの実装を可能にするのに必要な不可分操作ってどんなんですか?
384 名前:デフォルトの名無しさん mailto:sage [2010/05/16(日) 23:08:56 ] 候補となる不可分操作には何があるの?
385 名前:383 [2010/05/16(日) 23:57:41 ] >384 JAVAのConcurrentLinkedQueueだとCASをつかってるってことしか知りませんが..
386 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 00:45:56 ] wikiによるとcasみたいだね ja.wikipedia.org/wiki/Lock-free%E3%81%A8Wait-free%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0
387 名前:デフォルトの名無しさん mailto:sage [2010/05/20(木) 23:12:58 ] スレッド間のヘルスチェックに定番な方法ってあるのでしょうか? ・マスターなスレッドAが外部変数にスレッド数分bit1を立てる ・B以降のスレッドは、自分に対応するbitを落とす ・一定時間、0じゃなかったら誰かが止まってるのでNG とかすると、sem_wait()で普段寝ている人(これはその時だけ起こせばいい?)や、 recvやselectで待ってる人の確認はできない。。
388 名前:デフォルトの名無しさん mailto:sage [2010/05/21(金) 00:00:00 ] スレッドのヘルスチェックって要るのかな?プロセス間だったら必要かも知れなけど。
389 名前:デフォルトの名無しさん mailto:sage [2010/05/21(金) 00:05:09 ] 大事な役割を持ったスレッドが刺さってないか確認したいんじゃないの
390 名前:デフォルトの名無しさん mailto:sage [2010/05/21(金) 01:47:25 ] タイムアウト指定して待ちっぱなしにならないようにするのが基本
391 名前:デフォルトの名無しさん mailto:sage [2010/05/21(金) 18:56:29 ] ワーカースレッドとUIスレッド分けたとき、時間のかかる作業を ワーカースレッドがしているとき、UIスレッドはどうしているべきでしょうか 今は終わるのを待たずに終わるまでデータ変更の起こる操作を禁止しています でもそれだとウィンドウ動かせるくらいしかメリットがないので考え中です
392 名前:デフォルトの名無しさん mailto:sage [2010/05/21(金) 19:03:15 ] >>391 俺は[中止]ボタンが押されるのを待つか、タイマーで定期的に終了したかどうか チェックしてる。あとプログレスバー表示。
393 名前:デフォルトの名無しさん mailto:sage [2010/05/21(金) 19:49:50 ] ボタンを禁止にしたりキャンセルを受け付けたり面倒だよな それとプログレって、量的な変化ならいいが、 手続き的な進行表示には不向きだよな
394 名前:デフォルトの名無しさん mailto:sage [2010/05/21(金) 20:05:26 ] 全体量がわからないやつはつらいよね \-/-\-...ってやつが好きw
395 名前:デフォルトの名無しさん mailto:sage [2010/05/21(金) 21:03:40 ] 経過表示なら1/n「(説明)」〜n/n「完了」でいいと思うんだ
396 名前:デフォルトの名無しさん mailto:sage [2010/05/24(月) 23:34:30 ] progress_display「呼んだ?」
397 名前:デフォルトの名無しさん mailto:sage [2010/05/25(火) 09:11:50 ] いや、全然呼んでないよ
398 名前:デフォルトの名無しさん mailto:sage [2010/06/26(土) 14:48:12 ] マルチスレッド・アプリケーション開発のためのインテル・ガイド www.xlsoft.com/jp/products/intel/article/guide/index.html
399 名前:デフォルトの名無しさん [2010/06/27(日) 14:54:02 ] >>391 おれはその処理に関連するメニューだけロック(選択不可とか無視とか)して他の操作は許可してる 処理が終わったら通知ポップアップ 処理状況なんかはモーダレスじゃないプログレスバーかステータスバー表示
400 名前:デフォルトの名無しさん [2010/06/27(日) 15:01:41 ] >>393 でも長時間うんともすんとも言わないと不安になるからそういう場合は一秒に一ブロックぐらい進むプログレスバー繰り返してる 中止は処理スレッドに定期的に中断フラグチェックさせてプログレスバーダイアログのOnClose/OnCancelで終了フラグOn+WaitForSingleObjectさせればOK
401 名前:デフォルトの名無しさん mailto:sage [2010/07/02(金) 23:09:47 ] ttp://blogs.wankuma.com/jitta/archive/2010/02/05/185818.aspx なんかえらい絡まれてるくらい突っ込まれてるみたいなんだけど やっぱりこの記事おかしいの? それともコメントの方がおかしい?
402 名前:デフォルトの名無しさん mailto:sage [2010/07/02(金) 23:28:25 ] >>401 バブルソートを題材にするとか並列化のサンプルとして適切じゃないというかフェアじゃないというか、あえてそれを選ぶのはなぜ?って話でしょう。
403 名前:デフォルトの名無しさん mailto:sage [2010/07/02(金) 23:40:12 ] >何でもかんでも並列化すれば、等しく速くなるわけではない 記事の結論には同意だけど記事書いてるひとはアホ
404 名前:デフォルトの名無しさん mailto:sage [2010/07/03(土) 02:56:46 ] >>403 同意だな。 並列化に向いたアルゴリズムをつかわにゃ早くならんしな。 ていうか変数shareしすぎ。
405 名前:デフォルトの名無しさん mailto:sage [2010/07/03(土) 08:13:40 ] だらだらと下手糞なコードを書いて速くならねえよと喚かれてもな そんな記事にはほとんど価値がない
406 名前:デフォルトの名無しさん mailto:sage [2010/07/03(土) 09:47:23 ] 結局バグってたっぽいw コメントが間違ってなければだが。
407 名前:デフォルトの名無しさん mailto:sage [2010/07/03(土) 10:07:39 ] 記事自体は、アルゴリズムによって効率的に並列化できるとは限らないから云々んという内容なので、 記事自体が(素人にとっては)無意味だとまでは言わんが、 この人偉そうな言い方したり他人の記事に対しては重箱レベルで突っ込んだりもしてるくせに 自分の記事は内容が結構いい加減なんだよな。
408 名前:デフォルトの名無しさん mailto:sage [2010/07/03(土) 11:48:12 ] そんな人は世間にはいっぱいいる
409 名前:デフォルトの名無しさん mailto:sage [2010/07/03(土) 23:15:55 ] 「並列処理は〜」と一般化された題材に対して、帰納法で証明しようとしているのが問題かな 「マルチスレッドに向かないアルゴリズムがある」というテーマならこの方法で十分だけど
410 名前:デフォルトの名無しさん [2010/07/04(日) 00:08:29 ] むしろ、そうじゃない人を見たら驚く。ライターなんてゲームの販売と同じ。 品物を売るまで、記事を読ませるまでが勝負。その後や内容なんて気にしなくてよい。
411 名前:デフォルトの名無しさん mailto:sage [2010/07/04(日) 00:24:14 ] ライターじゃないだろ
412 名前:デフォルトの名無しさん mailto:sage [2010/07/04(日) 00:39:12 ] 金とってんのか
413 名前:デフォルトの名無しさん mailto:sage [2010/07/04(日) 00:39:57 ] ひとをみたらライターと思え
414 名前:デフォルトの名無しさん mailto:sage [2010/07/04(日) 17:20:36 ] ゲームの販売と同じなら、クソゲー売り続けるのと名作売り続けるのじゃ全く末路が 違うことくらい分かるだろうにアホか
415 名前: ◆0uxK91AxII mailto:sage [2010/07/04(日) 20:15:36 ] >>401 記事を書いている本人が明らかに知識不足で、可笑しい。 テキトーに眺めただけで、コイツはダメだって分かるレベル。
416 名前:デフォルトの名無しさん mailto:sage [2010/07/04(日) 20:54:04 ] 並列化したプログラムの例として、アトミックな足し算使った合計計算のコードを出すような人だからな。 何がしたいのかさっぱりわからんレベル。 ほんとにまともなマルチスレッドのプログラム書いたことあるんかと。
417 名前:デフォルトの名無しさん mailto:sage [2010/07/04(日) 21:44:51 ] >アトミックな足し算使った合計計算 とりあえずPageRankみたいな巨大行列計算だと使うんじゃないかな。 並列化というより分散化したいレベルだけど。
418 名前:デフォルトの名無しさん [2010/07/04(日) 22:58:48 ] まともに組んだことがない人の記事だな
419 名前:デフォルトの名無しさん mailto:sage [2010/07/05(月) 20:30:55 ] まあそこまで批判するべきことじゃない わからないから試すのであって、わかるならする必要はない まあ公開するならそれなりに検証して見栄を張るべきだとは思うけどねw素直すぎる
420 名前:デフォルトの名無しさん mailto:sage [2010/07/05(月) 21:43:17 ] MTでパフォーマンス出すには、理屈を理解する頭が無いとどうしようもない気はする
421 名前:デフォルトの名無しさん mailto:sage [2010/07/05(月) 22:06:11 ] 分からないから試す、にも二通りある 「何が分からないかを分かった上で試す」のか 「何が分からないかも分からないまま試す」のか まぁ>>401 に関しては、ほんとにチラ見しただけでバカ記事っつーか、むしろ真面目に 叩いて貰えてるだけ幸せなんじゃね? いやマジで、俺ならこんなのに関わる気にもならんわ。 どうせバカ記事書いた本人は「めんどくせぇのに絡まれたわ」程度にしか思わねーんだろ と思うとなぁ。
422 名前:デフォルトの名無しさん mailto:sage [2010/07/05(月) 22:20:05 ] >>419 この人の並列処理関連のいろいろなブログ記事とかCodeZineの記事ね、 元々ほかの人の並列処理関連の記事の批判から始まってるんだよね。 ばかなこと書いてるやつがいるので俺が訂正してやるって、 ほんとにこういう感じなのね。 で、あの記事なんだわ。
423 名前:デフォルトの名無しさん mailto:sage [2010/07/05(月) 22:23:21 ] >>421 なぜ?氏の指摘はやっぱりおおよそ的を射てる内容なのかな?
424 名前:デフォルトの名無しさん mailto:sage [2010/07/05(月) 22:27:57 ] つうか着々と増え続けとる…
425 名前:デフォルトの名無しさん mailto:sage [2010/07/06(火) 19:33:04 ] へえ
426 名前:デフォルトの名無しさん mailto:sage [2010/07/06(火) 20:01:42 ] ほぉ
427 名前:デフォルトの名無しさん mailto:sage [2010/07/07(水) 22:49:02 ] >まともに組んだことがない人の記事だな ttp://blogs.wankuma.com/jitta/archive/2009/10/21/182308.aspx まともに組んだことはあまりないようだなw
428 名前:デフォルトの名無しさん mailto:sage [2010/07/07(水) 23:20:11 ] なぜ? Posted @ 2010/07/07 22:46 >スレッドの終了を、もうちょっとスマートに待てないのかなぁ?まぁ、動いてるからいいや。 全然よくありません。 Sleep(0)を入れているとはいえ、無駄なループでCPUを使用していては、まともな計測はできません。 コア数以上にスレッド数を増やしても改善していってしまうのは、これも原因なのではないですか? >おかしいと思ったらできるところまで追求する。それが職人ってもんじゃないですかねー。似非職人はヤーネー。 いくらなんでもこんなこと言いながらこれではダメでしょう。
429 名前:デフォルトの名無しさん mailto:sage [2010/07/07(水) 23:44:31 ] 本人に言えよ
430 名前:デフォルトの名無しさん mailto:sage [2010/07/07(水) 23:57:00 ] おまえならできる
431 名前:デフォルトの名無しさん mailto:sage [2010/07/08(木) 00:19:44 ] ?
432 名前:デフォルトの名無しさん mailto:sage [2010/07/08(木) 00:24:16 ] 本人?
433 名前:デフォルトの名無しさん [2010/07/08(木) 01:19:38 ] 馬鹿が呟いているだけだから無視でいいだろ。話題にすらならん。
434 名前:デフォルトの名無しさん mailto:sage [2010/07/08(木) 01:42:21 ] ヲチスレじゃないしな もう少しマシな話題ならともかく、内容がどうでもよさすぎる
435 名前:デフォルトの名無しさん mailto:sage [2010/07/08(木) 01:58:28 ] 最近話題がない
436 名前:デフォルトの名無しさん mailto:sage [2010/07/08(木) 02:29:13 ] くだらないネタで流れるなら止まってた方がずっといい
437 名前:デフォルトの名無しさん mailto:sage [2010/07/09(金) 11:00:47 ] マルチスレッドと関係ないかもしれないけど、 CPUって忙しくないときどんな状態になってるんですか? 割り込み待ち状態なんですか? それともなんらかの無限ループ状態なんですか?
438 名前:デフォルトの名無しさん mailto:sage [2010/07/09(金) 12:15:51 ] 忙しくなさ次第でいろいろ
439 名前:デフォルトの名無しさん mailto:sage [2010/07/09(金) 21:49:46 ] >>437 ちょっと暇なときは、いっしょうけんめいだらだらしてる。 だいぶ暇なときは、夢の国へいく。
440 名前:デフォルトの名無しさん mailto:sage [2010/07/09(金) 21:49:51 ] >>438 アイドリング状態
441 名前:デフォルトの名無しさん mailto:sage [2010/07/09(金) 22:03:35 ] img.20ch.net/idol/s/idol20ch21832.jpg
442 名前:デフォルトの名無しさん mailto:sage [2010/07/09(金) 23:35:26 ] SUZUKAサーキット www.youtube.com/watch?v=FTxgrkmX2SA
443 名前:名無しさん@そうだ選挙に行こう mailto:sage [2010/07/10(土) 06:31:23 ] >>440 それじゃ何の説明にもなってない つーか環境次第で千差万別だから、本気でそういう情報が必要なら仕様書を当たるといい 単に何となく興味があって聞いてみた程度なら、めんどくさいから知らなくていい 仮にx86なら、暇になったらHLTかPAUSEを仕込んでおくことが多いだろうけど、そうで ないのもあるし、単純にHLT発行すればいいって話でもないし、そもそもぶっちゃけた話、 全く知らない奴に頭っから全部説明してらんね halt状態の休み方も何段階もある訳だし
444 名前:デフォルトの名無しさん mailto:sage [2010/08/12(木) 12:18:23 ] >ちょっと暇なときは、いっしょうけんめいだらだらしてる。 スピンロックか
445 名前:350 mailto:sage [2010/08/17(火) 20:53:09 ] 「マルチスレッド」の説明する時に「マルチタスク」の状態遷移持ち出す奴がいて、俺的には「?」なんですが、そういうのありなんですか?
446 名前:デフォルトの名無しさん mailto:sage [2010/08/17(火) 21:25:38 ] プロセス空間が分かれていない頃の書籍でマルチタスク学んだ人なら普通じゃね?
447 名前:デフォルトの名無しさん mailto:sage [2010/08/17(火) 21:34:57 ] >>445 大して難しい話じゃ無いし、基本だから知っておくべきだろう。
448 名前:デフォルトの名無しさん mailto:sage [2010/08/17(火) 22:30:37 ] リアルタイムOSの「タスク」は、Unixのスレッドのようなものだったりするぞ。
449 名前:デフォルトの名無しさん mailto:sage [2010/08/21(土) 13:56:10 ] >「マルチタスク」の状態遷移 て何ぞね DORMANT/WAITING/RUNNINGとか言った類類の話ならタスク単体の状態だし タスク同士の関係は非同期というのがマルチタスクの本性であるからして、 複数タスクに渡る状態など一般には規定しようがない 設計者がタスクそれぞれに明示的に同期ロジックをプログラムしたという想定で、 その詳細が明かにされた上でなら話は別だが
450 名前:デフォルトの名無しさん mailto:sage [2010/08/29(日) 12:59:13 ] まあ、>>445 は理解できなかったって言ってるんだから説明も出来ないだろう
451 名前:デフォルトの名無しさん [2010/10/01(金) 17:29:29 ] あんまり理解できてないのでうんこみたいな質問申し訳ないんだけど、 スレッドが二つ(A,B)あって、 変数 int a にスレッドAがひたすら数字を入れて、スレッドBはひたすらその数字を読むだけの場合、 int aの書き込み・読み込み時にクリティカルセクション使う必要はある? 手元で試してみたら片方が読み込みオンリーの場合正常に動いたんよね
452 名前:デフォルトの名無しさん mailto:sage [2010/10/01(金) 18:10:07 ] 移植性のあるコードを書こうと思ったら必要なる。 ただハードやOS・言語・コンパイラ・ライブラリなどが想定するメモリモデル (平たく言えばマルチスレッドでメモリがどう見えるかのルール)によっては それで正しいケースもある。 具体的な回答が欲しいならpthread、Win32のスレッド、Javaや.NETくらいの くくりで質問するといいよ。
453 名前:デフォルトの名無しさん mailto:sage [2010/10/01(金) 18:34:06 ] >>451 まず、書き込まれた値が化けたりせず正常に読めるか、という点については 適切にアラインされている、CPUのワードサイズ以下の値なら、まず問題ない。 Cコンパイラにおいて、「int」として扱われる値を Cコンパイラに配置させる場合は、まず大丈夫。 ただし、スレッドAが書き換えた後にスレッドBが読み出したとき 直前の変更が適切に反映されているかどうか、については 環境依存、というか普通は保証されない。
454 名前:デフォルトの名無しさん mailto:sage [2010/10/01(金) 18:41:34 ] 一方通行なら問題ないでしょ
455 名前:デフォルトの名無しさん mailto:sage [2010/10/01(金) 18:44:58 ] 他に受け渡すデータが一切どこにも何もなくて、ただその数字1個を渡せばいいだけなら
456 名前:デフォルトの名無しさん mailto:sage [2010/10/01(金) 18:49:48 ] ハード依存OKということならシングルCPUのPCは スレッドに関するほとんどの問題発生しないし正常に動くね。
457 名前:デフォルトの名無しさん mailto:sage [2010/10/01(金) 18:55:25 ] 読み出しで値を比較するときはちょっと考えないといけないかも
458 名前:デフォルトの名無しさん mailto:sage [2010/10/01(金) 18:57:15 ] >>456 いくらなんでも、理解して無さすぎ
459 名前:デフォルトの名無しさん mailto:sage [2010/10/01(金) 18:57:30 ] >>452 すまん、VC++で、Win32APIのCreateThread使った話だった >>453 thx 直前の変更は特に気にしなくてもよさそう 取り扱う変数がvectorとかlistになってくるとまた違うんかな……
460 名前:デフォルトの名無しさん mailto:sage [2010/10/01(金) 22:14:34 ] ひたすらスレッドAが書き込んでスレッドBが読み出してprintfするだけなら正しく見えるが、 例えば、イベントを受け取ってスレッドAが書き込もうとして、スレッドBは読み出すとき、 読み出された値はスレッドAが書き込こむ前か後かはCPUの気まぐれになりそうな気がする。 まぁそんな時はロックしなくてもスレッドAが書き込み終わったらスレッドBに読み込むように言えばいいけど
461 名前:デフォルトの名無しさん mailto:sage [2010/10/01(金) 22:32:14 ] Win32での32bit読み書きはアトミックな操作だっけ?
462 名前:デフォルトの名無しさん mailto:sage [2010/10/01(金) 22:38:21 ] Windowsならここ読んどきゃいいよ msdn.microsoft.com/ja-jp/library/bb310595 (VS.85).aspx msdn.microsoft.com/en-us/library/ee418650 (VS.85).aspx
463 名前:デフォルトの名無しさん mailto:sage [2010/10/02(土) 04:07:15 ] >>461 Win32の環境じゃなくIA32とかx64の意味でじゃないの?
464 名前:デフォルトの名無しさん mailto:sage [2010/10/02(土) 10:36:20 ] i386SXのように外部データバスが16bitのものはどうなるんだろ。 i386SXでマルチプロセッサ構成は見たことがないけどね。
465 名前:デフォルトの名無しさん mailto:sage [2010/10/02(土) 10:56:16 ] たぶん、データが化ける可能性があると思う。 386SX以外にも、68000とか8088とかがその系統だったと思うし 今後も組み込み向けとかにそういうのが出てこないとは言い切れない。 だから、「intなら大丈夫」じゃなくて「intなら普通は大丈夫」程度。 とはいえ、組み込み向けのバス幅制限があるような環境では マルチスレッドはともかく、 マルチプロセッサ/マルチコアはまずありえないと考えて良いんじゃないかな。
466 名前:デフォルトの名無しさん mailto:sage [2010/10/02(土) 11:02:40 ] そもそも、lock prefix使えないはずなので、マルチプロセッサが構成出来ない。
467 名前:デフォルトの名無しさん mailto:sage [2010/10/02(土) 11:03:07 ] 386SXの32ビットR/Wや8088の16ビットR/Wは、読み書きは複数サイクルかもしれないけど、 完了するまで割込まれないんじゃなかった? 仕様書見て言ってるわけじゃないけど。 同じような構成で割込まれるプロセッサもあるかもしれないけど。
468 名前:デフォルトの名無しさん mailto:sage [2010/10/02(土) 11:50:37 ] 32bitのアクセスがアトミックであると保証されてるのはi486以降とIntelの資料に書いてある
469 名前:デフォルトの名無しさん mailto:sage [2010/10/02(土) 12:09:53 ] >>467 割り込みは確かに発生しないから単一コアのスレッドなら問題はないが、 マルチコア・CPUの場合は問題が発生する。
470 名前:デフォルトの名無しさん mailto:sage [2010/10/02(土) 12:18:00 ] んでi386SXのマルチプロセッサやマルチコアは実在するの?
471 名前:デフォルトの名無しさん mailto:sage [2010/10/02(土) 12:46:22 ] SXかどうかはわからないが386のマルチプロセッサはあったらしい。 ja.wikipedia.org/wiki/%E3%82%B7%E3%83%BC%E3%82%AF%E3%82%A8%E3%83%B3%E3%83%88%E3%83%BB%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF プロセッサレベルの割込みじゃなくて、バスの読み書きがどうかということだと思うんだけど。
472 名前:デフォルトの名無しさん mailto:sage [2010/10/02(土) 12:55:16 ] >>471 それはi386DXだな
473 名前:デフォルトの名無しさん mailto:sage [2010/10/02(土) 14:15:52 ] ハードのことわからんのに憶測で書くなよ
474 名前:デフォルトの名無しさん mailto:sage [2010/10/02(土) 15:18:15 ] >>468 i386まではDMA操作なら割り込めた、CPU単体でならアトミックだったがSXでマルチプロセッサ組んだらダメだろうと思う
475 名前:デフォルトの名無しさん mailto:sage [2010/10/02(土) 15:22:14 ] 小数点付きのプログラムカウンタのあるCPUでも使ってるんかね
476 名前:デフォルトの名無しさん mailto:sage [2010/10/02(土) 22:16:44 ] >>475 パイプラインの途中を指し示したいみたいな?
477 名前:デフォルトの名無しさん mailto:sage [2010/10/02(土) 23:05:16 ] たぶん475は、全ての命令が1クロックで実行できると思ってる。
478 名前:デフォルトの名無しさん mailto:sage [2010/10/02(土) 23:52:07 ] intelのは1クロックで動くんじゃないの
479 名前:デフォルトの名無しさん mailto:sage [2010/10/02(土) 23:58:09 ] ワイヤードロジックをほぼ全体に使うようになったのは486から
480 名前:デフォルトの名無しさん mailto:sage [2010/10/03(日) 00:08:11 ] >>467 割り込みと、トランザクションをごっちゃにしてる? CPUの割り込みはR/Wの間に中断しないだけ。 マルチプロセッサについてはRとWが別のトランザクションなんでR/Wの間に別のプロセッサのRやWが割り込める。 この割り込みを防ぐ信号を駆動するのがインターロック命令
481 名前:デフォルトの名無しさん mailto:sage [2010/10/03(日) 01:17:48 ] ttp://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Atomic-Builtins.html
482 名前:デフォルトの名無しさん mailto:sage [2010/10/03(日) 11:49:42 ] 読む側が、変更されない変数読んでると思われて最適化されちゃうとか無いの? volatile付けなくても大丈夫?
483 名前:デフォルトの名無しさん mailto:sage [2010/10/03(日) 13:45:17 ] >>482 スレッド間で共有する変数はvolatileつけておくべきだよ。
484 名前:デフォルトの名無しさん mailto:sage [2010/10/03(日) 14:19:19 ] >>483 そんないいかげんな知識で大丈夫か?
485 名前:デフォルトの名無しさん [2010/10/03(日) 14:31:25 ] 馬鹿は黙れ。CPUの基本構造も知らずにプログラム組むとか笑えない。
486 名前:デフォルトの名無しさん mailto:sage [2010/10/03(日) 14:33:44 ] >>484 完璧な解説ヨロ
487 名前:デフォルトの名無しさん mailto:sage [2010/10/03(日) 14:50:17 ] ここ読んどけ d.hatena.ne.jp/bsdhouse/
488 名前:デフォルトの名無しさん mailto:sage [2010/10/03(日) 14:58:02 ] >>465 > とはいえ、組み込み向けのバス幅制限があるような環境では > マルチスレッドはともかく、 > マルチプロセッサ/マルチコアはまずありえないと考えて良いんじゃないかな。 組込み マルチコア でググレばわかるように、もはや組み込みでもマルチ コアはありえないと言える状況ではないよ。
489 名前:デフォルトの名無しさん mailto:sage [2010/10/03(日) 15:10:07 ] 8088やi386SXみたいな内部と外部でバス幅が違うような 石を使わざるを得ない(特殊な?)状況限定の話にそんなレスされても。
490 名前:デフォルトの名無しさん mailto:sage [2010/10/03(日) 16:00:49 ] 内部と外部でバス幅が違うなんて組み込みだと今時珍しくないが もしかしてそんなことも知らんのか?
491 名前:デフォルトの名無しさん mailto:sage [2010/10/03(日) 16:58:51 ] ハードの事わかって書いてるわけじゃないでしょ 最適化されたときのコードの矛盾とかをハードの問題みたいに思ってるのかも
492 名前:デフォルトの名無しさん [2010/10/03(日) 19:47:54 ] 【OS】 Linux,W2K 【言語】 C 【実行環境】Cygwin(W2Kの場合) 【その他特記する事項】 以下の行列演算は高速化できるのでしょうか。 スレッドの意味も作り方もわかりません。 for(j=0;j<16;j++){ for(i=0;i<16;i++){ d1[j]^=GF[e1[j][i]]; d2[j]^=GF[e2[j][i]]; } }
493 名前:デフォルトの名無しさん mailto:sage [2010/10/03(日) 20:23:30 ] >>492 それCでコンパイルできた?
494 名前:デフォルトの名無しさん mailto:sage [2010/10/03(日) 20:29:53 ] >>488 >>490 「バス幅が違うような環境でマルチコアなんかないだろ?」と >>465 には書かれているように見えるが おまえ、日本語は苦手か? 両方を満たしたものがめずらしくもないものなら そう反論しろよ。別個にではなく。
495 名前:デフォルトの名無しさん mailto:sage [2010/10/03(日) 20:30:43 ] >>492 またお前か
496 名前:494 mailto:sage [2010/10/03(日) 20:38:18 ] ちょっと書き方を変える。 >>488 「組み込みにマルチコアはありえない」などとは、どこにも書かれてない。 偉そうにしてるが、幻覚でも見たのか? >>490 「内部と外部でバス幅が違う環境などない」などとは、誰も言ってない。 偉そうにしてるが、電波でも受け取ったか? 「内部と外部でバス幅が違うような用途でも、マルチコアが採用されつつある」 と言いたいのなら、ちゃんとそう書け。
497 名前:デフォルトの名無しさん mailto:sage [2010/10/03(日) 22:28:11 ] > 「組み込みにマルチコアはありえない」などとは、どこにも書かれてない。 ⇒ 「マルチプロセッサ/マルチコアはまずありえない」と書いてますが? >「内部と外部でバス幅が違う環境などない」などとは、誰も言ってない。 誰もそんなことは言ってないし、誰もそれに反論なんてしてない。 むしろ、最近は珍しくないと書いてあるんだが。 偉そうにしてるが、一体誰と戦ってるんだ? (w
498 名前: ◆0uxK91AxII mailto:sage [2010/10/04(月) 23:01:18 ] >>484 大丈夫だ、問題無い。
499 名前:デフォルトの名無しさん mailto:sage [2010/10/05(火) 22:30:40 ] >>498 インテルは言っている、素直にインテル・スレッディング・ビルディングブロックを使えと
500 名前:デフォルトの名無しさん mailto:sage [2010/10/06(水) 01:31:55 ] インテルは言っている、インテルはいっている
501 名前:デフォルトの名無しさん mailto:sage [2010/10/06(水) 09:05:27 ] エルシャダイスレはここですか?
502 名前:デフォルトの名無しさん mailto:sage [2010/10/06(水) 19:27:08 ] だめええ!入れないでえええ!インテルいれちゃだめええええええええ!!あ?
503 名前:デフォルトの名無しさん mailto:sage [2010/10/06(水) 21:54:44 ] インテルは逝ってる
504 名前:デフォルトの名無しさん mailto:sage [2010/10/10(日) 11:00:31 ] スタベーションを回避する方法を教えてください。
505 名前:デフォルトの名無しさん mailto:sage [2010/10/12(火) 15:22:11 ] 待ち行列の先頭にいるスレッド以外は偶然入れても待ち行列の最後に並んで前の人が終わるまで待つとか
506 名前:デフォルトの名無しさん mailto:sage [2010/10/12(火) 20:17:24 ] >>504 A,B,Cというセマフォを取得するときどのスレッドもA,B,Cの順でセマフォを取得する。
507 名前:デフォルトの名無しさん [2010/10/13(水) 01:49:19 ] 【OS】WindowsXP 【言語】C++,Win32 【実行環境】VisualStudio2005 かなり基本的な質問です。 スレッドを外部から終了させたい場合、どのようにすればいいのでしょうか? あるスレッドを常に動かしていて、ユーザーがGUIプログラムを閉じた場合に、メインスレッド側からどのように命令すればいいのかわかりません。 ttp://msdn.microsoft.com/ja-jp/library/kdzttdcb%28VS.80%29.aspx ↑のようなページやググって調べると、スレッド関数側が自発的に_endthreadex関数などで終了する例はあるのですが、 終了するタイミングをスレッド関数側が知らない場合についてはあまり書かれていません。 よろしくお願いします。
508 名前:デフォルトの名無しさん mailto:sage [2010/10/13(水) 02:06:21 ] 終了するタイミングをスレッド関数側に教える仕組みがいくつかある
509 名前:デフォルトの名無しさん mailto:sage [2010/10/13(水) 06:37:16 ] >>507 何とかしてサブスレッドに終了を伝える方法を自分で実装する。特に関数はない。 Windowsならvolatile boolかCreateEvent+SetEventでいいだろう。
510 名前:デフォルトの名無しさん mailto:sage [2010/10/14(木) 04:23:26 ] いいか、お前らTerminateThreadは使うなよ!使うな!絶対に使うなよ!
511 名前:デフォルトの名無しさん mailto:sage [2010/10/14(木) 07:47:26 ] kill -KILLですね、わかります。
512 名前:デフォルトの名無しさん mailto:sage [2010/10/14(木) 22:51:22 ] TerminateThread = ハングしろ に近いからねぇ .Netとかだとそもそも抹消されてるが。Suspendも割と個人的に怖いな
513 名前:デフォルトの名無しさん mailto:sage [2010/10/14(木) 22:52:08 ] TerminateThreadに頼ったプログラムは死んでいいけど、 バグがあってサブスレッドが応答しなくなった時の万が一のためにTerminateThreadするのは いーんでないの
514 名前:デフォルトの名無しさん mailto:sage [2010/10/14(木) 23:08:49 ] つーかスレッドの終了待ちでWaitFor*Objectしてタイムアウトしたら TerminateThreadってのは普通だろ
515 名前:デフォルトの名無しさん mailto:sage [2010/10/14(木) 23:23:24 ] そりはバグなので速やかにアプリケーションを終了すべきでは? 少なくとも普通じゃない。
516 名前:デフォルトの名無しさん mailto:sage [2010/10/14(木) 23:43:40 ] >>510 別に使っても問題ないよ。 DllMainのデタッチスレッドさえちゃんと実装されていれば何も問題はない。
517 名前:デフォルトの名無しさん mailto:sage [2010/10/14(木) 23:58:39 ] Vistaより前がターゲットに入るなら「何も問題ない」は無いわ DllMainがどう頑張ろうと関係無い
518 名前:デフォルトの名無しさん mailto:sage [2010/10/15(金) 00:15:38 ] >>516 DllMainはコールバックされないってちゃんと書いてあるのにどういうコードを書くつもりなのか聞きたい
519 名前: ◆0uxK91AxII mailto:sage [2010/10/15(金) 04:13:54 ] TerminateThreadするくらいならExitProcessで止めを刺す。
520 名前:デフォルトの名無しさん mailto:sage [2010/10/15(金) 04:18:38 ] TerminateThreadなんて使う必要性あるの?
521 名前:デフォルトの名無しさん mailto:sage [2010/10/15(金) 06:53:29 ] サブスレッドの確保したメモリとかソケットとかDB接続とかその他もろもろのハンドル はどうするつもりだよ。 あとミューテックスをロックしたまま暴走した場合とか開放されるんだっけ? 問題ありすぎ
522 名前:デフォルトの名無しさん mailto:sage [2010/10/15(金) 23:13:04 ] >>514 ないない
523 名前:デフォルトの名無しさん mailto:sage [2010/10/15(金) 23:13:49 ] >>519 そのほうがごみが残らなくていいな
524 名前:デフォルトの名無しさん mailto:sega [2010/12/19(日) 17:17:41 ] printfはどういうレベルでスレッドセーフじゃないんでしょうか
525 名前:デフォルトの名無しさん mailto:sage [2010/12/19(日) 17:19:00 ] 間違えた、sprintfです
526 名前:デフォルトの名無しさん mailto:sage [2010/12/19(日) 17:22:56 ] 書込み先のことかな?
527 名前:デフォルトの名無しさん mailto:sage [2010/12/19(日) 17:24:15 ] 処理系によるんじゃないでしょうか
528 名前:デフォルトの名無しさん mailto:sage [2010/12/19(日) 17:30:04 ] MT-Safe ってどういう意味?
529 名前:デフォルトの名無しさん mailto:sage [2010/12/19(日) 17:30:49 ] 複数のスレッドで安全という意味
530 名前:デフォルトの名無しさん mailto:sage [2010/12/19(日) 17:32:51 ] >>527 POSIXというか、ぶっちゃけLinuxの標準ライブラリstdioでならどうでしょうか。 ここまで範囲限定したらスレチになんのかな?
531 名前:デフォルトの名無しさん mailto:sage [2010/12/19(日) 17:35:10 ] POSIXのstdioで _unlocked が付いてないものはスレッドセーフです
532 名前:デフォルトの名無しさん mailto:sage [2010/12/19(日) 19:46:28 ] つまりprintfはスレッドセーフってことか。ありがとう!
533 名前:デフォルトの名無しさん mailto:sage [2010/12/19(日) 21:15:28 ] 関数がってことで、使い方間違えると...
534 名前:デフォルトの名無しさん mailto:sage [2010/12/19(日) 23:13:56 ] まぁ想像するだけでもprintfは外部に出力するからロックとか色々してるのは分かる printfしたらバグが起こらなくなったとかで原因がスレッド絡みとかよくある んでprintfで起こらなくなるから放置とかマジ勘弁してくださいorz
535 名前:デフォルトの名無しさん mailto:sage [2010/12/24(金) 00:47:37 ] スレッドセーフなメモリの読み書きについて勉強しているのですが、情報が少なく捗りません。 メモリへの同時アクセスによるデータ破壊は、書き込み時にのみ起こると認識しているのですが、正しいでしょうか? ・二つのスレッドが一つの変数を書き換えるとき →データが破壊される場合がある。 ・一つのスレッドが一つの変数を書き換え、別のスレッドがその変数を読み込むとき →書き込みは問題なく行われる。 →読み込みは、書き換え途中のデータを読み込む場合がある。 ・二つのスレッドが一つの変数を読み込むとき →問題なし。
536 名前:デフォルトの名無しさん mailto:sage [2010/12/24(金) 01:06:26 ] 書き込まないものを読み込むことにどんな意味があるのだろうか
537 名前:デフォルトの名無しさん mailto:sage [2010/12/24(金) 01:10:53 ] const 定数ですね
538 名前:デフォルトの名無しさん mailto:sage [2010/12/24(金) 01:43:18 ] >>535 いずれも正しい。
539 名前:デフォルトの名無しさん mailto:sage [2010/12/24(金) 06:02:20 ] ありがとうございます。理解が深まりました。
540 名前:デフォルトの名無しさん mailto:sage [2010/12/24(金) 09:17:21 ] >>535 > ・二つのスレッドが一つの変数を書き換えるとき > →データが破壊される場合がある。 データの破壊とは何ぞや?単に後から書いたデータが残る。それだけの話。
541 名前:デフォルトの名無しさん mailto:sage [2010/12/24(金) 09:53:16 ] それぞれの書き込みがアトミックならね。 32ビットマシンで64ビットの書き込みとか、アトミックでない場合、破壊が起こるかもしれない。
542 名前:デフォルトの名無しさん mailto:sage [2010/12/24(金) 15:07:31 ] >>540 配列だって、立派な配列変数だぜ。 文字列型変数もあるしな。
543 名前:540 mailto:sage [2010/12/24(金) 15:52:35 ] そうだった、最近のデータはでかいんだな。 組み込み系のスレ見た後だったから頭がアセンブラレベルになってた。 失礼。 俺はどっちにしてもミューテックスかクリティカルセクションで排他しておくけど。
544 名前:デフォルトの名無しさん mailto:sage [2010/12/24(金) 17:17:54 ] 同時アクセス時の挙動なんてCPUの仕様次第だろ 同時読込なら安全なんて確証は無い
545 名前:デフォルトの名無しさん [2010/12/24(金) 17:20:04 ] データが小さければ読み書きのキャッシュ問題とか無視できるが、 今はふつうに扱う標準データが大きいからなあ。プログラミングも大変だ。
546 名前:デフォルトの名無しさん mailto:sage [2010/12/24(金) 17:20:27 ] アホ発見
547 名前:デフォルトの名無しさん mailto:sage [2010/12/24(金) 17:30:42 ] 同時読込なら安全なんて確証は無い・・・ ということは同じ関数を同時に実行するとまずい場合があるってことか 同じ関数を同時に実行すると同じ命令列を同時に読込むことになるもんな
548 名前:デフォルトの名無しさん mailto:sage [2010/12/25(土) 20:23:56 ] 言語仕様じゃなくハードウェア仕様だと理解してればいい 大丈夫かどうかを言語仕様で調べても守備範囲外のことで規定されてないから無駄
549 名前:デフォルトの名無しさん mailto:sage [2010/12/25(土) 20:28:39 ] いや失礼、言語仕様で規定されてる物もあるか
550 名前:デフォルトの名無しさん [2010/12/26(日) 16:17:56 ] printfがスレッドセーフじゃないのはわかるけど どうしてsprintfがスレッドセーフではないのはなぜ?
551 名前:デフォルトの名無しさん mailto:sage [2010/12/26(日) 16:24:32 ] >>550 内部にスタテックバッファーを持ってるかも。
552 名前:デフォルトの名無しさん mailto:sage [2010/12/26(日) 16:54:42 ] >>551 まじか・・・だらしのないやつだなsprintfも・・・
553 名前:デフォルトの名無しさん mailto:sage [2010/12/26(日) 17:45:40 ] おまえが使ってるライブラリを実装したところに聞けよ
554 名前:デフォルトの名無しさん mailto:sage [2010/12/26(日) 18:09:36 ] sprintfがスレッドアンセーフってのはどこ情報?
555 名前:デフォルトの名無しさん mailto:sage [2010/12/26(日) 19:50:50 ] あとだしで申し訳ないがライブラリはglibcです >>554 ttp://slashcolon.com/wordpress/2007/12/25/ ttp://www.kmonos.net/alang/d/2.0/ctod.html#printf Dでスレッドセーフにしました=Cだとスレッドセーフちがう と解釈しました ていうか、そもそもprintfがスレッドセーフだという情報がない。 不明なうちはアンセーフ扱いするのが俺のジャスティス
556 名前:デフォルトの名無しさん mailto:sage [2010/12/26(日) 20:00:44 ] なるほど 確かに
557 名前:デフォルトの名無しさん mailto:sage [2010/12/26(日) 20:13:26 ] それ英語版見たらスレッドセーフなんてどこにも書いてないぞ・・・ > writefln() improves on printf() by being type-aware and type-safe: 誤訳じゃないのか
558 名前:デフォルトの名無しさん mailto:sage [2010/12/26(日) 20:16:54 ] ttp://stackoverflow.com/questions/467938/stdout-thread-safe-in-c-on-linux 適当にぐぐったけどglibcはスレッドセーフとか書いてるような感じ
559 名前:デフォルトの名無しさん [2010/12/27(月) 11:09:50 ] へえ
560 名前:デフォルトの名無しさん mailto:sage [2010/12/27(月) 14:34:33 ] 探しても「セーフだろう」「たぶんセーフ」ばっかりしか出てこない むずむずするなぁ
561 名前:デフォルトの名無しさん mailto:sage [2010/12/27(月) 15:03:50 ] IEEE Std 1003.1-2001の定義では、例外的にアンセーフで良いとされているもの以外は スレッドセーフ。 pubs.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_09.html
562 名前:デフォルトの名無しさん mailto:sage [2010/12/28(火) 19:19:26 ] 過去スレ全部はみれなかったんだけど、マルチスレッド関連の良書をまとめてみる。 この他にこれがいいとかあったり、これ駄目とかあったら教えて。 [一般] 並行コンピューティング技法 ―実践マルチコア/マルチスレッドプログラミング The Art of Multiprocessor Programming 並行プログラミングの原理から実践まで 増補改訂版 Java言語で学ぶデザインパターン入門 マルチスレッド編 [java] Javaスレッドプログラミング―並列オブジェクト指向プログラミングの設計原理 (OO SELECTION) Concurrency: State Models and Java Programs 2edition Java並行処理プログラミング ―その「基盤」と「最新API」を究める [windows] Win32 マルチスレッド プログラミング Advanced Windows 第5版 上 Advanced Windows 第5版 下 [Unix] POSIXスレッドプログラミング
563 名前:デフォルトの名無しさん mailto:sage [2010/12/31(金) 19:52:51 ] [C++] インテルスレッディング・ビルディング・ブロック 主にこのライブラリの使い方だが、 他にもスレッド管理の考え方が載ってる。まぁオープンソースなので見れるのだけど
564 名前:デフォルトの名無しさん mailto:sage [2011/01/03(月) 21:56:27 ] ありがとうございます。C++の良書をあまり知らないので助かります。
565 名前:デフォルトの名無しさん mailto:sage [2011/01/15(土) 09:14:58 ] concurrent hashmapのC++実装って なんでないの?
566 名前:デフォルトの名無しさん mailto:sage [2011/01/15(土) 09:49:16 ] >>565 キミのためにお取り置きしてある。
567 名前:デフォルトの名無しさん mailto:sage [2011/01/15(土) 10:31:02 ] >>566 並列mapでいいから実装ないの? C++って並列コンテナないから何もできないよね
568 名前:デフォルトの名無しさん mailto:sage [2011/01/15(土) 18:21:33 ] >>567 キミが作るだろうと思って残しておいた。
569 名前:デフォルトの名無しさん mailto:sage [2011/01/16(日) 11:14:37 ] >>567 俺のところにはある。
570 名前:デフォルトの名無しさん mailto:sage [2011/01/16(日) 11:28:44 ] C/C++はアセンブラと高級言語の間みたいな位置だからな 言語そのものを作るとか、OSを作るとか、リソースの厳しい組み込み系で作るとか、 そういう用途じゃないなら別に強力な言語ではない ネイティブのCPUの挙動を理解しないとC/C++の有用性は半減すると思われ
571 名前:デフォルトの名無しさん mailto:sage [2011/01/25(火) 23:02:03 ] すみません、spin-lockをしている間にCPUの使用率を下げる方法を知っている方はいますか? 調べてみると、rep;nop命令やSSEのpause命令をがそれに該当するように思えるのですが、 使ってみても何ら変わりませんでした。 スピンロックつかっわないとは思うんだけど。 自作のスレッドバリア関数(自作のspin_lock)を作って、 たとえば、 if(threadnum=5) sleep(10); my_barirrer(); とするとスレッド5を待っている間は5以外のCPU使用率が100%近くなってしまいます。 それに対してOpenMP使った場合では、 if(threadnum=5) sleep(10); #paragma omp barirrer だと待っている間はCPU使用率は殆ど変わりません。 ちなみに自作のspinlockは下記のような感じです。 if(thread_num == 0) { asm volatile( "Loop1:\n\t\t" "movl (%0), %%eax\n\t\t" "movl (%1), %%ebx\n\t\t" "lfence\n\t\t" "cmpl %%ebx, %%eax\n\t\t" "rep;nop\n\t\t" "jne Loop1\n\t\t" : :"r"(&lock->sync), "r"(&lock->maxthreads) :"memory","%eax","%ebx" ); というか、これって間抜けですかね?
572 名前:デフォルトの名無しさん mailto:sage [2011/01/25(火) 23:10:46 ] 自前でタスク切換えみたいなことするしか
573 名前:デフォルトの名無しさん mailto:sage [2011/01/25(火) 23:15:42 ] >>571 >>369
574 名前:デフォルトの名無しさん mailto:sage [2011/01/25(火) 23:24:51 ] >>573 お前友達いないだろ
575 名前:デフォルトの名無しさん mailto:sage [2011/01/25(火) 23:34:47 ] >>571 Sleepさせりゃいいんじゃね。
576 名前:デフォルトの名無しさん mailto:sage [2011/01/25(火) 23:44:45 ] 割り込みでしか切り替わらないコードで使用率下げたいというのが
577 名前:デフォルトの名無しさん mailto:sage [2011/01/28(金) 22:22:30 ] さむいな(´・ω・`)
578 名前:デフォルトの名無しさん mailto:sage [2011/01/28(金) 22:43:23 ] 寒稲
579 名前:デフォルトの名無しさん mailto:sage [2011/01/31(月) 22:10:29 ] >>571 CPU使用率が100%じゃないロックなんて、スピンロックとは認めない。
580 名前:デフォルトの名無しさん mailto:sage [2011/02/01(火) 00:53:40 ] そもそも100%じゃないってことはコンテキストスイッチしてるってことになるでしょ? 何のためのスピンロックなのよあり得ない。
581 名前:デフォルトの名無しさん mailto:sage [2011/02/01(火) 10:50:42 ] スリープロックのループもスピン扱いすることもあるから何とも
582 名前:デフォルトの名無しさん mailto:sage [2011/04/04(月) 19:37:25.20 ] ちょっと聞いていい? 以下のコードでnotifyAllされたらどうなるのって質問 void A() synchronized(Lock){ if(List.size() == 0){ try{ Lock.wait(); }(Exception e){} } //以下処理続く } } このコードで複数のスレッドが待ち状態だったらnotifyAllとき再度Lockを取りに行ってくれるの? もし、そうだったとしたら。 結局はnotifyで1つのスレッドのみ動かすってのと同じことになるの? それとも再起処理的に以下のようにしなきゃだめ? void A() synchronized(Lock){ if(List.size() == 0){ try{ Lock.wait(); }(Exception e){} A(); ←ここでさらに再帰的に同じメソッドを呼び出す } //以下処理続く } } おしえてエロイひと。。。
583 名前:デフォルトの名無しさん mailto:sage [2011/04/04(月) 19:47:38.94 ] >>582 notifyAll を呼ぶと、wait してたスレッドはすべて起きて、 Lock を取りに行く どうせみんなすぐには取れないから Lock 待ち状態になるが、すでに wait からは外れてるので、 Lock を取れた順にすべてのスレッドが動き出す notify の場合は、wait してたスレッドのうちひとつだけが起きて Lock を取りに行く 他のスレッドは、その後 Lock が空いても、眠ったまま起きない wait はふつう再帰じゃなくて while にする synchronized (Lock) { while (List.size() == 0) { Lock.wait(); } } waitは、notifyされてなくても間違って起きることがあるらしいので、このように書くべきこととされている
584 名前:デフォルトの名無しさん mailto:sage [2011/04/04(月) 20:17:38.60 ] >notifyAll を呼ぶと、wait してたスレッドはすべて起きて、 Lock を取りに行く ということはnotifyAllでそのまま下に処理が流れていくんじゃなくて 再度 synchronized(Lock){ ←この部分に処理が戻ってくるイメージなんですかね? 別のメソッド内の以下のようなコードでnotifyAllをかけようと思ってたんだけど、 ちゃんとnumの個数分以上のスレッドは再度、wait状態に入ってくれるのか心配でした for(int i = 0 ; i < num ; i++){ List.add(object); } Lock.notifyAll(); それと。 while (List.size() == 0) { Lock.wait(); } これしなきゃいけないんですね。Javadoc見てきました。 >>583 ありがとー。
585 名前:デフォルトの名無しさん mailto:sage [2011/04/04(月) 21:55:04.24 ] >>584 synchronized のところまで戻るわけじゃなく、synchronized の中にいるまま、 wait のところで、 Lock をいったん解放、おやすみなサイして、起きたら元通りに取りにいく wait は synchronized の中でありながら Lock を手放している特殊な場所 notifyAll を呼んだ側のスレッドは、notifyAll を呼んだあとそのまま下に流れていく というのも、notifyAll を呼んだ時点では Lock は notifyAll 側のスレッドが握ってるので (synchronized 中のはず)、 wait 側のスレッドは起きるけれども、Lock を取れない notifyAll 側が synchronized から抜けるなりして Lock を解放すると、wait 側が Lock を取って動き出せるようになる
586 名前:デフォルトの名無しさん mailto:sage [2011/05/25(水) 01:36:55.92 ] 質問です CreateThreadで複数のスレッドを作ったときに渡したパラメータは スレッドごとに別々のものを渡してもいずれ同じものに書き換えられてしまうと思うんですけど これをスレッドごとに別々のままにしてやるにはどうしたらいいのでしょうか VCなら__declspec(thread)をつけるとTLSが使えると読んだのですが これをCreateThreadに渡すThreadProcのどこで使えばいいのかわかりません
587 名前:デフォルトの名無しさん mailto:sage [2011/05/25(水) 03:14:14.44 ] >いずれ同じものに書き換えられてしまう そういうことをやってるだけでしょ
588 名前:デフォルトの名無しさん mailto:sage [2011/05/25(水) 08:33:13.11 ] >>586 お前がやってんのは int a; int* b = &a; int* c = &a; int* d = &a; のb,c,dが別々のものと言ってるのと同じだろ
589 名前:デフォルトの名無しさん mailto:sage [2011/05/25(水) 08:38:22.51 ] あーなるほど、同じ場所(=ポイント先)を渡して「別々のもの」と言い張っているのか。
590 名前:デフォルトの名無しさん mailto:sage [2011/05/25(水) 11:41:30.98 ] forkってスレッドセーフ?
591 名前:デフォルトの名無しさん mailto:sage [2011/05/25(水) 11:56:15.17 ] >>590 関数だけ見ればMT-safe pubs.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_09.html でも d.hatena.ne.jp/yupo5656/20040715
592 名前:デフォルトの名無しさん mailto:sage [2011/05/25(水) 21:24:18.36 ] 別のポインタ渡したつもりで同じものを渡していたことに気づいて悲しくなりました お手数おかけしました
593 名前:デフォルトの名無しさん [2011/06/23(木) 08:39:51.24 ] スレッドって、毎秒ごとに数百回の開始と終了を繰り返すような使い方は正しいの? それとも、必要な時だけスレを立てる使い方じゃなくて、 スレは基本的に立てっぱにしといて、用がある時にメッセージ等を送るという使い方をすべき?
594 名前:デフォルトの名無しさん mailto:sage [2011/06/23(木) 08:45:48.47 ] スレッドの開始はそれなりにコストの大きい処理だから スレッドプールにするのが正解
595 名前:デフォルトの名無しさん mailto:sage [2011/06/23(木) 08:49:17.54 ] なるほど。直観的じゃないのな。
596 名前:デフォルトの名無しさん mailto:sage [2011/06/23(木) 09:10:49.87 ] 用途によるよ。一度スレッドを起動したら数十秒は戻ってこないならプールしなくても大差ない。
597 名前:デフォルトの名無しさん mailto:sage [2011/06/23(木) 09:47:04.06 ] 593の前提と変わってるじゃんか
598 名前:デフォルトの名無しさん mailto:sage [2011/06/23(木) 22:41:08.11 ] >>593 同時に起動できるスレッドの数ってそんなに多くないしな。 32bit、Windowsだと2000個くらい(スタックサイズ標準の場合)
599 名前:デフォルトの名無しさん mailto:sage [2011/06/24(金) 00:22:34.83 ] スレッドの生成は5ミリ秒くらいのオーバーヘッドあるだろ。 数百回やるなんて頭おかしい >>598 今時32ビット縛りなんて考える必要なくね?
600 名前:デフォルトの名無しさん mailto:sage [2011/06/24(金) 05:23:53.79 ] 5msec!
601 名前:デフォルトの名無しさん mailto:sage [2011/06/24(金) 10:49:09.11 ] なにそのみずほ銀行
602 名前:デフォルトの名無しさん mailto:sage [2011/06/24(金) 10:53:32.07 ] ミリ秒はつらいな・・・ と思ったけど16ビット機なら仕方ないか。
603 名前: ◆0uxK91AxII mailto:sage [2011/06/24(金) 17:27:33.68 ] 手元の環境だと、threadの生成と実行開始のどちらも0.1[ms]すら掛からないね:)
604 名前:デフォルトの名無しさん mailto:sage [2011/06/25(土) 01:58:06.76 ] XPからスレッド生成が凄く速くなった記憶がある
605 名前:デフォルトの名無しさん mailto:sage [2011/06/25(土) 17:22:00.98 ] じゃあ0.1msでスレッド生成するコード晒してみろよ
606 名前: ◆0uxK91AxII mailto:sage [2011/06/25(土) 18:39:30.70 ] Win32のCRTにある_beginthread。 生成は0.1[ms]未満、実行開始はコンパイラかライブラリに依存で0.1[ms]台からに訂正。 #include <Windows.h> #include <stdio.h> #include <process.h> struct perf {LARGE_INTEGER freq;LARGE_INTEGER t0;};void __cdecl thread(void * pArg){perf *pperf;LARGE_INTEGER t1, d;QueryPerformanceCounter(&t1);pperf = (perf *)pArg;printf("thread: %I64d\n",t1.QuadPart-pperf->t0.QuadPart);}int main(){ LARGE_INTEGER f={0}, t0, t1, d;perf perf;QueryPerformanceFrequency(&f);printf( "freq: %I64d\n", f.QuadPart);perf.freq = f;QueryPerformanceCounter(&t0);perf.t0 = t0;_beginthread(thread, 0, &perf);QueryPerformanceCounter(&t1);printf( "main: %I64d\n", t1.QuadPart-t0.QuadPart);Sleep(1000);return 0;}
607 名前:デフォルトの名無しさん mailto:sage [2011/06/25(土) 22:55:22.93 ] >>606 5764ticks/272758=2.1ms。 一桁違ってないか?どんだけ速いマシン使ってんの
608 名前:607 mailto:sage [2011/06/25(土) 23:17:06.14 ] 訂正。 誤:5764ticks/272758=2.1ms 正:5764ticks/2727568=2.1ms 処理のスループットが問題なんだからJOINの時間も入れよーぜ。 あと、>>606 はmainが先に終わると不正メモリアクセスになる糞コード
609 名前:デフォルトの名無しさん mailto:sage [2011/06/26(日) 01:54:34.21 ] C#だけど2マイクロ秒くらいだよ。 var sw = new System.Diagnostics.Stopwatch(); sw.Start(); for (var i = 0; i < 1000; i++) {new Thread(F);} decimal time = (decimal)sw.ElapsedTicks / System.Diagnostics.Stopwatch.Frequency; Console.WriteLine("{0} [ms]", time / 1000 * 1000);
610 名前:デフォルトの名無しさん mailto:sage [2011/06/26(日) 02:04:01.25 ] ∩_ 〈〈〈 ヽ 〈⊃ } ∩___∩ | | | ノ ヽ ! ! / ● ● | / | ( _●_) ミ/ こいつ最高にアホ 彡、 |∪| / / __ ヽノ / (___) /
611 名前: ◆0uxK91AxII mailto:sage [2011/06/26(日) 10:35:46.17 ] >>607 >>608 Core i7 2600K 3.4[GHz] HTT無効, Windows 7 X64 SP1, Visual C++ 2010 Express >mainが先に終わると不正メモリアクセスになる糞コード 大丈夫だ、問題ない。 >>609 thread poolだから略。
612 名前:デフォルトの名無しさん mailto:sage [2011/06/26(日) 15:21:14.56 ] >mainが先に終わると不正メモリアクセスになる糞コード こういうことを平気で書いちゃう人もいるんだな。笑える。
613 名前:デフォルトの名無しさん mailto:sage [2011/06/26(日) 15:23:47.45 ] 具体的に反論できない奴のテンプレート的反応で笑える。
614 名前:デフォルトの名無しさん mailto:sage [2011/06/26(日) 20:09:29.64 ] >>611 Xeon E5506 2.13GHzだが0.46msだった。0.1msには及ばない。 >thread poolだから略。 Threadはスレッドプーリングされない。単にStartし忘れているだけ
615 名前:デフォルトの名無しさん mailto:sage [2011/06/26(日) 22:10:05.48 ] node.jsの説明見ているとシングルスレッドなので万歳!みたいな記事が多く混乱してみる
616 名前:デフォルトの名無しさん mailto:sage [2011/06/26(日) 23:27:19.63 ] あれは 『マルチスレッドやマルチプロセスではC10Kに対応できなくね? 俺良い事思い付いた。シングルスレッドでイベントドリブンにしたら良いんじゃね。』 という発想だから、 『あー、でもマルチコアマシンではシングルスレッドだと性能出なくね? 結局ロードバランサとか必須だわな。』 みたいな話をすると、そもそも何でマルチスレッドを否定していたのかという 自己矛盾に陥るので、わざとスルーしているのかもね。ちょっと分かり辛いよね。
617 名前:デフォルトの名無しさん mailto:sage [2011/06/26(日) 23:49:28.20 ] C10Kが騒がれてたのはもう10年くらい前の話で、 その頃は1CPUでシングルコアのマシンが殆どだったしね
618 名前: 58-3-155-112.ppp.bbiq.jp mailto:sage [2011/06/27(月) 07:39:41.06 ] リクエスト来る事にスレッド作成してた今までが異常すぎ C10K問題で破綻するのは今でも一緒ですわい
619 名前: ◆0uxK91AxII mailto:sage [2011/06/27(月) 09:16:36.96 ] >>614 >Threadはスレッドプーリングされない。単にStartし忘れているだけ ouch C#、試してみたら遅すぎた。 Cの4~20倍くらい掛かっている。
620 名前:デフォルトの名無しさん mailto:sage [2011/06/27(月) 19:42:02.22 ] >遅すぎた 0.1msの20倍は2msだろ。 50スレッド生成しても0.1秒、全く問題ないような
621 名前:デフォルトの名無しさん mailto:sage [2011/06/27(月) 20:02:07.59 ] Unix屋なんでWindowsは全く詳しくないけど スレッド数をむやみやたらを増やしてもオーバーヘッドが多くなるだけでいいことなんてないのでは? それよりスレッドプールを使った方が管理も簡単だと思うんだけど、Winの開発環境にはもしかしたら スレッドプールライブラリーみたいなのがなくて自分で仕組みを作らなきゃ駄目なのかい
622 名前:デフォルトの名無しさん mailto:sage [2011/06/27(月) 20:04:40.67 ] スレッドは設計?をよう考えないとハマるだろうに
623 名前:デフォルトの名無しさん mailto:sage [2011/06/27(月) 21:44:24.18 ] >>621 UNIXでよく使われるものはWindowsにもある と考えてまず間違いない
624 名前:デフォルトの名無しさん mailto:sage [2011/06/27(月) 23:29:57.24 ] スレッドのメリットはスループット性能だけではないのだが。
625 名前:デフォルトの名無しさん mailto:sage [2011/06/28(火) 10:33:59.70 ] メモリ空間が共通なのはデメリットだよね?
626 名前:デフォルトの名無しさん mailto:sage [2011/06/28(火) 11:04:08.15 ] 共通じゃないのが欲しければfork→execでいいんじゃね。
627 名前:デフォルトの名無しさん mailto:sage [2011/06/28(火) 20:31:14.09 ] メモリ空間共通のデメリットって、Cでメモリ破壊の危険性を排除できない ぐらいしか思いつかないんだが。
628 名前:デフォルトの名無しさん mailto:sage [2011/06/28(火) 20:40:04.57 ] ・メモリ共有だと、プロセスが落ちたら皆落ちる ・NUMAではメモリ上のデータは分散していた方が良いよね? ・別プロセスなら別ノードにも移せるので自由度が高い ・セキュリティ(他の実行単位からデータが見えない) 等々
629 名前:デフォルトの名無しさん mailto:sage [2011/06/28(火) 20:43:17.24 ] 仕事で4Gの空間じゃ足りないってことがあった 64bitならしらねw
630 名前:デフォルトの名無しさん mailto:sage [2011/06/28(火) 20:55:56.81 ] NUMAは違うだろ どこから割り当てるかは別にプロセス分けなくてもできる
631 名前:デフォルトの名無しさん mailto:sage [2011/06/28(火) 21:36:49.16 ] メモリ空間が共通なのはメリットだろう常考
632 名前:デフォルトの名無しさん mailto:sage [2011/06/29(水) 10:48:43.16 ] プログラムは常に死ぬ可能性がある という前提に立つと、 メモリ空間の共有はデメリットだよな
633 名前:デフォルトの名無しさん mailto:sage [2011/06/29(水) 11:36:26.30 ] メリットもデメリットもある
634 名前:デフォルトの名無しさん mailto:sage [2011/06/29(水) 11:51:59.86 ] >>632 >プログラムは常に死ぬ可能性がある という前提に立つと、 なんという時代遅れのやつ
635 名前:デフォルトの名無しさん mailto:sage [2011/06/29(水) 12:05:00.86 ] スレッド蹴るかプロセス上げるかは、利用場面での損得勘定で決まることだから、 状況想定もなしにメリットデメリットを語ってもナンセンスすぎてなあ…
636 名前:デフォルトの名無しさん mailto:sage [2011/06/29(水) 12:54:18.84 ] >>635 マルチスレッドで得られるメリットは基本的にパフォーマンスのみ。 マルチプロセスで得られるメリットはマルチスレッドで実現不能なことがほとんど。
637 名前:デフォルトの名無しさん mailto:sage [2011/06/29(水) 16:52:22.47 ] ある特徴が長所なのか短所なのかは目的次第(この話に限らない一般論) パフォーマンスいらないならマルチスレッドなんてしないだろ
638 名前:デフォルトの名無しさん mailto:sage [2011/07/23(土) 20:17:54.60 ] 処理中にUIが固まらないようにするためのマルチスレッドは よく使用されるが、それをパフォーマンス目的とは言わないだろう
639 名前:デフォルトの名無しさん mailto:sage [2011/08/02(火) 16:21:14.65 ] パフォーマンスだけがメリットだとしても、パフォーマンスのメリットは計り知れない からな クラしか見てない奴はパフォーマンス需要は頭打ちと思ってるかもしれんが、鯖は逆に クラウド化でクラの負担も全部引き受ける路線だから、パフォーマンスが非常に厳しく 求められるようになってる訳だし、鯖向けソフトウェアはパフォーマンス一つでシェア が取れる例も全く珍しくないしな
640 名前:デフォルトの名無しさん mailto:sage [2011/08/02(火) 16:23:33.58 ] ×クラウド化で ○クラウド化とか含めて
641 名前:デフォルトの名無しさん mailto:sage [2011/08/14(日) 09:56:51.34 ] >>638 例が適切ではアリマセンネー UIを固めない = 操作者を待たせない = 操作者も含めたシステム全体のパフォーマンス向上、 という図式が成立するとも言う パフォーマンス向上以外のマルチスレッド利用としては、 非同期事象を取りこぼさずに受けるため、というのが挙げられると思うが、 それとて取りこぼさずに済むためのハードウェアの速度要件もしくはCPU時間消費の低減につながるため 結果的にパフォーマンス向上と言えなくもないという、
642 名前:デフォルトの名無しさん mailto:sage [2011/08/14(日) 12:36:09.51 ] msdn.microsoft.com/library/cc464185.aspx これでおk
643 名前:デフォルトの名無しさん mailto:sage [2011/08/14(日) 13:42:20.18 ] >>641 副次的な効果を目的に持ってこないほうがいい。 UIを固めないと中断が実現できたり、操作者のわかりやすさに繋がるんだよ。 それはパフォーマンス向上ではなく、別のことが目的だろう。
644 名前:デフォルトの名無しさん [2011/08/14(日) 13:58:19.75 ] >>643 例えばIDEがエディタを固まらせないでバックグラウンドでソースを解析するのは >操作者も含めたシステム全体のパフォーマンス向上、 になるんじゃないの?
645 名前:デフォルトの名無しさん mailto:sage [2011/08/15(月) 02:52:00.24 ] >>644 よく読めよ。 >>638 が噛みついたのは「処理スレッドをUIと別にするのがパフォーマンス目的か?」 じゃなくて、 「マルチスレッドは必ずパフォーマンスが目的と言えるのか?」だろ。んなこたーない
646 名前:デフォルトの名無しさん mailto:sage [2011/08/17(水) 12:42:20.68 ] >UIを固めないと中断が実現できたり、操作者のわかりやすさに繋がるんだよ。 これをパフォーマンス向上と言ってもおかしくない dic.yahoo.co.jp/dsearch?p=performance&dtype=1
647 名前:デフォルトの名無しさん mailto:sage [2011/08/17(水) 18:54:09.83 ] >>646 どこを読めば良いのでしょうか
648 名前:デフォルトの名無しさん mailto:sage [2011/08/17(水) 19:21:06.24 ] うーん・・ ことプログラミングの文脈に関する限りはユーザーリスポンシビリティやユーザーエクスペリエンス はパフォーマンスの一部と解釈することはあまり無いんじゃないかな?
649 名前:デフォルトの名無しさん mailto:sage [2011/08/17(水) 20:51:02.93 ] >>646 おかしい
650 名前:デフォルトの名無しさん mailto:sage [2011/08/21(日) 09:04:32.75 ] 「パフォーマンスの向上」が何を意味するのか、が決まらないと無意味な議論だな その点に限れば、主観以外の論拠が出てこない(実際出てない)から、終着点なんか 無いぞ 元々MTのメリットという話題だったが、技術的に何の参考にもならん話だしどうでも いいんだが
651 名前: ◆0uxK91AxII mailto:sage [2011/08/21(日) 11:45:37.53 ] 意味を定義しても無駄な議論だけどね:b
652 名前:デフォルトの名無しさん [2011/09/09(金) 19:42:55.52 ] C#のマルチスレッドのプログラミングです。 変数がいくつかある。例えばこんな感じ。 int A; int B; ・ ・ int Z; で、スレッド@で定期的にA〜Zの変数の値を更新している。 スレッドAからこれら変数を読みたいのだが、必ずA〜Zまで全部更新された状態で読みたい。 (つまりスレ@が更新処理中に読みに行くのはアウトってこと。) 優先度が高いのはスレ@です。 どうやれば“スマート”なんでしょう? 変数を更新している間スレ@以外の実行を止めるような仕掛けがあるんじゃないかと思って探したんだけど無さそうだね。
653 名前:デフォルトの名無しさん mailto:sage [2011/09/09(金) 19:50:28.24 ] ttp://ufcpp.net/study/csharp/sp_thread.html
654 名前:デフォルトの名無しさん [2011/09/09(金) 20:10:35.64 ] >>653 それ、なんかちゃうで。
655 名前:デフォルトの名無しさん mailto:sage [2011/09/09(金) 21:29:06.03 ] >>652 途中で読まれてはいけない更新の開始から最後までロックする。 ロックが長時間にわたる可能性がある場合はSystem.Threading.Mutex.WaitOneで タイムアウトさせる。
656 名前:デフォルトの名無しさん mailto:sage [2011/09/09(金) 21:57:27.33 ] 1以外は読むだけなんだろ? そりゃ System.Threading.ReaderWriterLock だろ
657 名前:デフォルトの名無しさん [2011/09/12(月) 00:26:16.03 ] 中途半端な状態で読むのがアウトってだけだったら、一つのクラスにA〜Zの変数をまとめておいて 更新時には丸ごと新しいインスタンスに差し替えてしまえばロックいらないよ
658 名前:デフォルトの名無しさん mailto:sage [2011/09/13(火) 18:08:55.63 ] RCUのめんどいところは古い情報をいつ削除するか
659 名前:デフォルトの名無しさん mailto:sage [2011/09/14(水) 18:37:15.35 ] C#での話だからGC任せでok あと、インスタンスへの参照を保持する変数にはvolatileを付けとけよ。
660 名前:デフォルトの名無しさん mailto:sage [2011/09/14(水) 21:28:32.04 ] この使い方だと実はつけなくても大丈夫だけどな。 つけとく方がいいけど。
661 名前:デフォルトの名無しさん mailto:sage [2011/09/14(水) 22:13:31.15 ] クライアントが古い方への参照を持ち続けていてはまると予想。
662 名前:デフォルトの名無しさん mailto:sage [2011/09/15(木) 00:00:30.87 ] >661 の他にも、「新インスタンス上の変数AZへの書き込み」と 「共有変数を新インスタンスへの参照で更新」がリオーダーされないようにする必要がある。
663 名前:デフォルトの名無しさん mailto:sage [2011/09/15(木) 00:24:43.65 ] .NET Framework 2.0以降(CLR2.0以降)のメモリモデルでは、 書き込み順をリオーダできないというルールがあるため、それは起こらない。
664 名前:デフォルトの名無しさん mailto:sage [2011/09/15(木) 02:03:26.35 ] >>663 一般の変数に関しては、そんな規定は仕様書の何処にもない。
665 名前:デフォルトの名無しさん mailto:sage [2011/09/15(木) 02:49:09.91 ] は?
666 名前:デフォルトの名無しさん mailto:sage [2011/09/15(木) 08:20:18.11 ] コンパイラが順序通りに書き込んでもCPUがそのように 振る舞うわけねーだろ
667 名前:デフォルトの名無しさん mailto:sage [2011/09/15(木) 08:23:43.17 ] メモリモデルの意味も分かってない馬鹿ばかり。
668 名前:デフォルトの名無しさん mailto:sage [2011/09/15(木) 08:45:27.59 ] >>666 お前はMSの文書ちゃんと読めよ
669 名前:デフォルトの名無しさん mailto:sage [2011/09/15(木) 09:34:15.77 ] ちなみに読み込みは順序換えが許されている。 一般的には読み込み順序の問題でvolatileが必要になるんだが、 今回のような処理では、参照変数より先に参照先を読むことが不可能なため、 volatileがなくても実は問題が発生しない。 もちろん読み込みの挿入が許可されてないってのも重要なんだが。 まあ普通はvolatileつけるでOK。
670 名前:デフォルトの名無しさん mailto:sage [2011/09/15(木) 10:44:40.93 ] >>669 いや、だから読み書きともに順序替えが許されてるんだってば
671 名前:デフォルトの名無しさん mailto:sage [2011/09/15(木) 11:08:07.18 ] >>669 つけなくて大丈夫ってことは無いよ なにか別のパターンと勘違いしてないか?
672 名前:デフォルトの名無しさん mailto:sage [2011/09/15(木) 11:27:46.91 ] つけなきゃだめってのは、何を見て言ってるの? CLR2.0のメモリモデルでは書き込み順序換えは許可されてない、 かつ読み込みを複数回に分ける事も許可されてない、 したがって今回のような処理では実質的にvolatileは不要。 このことはMSDNマガジンにも書かれてる内容。
673 名前:デフォルトの名無しさん mailto:sage [2011/09/15(木) 11:28:52.30 ] >>670 書き込み順序換えは出来ないとはっきり書かれてる。
674 名前:デフォルトの名無しさん mailto:sage [2011/09/15(木) 11:59:15.21 ] >>673 どこに? CLIの仕様書にはどこにもそんなことは書かれてないが。
675 名前:デフォルトの名無しさん mailto:sage [2011/09/15(木) 12:01:40.73 ] >>672 それはあんたがMSDNの記事を誤読してるだけだろ。
676 名前:デフォルトの名無しさん mailto:sage [2011/09/15(木) 12:08:07.35 ] >>674 だから最初からCLR2のメモリモデルではと言っとろうに
677 名前:デフォルトの名無しさん mailto:sage [2011/09/15(木) 12:13:29.95 ] >>675 どこを誤読してるのか明確に指摘してくれ。 ttp://msdn.microsoft.com/ja-jp/magazine/ee532386.aspx 正確には全く同じ話ではないが、結論は同じことになる話が出てる。 まあMSDNマガジンの例の方がより無茶な話も出てるけど。
678 名前:デフォルトの名無しさん mailto:sage [2011/09/15(木) 12:18:55.76 ] C# よく分かんないけど、変数をまとめたクラス class Vars { int a, b, c, ...; static Vars instance; } があって、更新側 Vars v = new Vars(); v.a = aaa; // 1 v.b = bbb; // 2 v.c = ccc; // 3 ... Vars.instance = v; // 4 これで 1 〜 3 の順番が入れ替わるのは許せるけど、 1 〜 3 と 4 の順番が入れ替わるのってありなの? まじ???
679 名前:678 mailto:sage [2011/09/15(木) 12:21:02.84 ] 続き。volatile の必要性については、参照側 int prevA = 0; while (true) { Vars v = Vars.instance; if (v.a != prevA) { doSomething(v); prevA = v.a; } } とすると、参照側の Vars.instance のアクセスがキャッシュされるから、 Vars.instance は volatile じゃないと駄目ってことでしょ。 Vars.instance を直接アクセスせずに getter を介してれば volatile は不要、かな?
680 名前:デフォルトの名無しさん mailto:sage [2011/09/15(木) 12:32:34.08 ] >>679 不要。 読み取りを削除出来るのは、同一ロケーションからの隣接した読み取りのみ。 よって読み取りが削除されることはない。
681 名前:デフォルトの名無しさん mailto:sage [2011/09/15(木) 12:34:46.76 ] >>678 ECMAのメモリモデルではあり得るが、 CLR2のメモリモデルでは起こらない。
682 名前:デフォルトの名無しさん mailto:sage [2011/09/15(木) 12:57:20.42 ] >>680 おっと、もう少し正確には、読み取りが丸ごと無くなってしまうような事はない。
683 名前:デフォルトの名無しさん mailto:sage [2011/09/15(木) 21:05:03.01 ] どうでもええけどえらそーに言ってたやつらが急に黙りこくってて笑えるぞ
684 名前:デフォルトの名無しさん mailto:sage [2011/09/19(月) 02:54:28.89 ] >>677 それって、Xbox360のXNAとかWindowsPhoneとかでも同じなのかな。 IA-64版のメモリモデルをx86版とほぼ同じになるように修正したのは ビジネス的な判断としてはアリかもしれんが、 PowerPCやarmでも同じようにするのはオーバーヘッドが大きすぎると思うんだが。
685 名前:デフォルトの名無しさん mailto:sage [2011/09/19(月) 10:38:04.13 ] 実行環境(.NET Framework)の話とC#などの言語の話がごっちゃになってる気がする。 .NET Frameworkのモデルでは書き込み順が入れ替わることはないが、 その前のコンパイラの段階で x = 1; y = 2;が逆転することはある。
686 名前:デフォルトの名無しさん mailto:sage [2011/09/19(月) 11:50:25.42 ] ねーよ。 何のために変わるんだよ。
687 名前:デフォルトの名無しさん mailto:sage [2011/09/19(月) 16:23:59.39 ] まあCLRのメモリモデルを頼りにしたければ、MSILで書けってこった。
688 名前:デフォルトの名無しさん mailto:sage [2011/09/19(月) 17:16:22.88 ] メモリモデルに反するコンパイルを行うコンパイラがどこにあんだよ。
689 名前:デフォルトの名無しさん mailto:sage [2011/09/19(月) 18:54:18.85 ] \ここにいるぞ!/
690 名前:デフォルトの名無しさん mailto:sage [2011/09/19(月) 19:10:50.21 ] ヒュー!
691 名前:デフォルトの名無しさん mailto:sage [2011/09/19(月) 19:37:52.18 ] ハンドコンパイラ、自由にコードを作成できる
692 名前:デフォルトの名無しさん mailto:sage [2011/09/19(月) 20:11:33.77 ] 最近のコンパイラは最適化もしなくなったのか
693 名前:デフォルトの名無しさん mailto:sage [2011/09/19(月) 21:18:28.10 ] 「最適化」を「何でもアリ」と勘違いしているヒトが居る模様
694 名前:デフォルトの名無しさん mailto:sage [2011/09/19(月) 21:29:41.61 ] 実際問題、最近のマルチスレッドを前提とした中間言語処理系では、 昔みたいな静的コンパイル時の大胆な最適化は行わない。 というか、実行環境のCPUが想定できないので、あまり意味もない。
695 名前:デフォルトの名無しさん mailto:sage [2011/09/19(月) 21:36:40.42 ] もっとも、可能性で言えばECMA仕様準拠のコンパイラならありえなくはない。 MSのコンパイラならあり得ない。 でも多分、ECMA仕様準拠のコンパイラでもそんなことはやらない気がする。
696 名前:デフォルトの名無しさん mailto:sage [2011/09/19(月) 22:14:25.39 ] それこそ言語仕様次第でしょ。 たとえばCプログラムが、逐次一貫性メモリモデルに沿ったプロセッサで動く実行コードに コンパイルされるとして、じゃあ何が保証されるかというとCの言語仕様の範囲内でしかない。 書き込み順を入れ替えても、Cコンパイラとしては正しい。
697 名前:デフォルトの名無しさん mailto:sage [2011/09/19(月) 23:26:17.69 ] だから最初から特定の処理系の話だよね。
698 名前:デフォルトの名無しさん mailto:sage [2011/09/19(月) 23:29:00.91 ] そして言語仕様だけでは定義されてない範囲ってものがある。 C言語仕様だけじゃマルチスレッドにおいて何もできない。
699 名前:デフォルトの名無しさん mailto:sage [2011/09/20(火) 00:11:35.17 ] 結局、>678の質問の答えはどうなん? CLRの仕様から答えは決まるのか、 それともC#も仕様で決まるのか?
700 名前:デフォルトの名無しさん mailto:sage [2011/09/20(火) 00:14:14.83 ] >699 >698が言ってる通り、C#の仕様では1-4の実行順序は規定されていない。 よって、リオーダーは起こりうる。
701 名前:デフォルトの名無しさん mailto:sage [2011/09/20(火) 00:41:04.58 ] C/C++の仕様だと、;等のシーケンスポイントの前後での入れ替えは 起こらないことが規定されてるけどな。 機械語の書き込み順が、現れた順番で行われるかどうか、という点には 何も規定されていない。JVMやCLR等はそういう点にも言及されていると。
702 名前:デフォルトの名無しさん mailto:sage [2011/09/20(火) 00:55:54.52 ] それはCプログラムの意味(抽象機械上での振る舞い)定義でしかないよ。 意味が変わらなければ入れ替えは許される。 (そうでないと、ループ不変式移動すらできない) 問題は、Cプログラムの意味定義は実行の流れがひとつという前提でなされていること。
703 名前:デフォルトの名無しさん mailto:sage [2011/09/20(火) 00:58:37.26 ] ついでに機械語命令の実行順は、プロセッサの仕様で規定されている。 もちろん未規定な部分もあるけどね。
704 名前:デフォルトの名無しさん mailto:sage [2011/09/20(火) 01:14:32.80 ] ???
705 名前:デフォルトの名無しさん mailto:sage [2011/09/20(火) 01:18:24.02 ] >問題は、Cプログラムの意味定義は実行の流れがひとつという前提でなされていること。 C#の言語仕様では、別スレッド等ではなく突然実行が複数になったり入れ替わったりすることを許しているわけ? >ついでに機械語命令の実行順は、プロセッサの仕様で規定されている。 CLRでは規定されてないとでも?
706 名前:デフォルトの名無しさん mailto:sage [2011/09/20(火) 01:26:01.83 ] さっきから暴れてる方、 >>698が言ってる通り、C#の仕様では1-4の実行順序は規定されていない。 や >意味が変わらなければ入れ替えは許される。 の出展を示してくれませんかね。 それぞれ、C#の言語仕様とCの言語仕様の、どの部分で言及されているのか。 でなければ、ただの脳内妄想と区別がつきませんので。
707 名前:デフォルトの名無しさん mailto:sage [2011/09/20(火) 01:48:51.52 ] その通りだと思うが出典だぞ
708 名前:デフォルトの名無しさん mailto:sage [2011/09/20(火) 02:28:18.91 ] C#言語仕様の範囲では、 C#言語仕様の 3.10 実行順序 および 10.5.3 Volatile フィールド で規定されてる。 でMSの.NET Frameworkの実装としては、何度か出てるCLRの仕様に則っている。
709 名前:デフォルトの名無しさん mailto:sage [2011/09/20(火) 08:38:12.37 ] コンパイラが実行順序かえたら駄目だろ
710 名前:708 mailto:sage [2011/09/20(火) 09:28:06.57 ] 念のため、俺は>>700 ではない。
711 名前:デフォルトの名無しさん mailto:sage [2011/09/20(火) 09:28:42.41 ] レベルひくっ
712 名前:デフォルトの名無しさん mailto:sage [2011/09/20(火) 10:22:38.97 ] ○____ .|| | .|| ● | .|| | .|| ̄ ̄ ̄ ̄ .|| 君が代は ∧__,,∧|| 千代に八千代に ( `・ω・|| さざれ石の巌となりて ヽ つ0 こけのむすまで し―-J
713 名前:デフォルトの名無しさん mailto:sage [2011/09/23(金) 11:34:40.79 ] >>708 C#言語仕様もCLRの仕様も、またECMAのCLI仕様においても、 全部「命令のリオーダーが許されるか否か」の視点でしか 記述されてないんだよね。 例えばCLR2.0においては、同一スレッド内の書き込みの順序は 入れ替えられないとされてるようだけど、実行環境がx86であれば それは単に「コンパイラがプログラムを機械語に落としこむときに 書き込み命令の発行順を入れ替えない」とするだけで実現可能。 x86 CPUのメモリモデルは非常に強いので、アウトオブオーダー実行などによって、 ある書き込みが先行する書き込みより先にglobally visibleになることは認められていない。
714 名前:713 mailto:sage [2011/09/23(金) 11:35:46.25 ] でも、PowerPCやarmでは事情が違ってくる。 これらのCPUのメモリモデルはx86よりもずっと緩いので、 単に「コンパイラが書き込みの順序を入れ替えない」とするだけだと、 CPUによるリオーダーによって「他スレッドからは書き込み順が 入れ替わったように見える」ことが起こりうる。 一方で、このようなCPUによるリオーダーまでも防ごうとすると、 ほとんどの書き込み命令の間にメモリバリア命令を挟まなきゃ ならなくなる。当然、パフォーマンスの低下はとてつもない。 .NETのメモリモデルって、x86のことしか考えてないように見えるんだよね。 JavaやC++11のメモリモデルは、そういう「リオーダー禁止」とかの 直接的視点ではなく、もっとメタなレベルで「ある書き込みが ある読み込みからはvisibleか否か」を定義してるので、 x86以外のアーキテクチャでも実装しやすくなっている。 今後、マルチコアなWindowsPhoneが出てきたときに いろいろ酷いことになったりしなきゃいいが。
715 名前:デフォルトの名無しさん mailto:sage [2011/09/23(金) 18:44:38.36 ] 実際にitanium版とかあるわけで、実用上なんとかなるレベルだったんじゃないの?
716 名前:デフォルトの名無しさん mailto:sage [2011/09/23(金) 18:48:00.72 ] あとCLIとかのメモリモデルもリオーダはメモリの可視性を含めた話だよ。 キャッシュの影響で、実質的に順序が変わったように見える話とかも出てきてるんだから。 特にECMAの仕様はかなりjavaに近いと思うが。 ていうかほとんどjavaと変わらんような。
717 名前:デフォルトの名無しさん mailto:sage [2011/09/23(金) 18:52:07.56 ] 書き込み毎にメモリバリアいるんじゃないかってのは俺も疑問無くはないんだけど、 多くのCPUではこのルールを守るのは大してペナルティはないというのも読んだことがあって、 実際のとこはよく分からない。
718 名前:デフォルトの名無しさん mailto:sage [2011/09/23(金) 18:54:03.30 ] 何が言いたいのかわからんなあ
719 名前:! 【14m】 【東電 66.0 %】 mailto:sage [2011/09/23(金) 18:58:34.31 ] ペリフェラルいじるときは エイエイオー しまくりだ
720 名前: ◆0uxK91AxII mailto:sage [2011/09/23(金) 20:02:20.23 ] CLRなんて作らないから、どうでも良い。
721 名前:デフォルトの名無しさん mailto:sage [2011/09/23(金) 22:55:12.81 ] >>715 Itaniumで.NETアプリを動かすのって、基本的には x86のWindowsサーバー上のアプリをそのまま持っていきたい ってニーズがほとんどだろうから、その場合はパフォーマンスより先に 互換性確保のほうが最大限に重視されるだろうね。
722 名前:デフォルトの名無しさん mailto:sage [2011/09/24(土) 03:15:05.37 ] C++0xとCLRとJavaのメモリモデルの違いとか考えたこともない話だわ マルチスレッドに詳しいひとは普段どんな仕事してるんだろ
723 名前:デフォルトの名無しさん mailto:sage [2011/09/24(土) 10:21:23.71 ] 排他に必要なメモリバリア類をライブラリだかCLRだかVMだかがやるんじゃないの。 そこを超えて踏み込む(=排他をケチる)とメモリモデルの違いが表面化するとか? 俺の持論:volatileで十分w
724 名前:デフォルトの名無しさん mailto:sage [2011/09/24(土) 11:58:45.66 ] volatileの言語仕様知らないだろw
725 名前:デフォルトの名無しさん mailto:sage [2011/09/24(土) 15:39:38.60 ] volatileを信用してると痛い目合うコンパイラもあるぞ
726 名前:デフォルトの名無しさん mailto:sage [2011/09/24(土) 15:56:04.66 ] 会う
727 名前:デフォルトの名無しさん mailto:sage [2011/09/24(土) 17:11:35.69 ] コンパイラからバールのような物が飛んでくるのですね
728 名前:デフォルトの名無しさん mailto:sage [2011/09/24(土) 17:55:34.09 ] perlのようなものか
729 名前:デフォルトの名無しさん mailto:sage [2011/09/24(土) 18:18:48.58 ] >>716 ECMA-335はvolatile変数についてrelease-acquireバリアは要求してるけど、 sequential consistencyは要求してないように見える。12.6.7には > a conforming implementation is not required to provide a single total ordering > of volatile writes as seen from all threads of execution. とも書いてるし。
730 名前:729 mailto:sage [2011/09/24(土) 18:20:59.69 ] >>716 だから、ECMA-335において、たとえば以下のようなコードでは volatile int a = 0; volatile int b = 0; Thread1: { a = 1; int r1 = b; } Thread2: { b = 1; int r2 = a; } r1 == 0 && r2 == 0 という結果も許されるんじゃないかな。 一方で、JavaのvolatileやC++11のstd::atomicはこういう結果を許さない。
731 名前:デフォルトの名無しさん [2011/09/24(土) 19:22:11.48 ] .NETではInterlocked使うんだよ
732 名前:デフォルトの名無しさん mailto:sage [2011/09/24(土) 20:10:49.35 ] メモリバリアとアクセス競合ごっちゃになってないか?
733 名前:デフォルトの名無しさん mailto:sage [2011/09/25(日) 00:03:40.81 ] javaってこれのせいでvolatile遅いんじゃねーの?
734 名前:デフォルトの名無しさん [2011/09/25(日) 00:21:16.82 ] Javaって誕生当初はロックのコストが無視できるくらいVM遅かったの? コレクションが全部同期とか頭おかしいよね
735 名前:デフォルトの名無しさん [2011/09/25(日) 00:25:40.60 ] 遅かった
736 名前:デフォルトの名無しさん mailto:sage [2011/09/25(日) 01:33:01.66 ] 複数リクエストが並行してバンバン来るservletやjspがその上で動いてたもんだから大変
737 名前:デフォルトの名無しさん mailto:sage [2011/09/25(日) 13:00:47.00 ] >>734 まさにそのとおり
738 名前:デフォルトの名無しさん mailto:sage [2011/10/04(火) 11:57:09.05 ] ハードディスクが一つしかない環境だと ファイルアクセススレッドを何本走らせても結局ハードディスクにアクセスしてるのは常に一つだから 二本目以後は意味ないですか?
739 名前:デフォルトの名無しさん mailto:sage [2011/10/04(火) 13:08:54.15 ] そんなことはない。
740 名前:デフォルトの名無しさん mailto:sage [2011/10/04(火) 15:42:40.84 ] シークが増えて、余計に遅くなるという意味なら有る
741 名前:デフォルトの名無しさん mailto:sage [2011/10/04(火) 18:03:27.80 ] CPUから見ればI/Oは超遅いから無意味、と予想するけど OSやHDDのキャッシュでかなり違うのかもしれない 結局環境依存だしやってみて実測するしかないっていうね
742 名前:デフォルトの名無しさん mailto:sage [2011/10/04(火) 20:06:08.63 ] >>738 >>740 シークを待っている間に別の処理を行える事で、 早くなる可能性もある。どっちに転ぶかは仕様 次第なんで、それだけの話じゃわからない。 確実に言えるのは「早くなる場合と、遅くなる場合と、変わらない場合がある」って事だけだ。
743 名前:デフォルトの名無しさん mailto:sage [2011/10/04(火) 20:49:34.91 ] S-ATAて仕様上はコマンド並び替えとかでシーク減るとか無かったけ?
744 名前:デフォルトの名無しさん mailto:sage [2011/10/05(水) 10:48:57.34 ] 期待するだけ空しい
745 名前:! 【13.8m】 【東電 78.9 %】 mailto:sage [2011/10/09(日) 21:31:08.21 ] NCQをまともに機能させるのは大変なことだお( ^ω^)
746 名前:デフォルトの名無しさん mailto:sage [2011/10/10(月) 06:46:41.34 ] FFのリークが酷過ぎ
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は出来ているのでマスクには問題無いと思うのですが。 宜しくお願いします。