[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2chのread.cgiへ]
Update time : 05/21 03:04 / Filesize : 243 KB / Number-of Response : 977
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

マルチスレッドプログラミング相談室 その8



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】
【言語】
【実行環境】
【その他特記する事項】

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は出来ているのでマスクには問題無いと思うのですが。
宜しくお願いします。






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<243KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef