11/08/21 09:04:32.75
「パフォーマンスの向上」が何を意味するのか、が決まらないと無意味な議論だな
その点に限れば、主観以外の論拠が出てこない(実際出てない)から、終着点なんか
無いぞ
元々MTのメリットという話題だったが、技術的に何の参考にもならん話だしどうでも
いいんだが
651: ◆0uxK91AxII
11/08/21 11:45:37.53
意味を定義しても無駄な議論だけどね:b
652:デフォルトの名無しさん
11/09/09 19:42:55.52
C#のマルチスレッドのプログラミングです。
変数がいくつかある。例えばこんな感じ。
int A;
int B;
・
・
int Z;
で、スレッド①で定期的にA~Zの変数の値を更新している。
スレッド②からこれら変数を読みたいのだが、必ずA~Zまで全部更新された状態で読みたい。
(つまりスレ①が更新処理中に読みに行くのはアウトってこと。)
優先度が高いのはスレ①です。
どうやれば“スマート”なんでしょう?
変数を更新している間スレ①以外の実行を止めるような仕掛けがあるんじゃないかと思って探したんだけど無さそうだね。
653:デフォルトの名無しさん
11/09/09 19:50:28.24
URLリンク(ufcpp.net)
654:デフォルトの名無しさん
11/09/09 20:10:35.64
>>653
それ、なんかちゃうで。
655:デフォルトの名無しさん
11/09/09 21:29:06.03
>>652
途中で読まれてはいけない更新の開始から最後までロックする。
ロックが長時間にわたる可能性がある場合はSystem.Threading.Mutex.WaitOneで
タイムアウトさせる。
656:デフォルトの名無しさん
11/09/09 21:57:27.33
1以外は読むだけなんだろ?
そりゃ System.Threading.ReaderWriterLock だろ
657:デフォルトの名無しさん
11/09/12 00:26:16.03
中途半端な状態で読むのがアウトってだけだったら、一つのクラスにA~Zの変数をまとめておいて
更新時には丸ごと新しいインスタンスに差し替えてしまえばロックいらないよ
658:デフォルトの名無しさん
11/09/13 18:08:55.63
RCUのめんどいところは古い情報をいつ削除するか
659:デフォルトの名無しさん
11/09/14 18:37:15.35
C#での話だからGC任せでok
あと、インスタンスへの参照を保持する変数にはvolatileを付けとけよ。
660:デフォルトの名無しさん
11/09/14 21:28:32.04
この使い方だと実はつけなくても大丈夫だけどな。
つけとく方がいいけど。
661:デフォルトの名無しさん
11/09/14 22:13:31.15
クライアントが古い方への参照を持ち続けていてはまると予想。
662:デフォルトの名無しさん
11/09/15 00:00:30.87
>661 の他にも、「新インスタンス上の変数A��Zへの書き込み」と
「共有変数を新インスタンスへの参照で更新」がリオーダーされないようにする必要がある。
663:デフォルトの名無しさん
11/09/15 00:24:43.65
.NET Framework 2.0以降(CLR2.0以降)のメモリモデルでは、
書き込み順をリオーダできないというルールがあるため、それは起こらない。
664:デフォルトの名無しさん
11/09/15 02:03:26.35
>>663
一般の変数に関しては、そんな規定は仕様書の何処にもない。
665:デフォルトの名無しさん
11/09/15 02:49:09.91
は?
666:デフォルトの名無しさん
11/09/15 08:20:18.11
コンパイラが順序通りに書き込んでもCPUがそのように
振る舞うわけねーだろ
667:デフォルトの名無しさん
11/09/15 08:23:43.17
メモリモデルの意味も分かってない馬鹿ばかり。
668:デフォルトの名無しさん
11/09/15 08:45:27.59
>>666
お前はMSの文書ちゃんと読めよ
669:デフォルトの名無しさん
11/09/15 09:34:15.77
ちなみに読み込みは順序換えが許されている。
一般的には読み込み順序の問題でvolatileが必要になるんだが、
今回のような処理では、参照変数より先に参照先を読むことが不可能なため、
volatileがなくても実は問題が発生しない。
もちろん読み込みの挿入が許可されてないってのも重要なんだが。
まあ普通はvolatileつけるでOK。
670:デフォルトの名無しさん
11/09/15 10:44:40.93
>>669
いや、だから読み書きともに順序替えが許されてるんだってば
671:デフォルトの名無しさん
11/09/15 11:08:07.18
>>669
つけなくて大丈夫ってことは無いよ
なにか別のパターンと勘違いしてないか?
672:デフォルトの名無しさん
11/09/15 11:27:46.91
つけなきゃだめってのは、何を見て言ってるの?
CLR2.0のメモリモデルでは書き込み順序換えは許可されてない、
かつ読み込みを複数回に分ける事も許可されてない、
したがって今回のような処理では実質的にvolatileは不要。
このことはMSDNマガジンにも書かれてる内容。
673:デフォルトの名無しさん
11/09/15 11:28:52.30
>>670
書き込み順序換えは出来ないとはっきり書かれてる。
674:デフォルトの名無しさん
11/09/15 11:59:15.21
>>673
どこに?
CLIの仕様書にはどこにもそんなことは書かれてないが。
675:デフォルトの名無しさん
11/09/15 12:01:40.73
>>672
それはあんたがMSDNの記事を誤読してるだけだろ。
676:デフォルトの名無しさん
11/09/15 12:08:07.35
>>674
だから最初からCLR2のメモリモデルではと言っとろうに
677:デフォルトの名無しさん
11/09/15 12:13:29.95
>>675
どこを誤読してるのか明確に指摘してくれ。
URLリンク(msdn.microsoft.com)
正確には全く同じ話ではないが、結論は同じことになる話が出てる。
まあMSDNマガジンの例の方がより無茶な話も出てるけど。
678:デフォルトの名無しさん
11/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
11/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:デフォルトの名無しさん
11/09/15 12:32:34.08
>>679
不要。
読み取りを削除出来るのは、同一ロケーションからの隣接した読み取りのみ。
よって読み取りが削除されることはない。
681:デフォルトの名無しさん
11/09/15 12:34:46.76
>>678
ECMAのメモリモデルではあり得るが、
CLR2のメモリモデルでは起こらない。
682:デフォルトの名無しさん
11/09/15 12:57:20.42
>>680
おっと、もう少し正確には、読み取りが丸ごと無くなってしまうような事はない。
683:デフォルトの名無しさん
11/09/15 21:05:03.01
どうでもええけどえらそーに言ってたやつらが急に黙りこくってて笑えるぞ
684:デフォルトの名無しさん
11/09/19 02:54:28.89
>>677
それって、Xbox360のXNAとかWindowsPhoneとかでも同じなのかな。
IA-64版のメモリモデルをx86版とほぼ同じになるように修正したのは
ビジネス的な判断としてはアリかもしれんが、
PowerPCやarmでも同じようにするのはオーバーヘッドが大きすぎると思うんだが。
685:デフォルトの名無しさん
11/09/19 10:38:04.13
実行環境(.NET Framework)の話とC#などの言語の話がごっちゃになってる気がする。
.NET Frameworkのモデルでは書き込み順が入れ替わることはないが、
その前のコンパイラの段階で x = 1; y = 2;が逆転することはある。
686:デフォルトの名無しさん
11/09/19 11:50:25.42
ねーよ。
何のために変わるんだよ。
687:デフォルトの名無しさん
11/09/19 16:23:59.39
まあCLRのメモリモデルを頼りにしたければ、MSILで書けってこった。
688:デフォルトの名無しさん
11/09/19 17:16:22.88
メモリモデルに反するコンパイルを行うコンパイラがどこにあんだよ。
689:デフォルトの名無しさん
11/09/19 18:54:18.85
\ここにいるぞ!/
690:デフォルトの名無しさん
11/09/19 19:10:50.21
ヒュー!
691:デフォルトの名無しさん
11/09/19 19:37:52.18
ハンドコンパイラ、自由にコードを作成できる
692:デフォルトの名無しさん
11/09/19 20:11:33.77
最近のコンパイラは最適化もしなくなったのか
693:デフォルトの名無しさん
11/09/19 21:18:28.10
「最適化」を「何でもアリ」と勘違いしているヒトが居る模様
694:デフォルトの名無しさん
11/09/19 21:29:41.61
実際問題、最近のマルチスレッドを前提とした中間言語処理系では、
昔みたいな静的コンパイル時の大胆な最適化は行わない。
というか、実行環境のCPUが想定できないので、あまり意味もない。
695:デフォルトの名無しさん
11/09/19 21:36:40.42
もっとも、可能性で言えばECMA仕様準拠のコンパイラならありえなくはない。
MSのコンパイラならあり得ない。
でも多分、ECMA仕様準拠のコンパイラでもそんなことはやらない気がする。
696:デフォルトの名無しさん
11/09/19 22:14:25.39
それこそ言語仕様次第でしょ。
たとえばCプログラムが、逐次一貫性メモリモデルに沿ったプロセッサで動く実行コードに
コンパイルされるとして、じゃあ何が保証されるかというとCの言語仕様の範囲内でしかない。
書き込み順を入れ替えても、Cコンパイラとしては正しい。
697:デフォルトの名無しさん
11/09/19 23:26:17.69
だから最初から特定の処理系の話だよね。
698:デフォルトの名無しさん
11/09/19 23:29:00.91
そして言語仕様だけでは定義されてない範囲ってものがある。
C言語仕様だけじゃマルチスレッドにおいて何もできない。
699:デフォルトの名無しさん
11/09/20 00:11:35.17
結局、>678の質問の答えはどうなん?
CLRの仕様から答えは決まるのか、
それともC#も仕様で決まるのか?
700:デフォルトの名無しさん
11/09/20 00:14:14.83
>699
>698が言ってる通り、C#の仕様では1-4の実行順序は規定されていない。
よって、リオーダーは起こりうる。
701:デフォルトの名無しさん
11/09/20 00:41:04.58
C/C++の仕様だと、;等のシーケンスポイントの前後での入れ替えは
起こらないことが規定されてるけどな。
機械語の書き込み順が、現れた順番で行われるかどうか、という点には
何も規定されていない。JVMやCLR等はそういう点にも言及されていると。
702:デフォルトの名無しさん
11/09/20 00:55:54.52
それはCプログラムの意味(抽象機械上での振る舞い)定義でしかないよ。
意味が変わらなければ入れ替えは許される。
(そうでないと、ループ不変式移動すらできない)
問題は、Cプログラムの意味定義は実行の流れがひとつという前提でなされていること。
703:デフォルトの名無しさん
11/09/20 00:58:37.26
ついでに機械語命令の実行順は、プロセッサの仕様で規定されている。
もちろん未規定な部分もあるけどね。
704:デフォルトの名無しさん
11/09/20 01:14:32.80
???
705:デフォルトの名無しさん
11/09/20 01:18:24.02
>問題は、Cプログラムの意味定義は実行の流れがひとつという前提でなされていること。
C#の言語仕様では、別スレッド等ではなく突然実行が複数になったり入れ替わったりすることを許しているわけ?
>ついでに機械語命令の実行順は、プロセッサの仕様で規定されている。
CLRでは規定されてないとでも?
706:デフォルトの名無しさん
11/09/20 01:26:01.83
さっきから暴れてる方、
>>698が言ってる通り、C#の仕様では1-4の実行順序は規定されていない。
や
>意味が変わらなければ入れ替えは許される。
の出展を示してくれませんかね。
それぞれ、C#の言語仕様とCの言語仕様の、どの部分で言及されているのか。
でなければ、ただの脳内妄想と区別がつきませんので。
707:デフォルトの名無しさん
11/09/20 01:48:51.52
その通りだと思うが出典だぞ
708:デフォルトの名無しさん
11/09/20 02:28:18.91
C#言語仕様の範囲では、
C#言語仕様の
3.10 実行順序
および
10.5.3 Volatile フィールド
で規定されてる。
でMSの.NET Frameworkの実装としては、何度か出てるCLRの仕様に則っている。
709:デフォルトの名無しさん
11/09/20 08:38:12.37
コンパイラが実行順序かえたら駄目だろ
710:708
11/09/20 09:28:06.57
念のため、俺は>>700ではない。
711:デフォルトの名無しさん
11/09/20 09:28:42.41
レベルひくっ
712:デフォルトの名無しさん
11/09/20 10:22:38.97
○____
.|| |
.|| ● |
.|| |
.|| ̄ ̄ ̄ ̄
.|| 君が代は
∧__,,∧|| 千代に八千代に
( `・ω・|| さざれ石の巌となりて
ヽ つ0 こけのむすまで
し―-J
713:デフォルトの名無しさん
11/09/23 11:34:40.79
>>708
C#言語仕様もCLRの仕様も、またECMAのCLI仕様においても、
全部「命令のリオーダーが許されるか否か」の視点でしか
記述されてないんだよね。
例えばCLR2.0においては、同一スレッド内の書き込みの順序は
入れ替えられないとされてるようだけど、実行環境がx86であれば
それは単に「コンパイラがプログラムを機械語に落としこむときに
書き込み命令の発行順を入れ替えない」とするだけで実現可能。
x86 CPUのメモリモデルは非常に強いので、アウトオブオーダー実行などによって、
ある書き込みが先行する書き込みより先にglobally visibleになることは認められていない。
714:713
11/09/23 11:35:46.25
でも、PowerPCやarmでは事情が違ってくる。
これらのCPUのメモリモデルはx86よりもずっと緩いので、
単に「コンパイラが書き込みの順序を入れ替えない」とするだけだと、
CPUによるリオーダーによって「他スレッドからは書き込み順が
入れ替わったように見える」ことが起こりうる。
一方で、このようなCPUによるリオーダーまでも防ごうとすると、
ほとんどの書き込み命令の間にメモリバリア命令を挟まなきゃ
ならなくなる。当然、パフォーマンスの低下はとてつもない。
.NETのメモリモデルって、x86のことしか考えてないように見えるんだよね。
JavaやC++11のメモリモデルは、そういう「リオーダー禁止」とかの
直接的視点ではなく、もっとメタなレベルで「ある書き込みが
ある読み込みからはvisibleか否か」を定義してるので、
x86以外のアーキテクチャでも実装しやすくなっている。
今後、マルチコアなWindowsPhoneが出てきたときに
いろいろ酷いことになったりしなきゃいいが。
715:デフォルトの名無しさん
11/09/23 18:44:38.36
実際にitanium版とかあるわけで、実用上なんとかなるレベルだったんじゃないの?
716:デフォルトの名無しさん
11/09/23 18:48:00.72
あとCLIとかのメモリモデルもリオーダはメモリの可視性を含めた話だよ。
キャッシュの影響で、実質的に順序が変わったように見える話とかも出てきてるんだから。
特にECMAの仕様はかなりjavaに近いと思うが。
ていうかほとんどjavaと変わらんような。
717:デフォルトの名無しさん
11/09/23 18:52:07.56
書き込み毎にメモリバリアいるんじゃないかってのは俺も疑問無くはないんだけど、
多くのCPUではこのルールを守るのは大してペナルティはないというのも読んだことがあって、
実際のとこはよく分からない。
718:デフォルトの名無しさん
11/09/23 18:54:03.30
何が言いたいのかわからんなあ
719:! 【14m】 【東電 66.0 %】
11/09/23 18:58:34.31
ペリフェラルいじるときは
エイエイオー
しまくりだ
720: ◆0uxK91AxII
11/09/23 20:02:20.23
CLRなんて作らないから、どうでも良い。
721:デフォルトの名無しさん
11/09/23 22:55:12.81
>>715
Itaniumで.NETアプリを動かすのって、基本的には
x86のWindowsサーバー上のアプリをそのまま持っていきたい
ってニーズがほとんどだろうから、その場合はパフォーマンスより先に
互換性確保のほうが最大限に重視されるだろうね。
722:デフォルトの名無しさん
11/09/24 03:15:05.37
C++0xとCLRとJavaのメモリモデルの違いとか考えたこともない話だわ
マルチスレッドに詳しいひとは普段どんな仕事してるんだろ
723:デフォルトの名無しさん
11/09/24 10:21:23.71
排他に必要なメモリバリア類をライブラリだかCLRだかVMだかがやるんじゃないの。
そこを超えて踏み込む(=排他をケチる)とメモリモデルの違いが表面化するとか?
俺の持論:volatileで十分w
724:デフォルトの名無しさん
11/09/24 11:58:45.66
volatileの言語仕様知らないだろw
725:デフォルトの名無しさん
11/09/24 15:39:38.60
volatileを信用してると痛い目合うコンパイラもあるぞ
726:デフォルトの名無しさん
11/09/24 15:56:04.66
会う
727:デフォルトの名無しさん
11/09/24 17:11:35.69
コンパイラからバールのような物が飛んでくるのですね
728:デフォルトの名無しさん
11/09/24 17:55:34.09
perlのようなものか
729:デフォルトの名無しさん
11/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
11/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:デフォルトの名無しさん
11/09/24 19:22:11.48
.NETではInterlocked使うんだよ
732:デフォルトの名無しさん
11/09/24 20:10:49.35
メモリバリアとアクセス競合ごっちゃになってないか?
733:デフォルトの名無しさん
11/09/25 00:03:40.81
javaってこれのせいでvolatile遅いんじゃねーの?
734:デフォルトの名無しさん
11/09/25 00:21:16.82
Javaって誕生当初はロックのコストが無視できるくらいVM遅かったの?
コレクションが全部同期とか頭おかしいよね
735:デフォルトの名無しさん
11/09/25 00:25:40.60
遅かった
736:デフォルトの名無しさん
11/09/25 01:33:01.66
複数リクエストが並行してバンバン来るservletやjspがその上で動いてたもんだから大変
737:デフォルトの名無しさん
11/09/25 13:00:47.00
>>734
まさにそのとおり
738:デフォルトの名無しさん
11/10/04 11:57:09.05
ハードディスクが一つしかない環境だと
ファイルアクセススレッドを何本走らせても結局ハードディスクにアクセスしてるのは常に一つだから
二本目以後は意味ないですか?
739:デフォルトの名無しさん
11/10/04 13:08:54.15
そんなことはない。
740:デフォルトの名無しさん
11/10/04 15:42:40.84
シークが増えて、余計に遅くなるという意味なら有る
741:デフォルトの名無しさん
11/10/04 18:03:27.80
CPUから見ればI/Oは超遅いから無意味、と予想するけど
OSやHDDのキャッシュでかなり違うのかもしれない
結局環境依存だしやってみて実測するしかないっていうね
742:デフォルトの名無しさん
11/10/04 20:06:08.63
>>738
>>740
シークを待っている間に別の処理を行える事で、
早くなる可能性もある。どっちに転ぶかは仕様
次第なんで、それだけの話じゃわからない。
確実に言えるのは「早くなる場合と、遅くなる場合と、変わらない場合がある」って事だけだ。
743:デフォルトの名無しさん
11/10/04 20:49:34.91
S-ATAて仕様上はコマンド並び替えとかでシーク減るとか無かったけ?
744:デフォルトの名無しさん
11/10/05 10:48:57.34
期待するだけ空しい
745:! 【13.8m】 【東電 78.9 %】
11/10/09 21:31:08.21
NCQをまともに機能させるのは大変なことだお( ^ω^)
746:デフォルトの名無しさん
11/10/10 06:46:41.34
FFのリークが酷過ぎ
747:デフォルトの名無しさん
11/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:デフォルトの名無しさん
11/10/19 09:23:38.50
>>747
正しくはstore_releaseとload_acquireね。
store & acquire とか、load & release とかいう組み合わせはない。
749:デフォルトの名無しさん
11/10/19 13:56:45.85
>>747
他のスレッドに値が反映されるまでラグがあると考えればいいよ
750:デフォルトの名無しさん
11/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:デフォルトの名無しさん
11/10/22 21:42:35.60
そういやなんで皆ロックの速さに拘るの?
スレッド全体の処理量に対してロックが必要なのは極僅かでしょ。
752:デフォルトの名無しさん
11/10/22 21:55:02.53
いやロックの話じゃなくてアトミック操作の話
753:デフォルトの名無しさん
11/10/22 22:55:15.90
排他ロックしたら負け
754:デフォルトの名無しさん
11/10/23 09:19:45.48
volatileで十分w
755:デフォルトの名無しさん
11/10/23 09:26:02.86
>>754
解雇
756:デフォルトの名無しさん
11/10/23 14:57:53.13
volatileでどんなコード吐くかみんとハマるよ
757:デフォルトの名無しさん
11/10/23 15:13:30.40
javaやC#ならvolatileで充分だろうな。
CとC++のvolatileは別もんだから役に立たん。
詳しくはC++11スレを見てこい。
758:デフォルトの名無しさん
11/10/23 15:22:42.74
volatileかmutexかなんてのはこっちでする話だろうに
なんであのスレでしつこく長引いてたんだか
759:デフォルトの名無しさん
11/10/23 16:16:29.85
>>758
言語仕様読まないバカが粘着したせい
760:デフォルトの名無しさん
11/10/23 19:18:18.55
C/C++のvolatileはvolatileで目的があって用意されたものだがマルチスレッドと直接関係はない低水準機能で、
使う場合もあれば使わない場合もあると。
volatile std::atomic<T>はJavaのvolatileとほぼ同じ意味だそうだが。
761:デフォルトの名無しさん
11/10/23 19:28:17.70
コンパイラによる静的な省略や並び替えは抑制できるけど
CPUが実行時に行う最適化には関与しないから無意味
762:デフォルトの名無しさん
11/10/23 21:37:00.66
はあ?
763:デフォルトの名無しさん
11/10/23 21:58:56.17
>>762
少しは勉強しろ
764:デフォルトの名無しさん
11/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:デフォルトの名無しさん
11/10/23 22:06:59.86
意味不明なこと言ってるのがわかってないの?
766:デフォルトの名無しさん
11/10/23 22:07:49.18
>>765
自己レス?
767:デフォルトの名無しさん
11/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:デフォルトの名無しさん
11/10/23 22:11:32.64
>>767
てきとーなこと書くなよ
769:768
11/10/23 22:24:48.00
>>767
すまん勘違いしてた。同じa同士のloadとstoreはひっくり返るはずが無いと思ったが実際の動作ならそうなりえるよね。
770:デフォルトの名無しさん
11/10/23 23:05:40.90
>>760
それvolatile無くてもJavaのvolatileと同じ。
volatile変数としてatomicを使えるようになってるだけで、
特別扱いはない。
771:デフォルトの名無しさん
11/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:デフォルトの名無しさん
11/10/23 23:32:07.62
そのコードで会話が成立してるところが凄いかも
773:デフォルトの名無しさん
11/10/24 00:06:26.80
いまから一生懸命C++11での質問してる人がいるけど、
まともに使えるコンパイラでてんの?
メモリバリアとかよくわかんないなら、
今使えるライブラリを動かして勉強した方が早いんとちゃう?
3年後11に本腰入れたって出遅れはしないだろ。
774:デフォルトの名無しさん
11/10/24 00:09:00.47
3年後には次の規格が出てるよ
775:デフォルトの名無しさん
11/10/24 00:19:19.45
>>738
なみの処理じゃ、IOの影響がでかすぎて、
速度の優劣はIO次第になるな。
例えば、1600個の画像からMD5を採ったとき、
IO状態次第で0.7秒から、1分40秒もの差がでる。
恐らく前者はキャッシュ効果だろう。
スレッドを4本でスレッドプール使って計算したが、
確かに計算は速いものの、結局IOがもたつくとどうしようもなく遅い。
776:デフォルトの名無しさん
11/10/24 00:20:20.50
>>774
03から11の間に規格あったっけ?
777:デフォルトの名無しさん
11/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:デフォルトの名無しさん
11/10/25 11:37:57.33
どうでもいいよ
どっちみちそんな手軽にあちこちで無意識に使うもんじゃないでしょ
779:デフォルトの名無しさん
11/10/25 11:46:17.15
デストラクタでJoin失敗したらどうすんの
780:デフォルトの名無しさん
11/10/25 12:39:33.84
スレッドがどうとかより機能別に関数を作れ
781:777
11/10/25 12:55:15.17
レスどうもです。
>どうでもいいよ
作法とかあったらしりたいなぁ、と思いました。(マルチスレッド自体はじめてで。)
今回は簡単なツールなので確かにどうでもいいのですが…。
>Join失敗したらどうすんの
失敗するのですか?
戻り値がvoidだったので気にしてませんでした。
例外が投げられるのかな。調べてみます。
782:777
11/10/25 13:10:39.43
あれ?
結局デストラクタでJoin失敗した場合と、デストラクタじゃない方でJoin失敗した場合とで、どういう違いが起きるのです?
>スレッドがどうとかより機能別に関数を作れ
一つのクラスに押し込めるな、ということでしょうか?
関数は各スレッドで(クラス内で)独立したものを使っていて、
関数間のデータの受け渡しもクラス内のメンバ変数を使っているので、
クラスの使い方的に、理にかなっているかなぁなんて考えたのですが…。
783:デフォルトの名無しさん
11/10/25 14:00:13.83
構造体や変数に volatile とつけたときの
本当の意味を知る方法
784:777
11/10/25 14:47:21.75
レスどうもです。
>構造体や変数に volatile とつけたときの
volatileとか初めて知りました。何てこと…。
でも、コンパイルのコード生成的なオプションで、マルチスレッド指定していれば、変な最適化はされなくないですか?
>どちらもダメで他の方法が良いか
に対するレスですよね?
781か782でしょうか?
785:デフォルトの名無しさん
11/10/25 15:09:03.14
>>777
受信スレッドと加工スレッドと表示スレッドに分けるんだろ。
で、スレッド起動したら基本は動きっぱなしだと理解したんだが。
それなら、受信クラスと加工クラスと表示クラスに分けて、
スレッド起動(受信クラス、ネットワーク情報、受信バッファ)
スレッド起動(加工クラス、受信バッファ、表示キュー)
スレッド起動(表示クラス、表示キュー、表示デバイス情報)
こんな感じで起動すればいいんじゃないのかね。
こういう作りにしておけば、例えばメインスレッドで表示をするように変更するのも簡単だ。
786:デフォルトの名無しさん
11/10/25 15:51:18.15
TBB使えば
787:777
11/10/25 17:02:22.59
>受信スレッドと加工スレッドと表示スレッドに分けるんだろ。
>で、スレッド起動したら基本は動きっぱなしだと理解したんだが。
はい。
>こんな感じで起動すればいいんじゃないのかね。
了解です。
変にまとめすぎない方がいい感じなんですね。
「独立して動くスレッド達のだから、メインでは、何もしないのがいいのかなぁとか無駄に凝ってました。
>TBB使えば
それは、どのような意図でです?
boostとそっくりな気がして、どの様にとりあつかえばヨイのか見当がつかないです。
788:777
11/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:デフォルトの名無しさん
11/10/26 12:59:59.34
>>788
pthread_detachとCloseHandleをスレッドに対して
実行した場合を調べてみ。
790:デフォルトの名無しさん
11/11/03 18:34:53.11
visual c++ 2010 Express
についてくる、
Concurrency::concurrent_queue
を使って、
要素にstringを含んだ構造体(そういえばstringだけって試してないな)を取り扱うと、
デストラクタで開放するときに、アクセス違反が起きるんですけどどうすればいいですか?
という質問をしたいのですけど、Visual C++を教えるスレッドへ行ったほうがいいです?
とりあえず、英語圏で同じ問題を出している人をみつけたんですけど、みたいな状態で、アロケータ?なんだそりゃ?な状態なのです。とりあえず英語読んできます。
ageて申し訳ない。
791:790
11/11/03 18:39:17.13
申し訳ないです。
よく考えたら、Concurrency::concurrent_queueとマルチスレッドって関係浅いですね。
他で訊きなおします。
失礼しました。
792:デフォルトの名無しさん
11/11/03 20:00:51.82
そういえばppl.hのメモリリークのバグっていつの間にかなおってたな
793:デフォルトの名無しさん
11/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:デフォルトの名無しさん
11/11/15 11:43:33.72
プログラミング初心者で課題が出たんですけど…
教えて頂けるとありがたいですm(__)m
・九九の表をVisual Basicで完成させる
・1から100までの整数の和を求める
お願いします
795:デフォルトの名無しさん
11/11/15 13:40:05.39
>>794
スレ違い。
BASICの宿題はお前にまかせた
スレリンク(tech板)
796:デフォルトの名無しさん
11/11/15 18:00:31.85
マルチスレッドで九九表を作るという課題かもしれない
797:デフォルトの名無しさん
11/11/15 18:18:03.92
処理そのもののコストよりもスレッド作るコストの方がでがいわw
798:デフォルトの名無しさん
11/11/15 19:26:55.17
>>797
つまり、よりコストを下げるためにFiberを実装する宿題と言うことか。
799:デフォルトの名無しさん
11/11/16 00:04:15.44
教官が採点不能すぐるwww
800:デフォルトの名無しさん
11/11/16 00:07:19.51
SSE使おうぜ
801:デフォルトの名無しさん
11/11/16 08:01:57.58
SSEを使ったからといって、マルチスレッドとはいえないがな。
802:デフォルトの名無しさん
11/11/16 09:10:50.87
数値計算ならSSEとマルチスレッドを両方使うのが常識だな
803:デフォルトの名無しさん
11/11/16 13:08:03.64
ならGPGPUで
804:デフォルトの名無しさん
11/11/16 17:08:36.01
SSE+マルチスレッドなら九九ならず9999999×9999999くらいの表を作るべきだな
805:デフォルトの名無しさん
11/11/16 17:35:23.60
約100T個
806:デフォルトの名無しさん
11/11/16 20:09:53.33
GPGPUってマルチスレッドなのか?
一応処理単位をスレッドと呼ぶけどそれじゃSSEもマルチスレッドになるような
数値計算だとデータ並列が基本だから数値計算プログラムを書く人から見たら
いわゆるマルチスレッドと大して違わないんだろうが
807:デフォルトの名無しさん
11/11/16 20:32:03.35
GPGPUもSSEも「並列化プログラミング」だよね
ただそれらはスレッド無しでも使える技術だから、このスレでは微妙かも
以前は並列処理スレがあったけど、そちらはdat落ちした
808:デフォルトの名無しさん
11/11/16 22:50:07.24
SSEはSIMDだろ、んでGPGPUとスレッドはMIMD。
SSEとGPGPUは機能としては勿論、分類としても全然違うと思うぞ。
809:デフォルトの名無しさん
11/11/17 02:40:46.84
GPGPUで重要な性質はSIMDだろ
いかにSIMDを生かせるかで性能が決まって、アルゴリズムもそれが前提になる
810:デフォルトの名無しさん
11/11/17 02:59:04.56
GPGPUの各クラスタというか構成単位について見ると
同時に異なる命令を実行していることがあり得るので
Single Instructionではない
フリンの分類に当てはめるならMIMD
しかし、もっと狭めたSPMDっていう表現のほうが適切じゃないの
811:デフォルトの名無しさん
11/11/17 03:21:03.30
複数の別々の画像に対して同じ処理を並列に独立に実行したら
タスク並列かデータ並列かどっちになるの?
812:デフォルトの名無しさん
11/11/17 07:24:31.73
どっちも使ってるで良いだろ
813:デフォルトの名無しさん
11/11/20 20:50:45.10
GPUは投機実行するか、単に並列実行するかで方向性がかなり変わるよね。
もっとも、GPGPUとしては投機実行の方が需要が多いだろうけど。
投機実行となると実行してる命令はクラスタ毎に異なるから
やっぱMIMDとしての使用がメインという事でないか。
814:デフォルトの名無しさん
11/11/20 23:03:59.97
GPGPUは「ゆかいな牧場」のメロディーで発音したくなる。
815:デフォルトの名無しさん
11/11/21 00:44:45.34
>>814
しまった、そう発音していた。
816:デフォルトの名無しさん
11/11/21 18:45:55.58
>>815
おまえがいちろうか、
817:デフォルトの名無しさん
11/11/21 19:42:22.04
大人になってから改めて歌詞を見ると下ネタにしか見えないな
818:デフォルトの名無しさん
11/11/22 19:52:25.40
シングルスレッ~ドでコード おまえ書いてたころ~
819:デフォルトの名無しさん
11/11/22 20:32:28.94
人というのは知っている言葉を敏感に聞きとれるようになっている
すなわち、それは>>817がエロくなっただけのこと
820:デフォルトの名無しさん
11/11/24 06:40:15.25
かゆいな牧場
821:デフォルトの名無しさん
11/11/25 22:40:29.78
atomic_store、stomic_load関数って自分で実装しなくてはならない羽目になったらどうするんですか
WindowsAPIを探してみたんですがよくわかりません
Interlockedシリーズを応用するんでしょうか?
822:デフォルトの名無しさん
11/12/13 03:13:09.01
メモリ競合は、あるスレッドがあるアドレス位置に書き込みを行っている最中に、
別のスレッドがそのアドレス位置に書き込み、もしくは読み込みを行うことで、
そのアドレス位置に中途半端にデータが書き込まれた状態で別のデータが書き込まれる、
あるいは読み込まれることによって起こる、という認識で正しいでしょうか?
その場合、それはビット単位で起こるのでしょうか?
たとえば以下のように、ある変数に2スレッドで書き込み、1スレッド読み込む場合、
変数の値が 0x00, 0xff 以外の値になることはあるでしょうか?
もし変数のサイズがもっと大きければどうでしょう?
// thread0
var = 0x00;
// thread1
var = 0xff;
// thread2
if( var ) ; // ...
823:デフォルトの名無しさん
11/12/13 05:03:20.45
>>822
環境次第。その対象アドレスにあるのが普通のメモリなら、ビット単位と言う事は無いのでその2値以外になることはおそらくない。
824:デフォルトの名無しさん
11/12/13 17:01:56.05
>>822
どのサイズが問題なく読み書きできるかは環境(CPUやVM等)しだい
(intはOKだがdoubleはだめといった感じ)
825:デフォルトの名無しさん
11/12/13 17:32:59.62
>>822
32ビットx86なら4バイトアライメントされたアドレスの4バイトをmovでアトミックに書き込める、
これが8バイトだとmov2回になるので(もっと違う値なら)2値のどちらでもない状態が存在する、とかいうのはある
でも付いて行けなくなるから考えないほうがいいぞ
826:デフォルトの名無しさん
11/12/14 04:35:01.63
>>823-825
ありがとうございます。
とりあえず、メモリを読み書きする電気的な信号などがバッティングして
データが飛んだりハードが壊れたりということはないんですね。
827:デフォルトの名無しさん
11/12/14 06:38:46.37
メモリ競合程度でハード自体が壊れるなら欠陥品と言わざるを得ない
828:デフォルトの名無しさん
11/12/14 08:09:32.50
>>826
その環境が組み込みでメモリマップドI/Oの先にいい加減な回路が繋がっていたりしたら、壊れるかも知れんが。
尤も、そんな回路ならマルチスレッドに関係なく壊しそうだけど。
829:デフォルトの名無しさん
11/12/14 15:52:37.83
そんなハードウェア上で何も組める気がしないぜ
830:デフォルトの名無しさん
11/12/14 16:07:15.72
>>829
しかしそれでも組むのが我々の仕事だ
831:デフォルトの名無しさん
12/01/15 18:00:02.48
物理ディスクとのI/Oコストってデカイじゃん
もしかしたらアーカイブのままメモリに読み込んで、
メモリ中でアーカイブ展開しながら処理した方が
早いんじゃないかとも思うんだが、
検証しやすいサンプルとか無い?
高速展開と、部分抽出が出来れば効果が現れやすいと思う。
832:デフォルトの名無しさん
12/01/15 18:23:45.87
>>831
20年くらい前に、そういうコンセプトのフリーウェアがあったっけな。
とりあえず試してみたら良いだろ。
圧縮率を20%と仮定するなら、100KBのreadにかかる時間と、
80KBのreadにかかる時間差を計測する。
後はオンメモリに置いといて、その時間差ないに解凍できるかだ。
ちなみにディスクの待ち時間の大部分はヘッドのシーク。
データサイズが多少小さくなったところで、得られる時間は少ない。
データが連続している場合、20KB減ったところで1msも短くならないぞ。
833:デフォルトの名無しさん
12/01/15 20:58:51.56
何だ無駄か。読み込みスレッドで随時解凍しながら取り込めば、
ワーカーの処理待ちを減らせるかと思ったのに。
834:デフォルトの名無しさん
12/01/15 22:18:40.46
いや、IO自体のオーバーヘッドは今でもバカにならない。
ネットワーク上のファイルIOもレイテンシがでかい。
いまどき数百MBからGBオーバーのファイルも少なくないんだから、本気でバッファを大きくとるか、コンカレントに処理して欲しい。
アーカイバをいくつか使い比べると何割というレベルの速度差がある。
速い奴はちゃんとそういう所にも気を配ってる。
835:デフォルトの名無しさん
12/01/15 23:21:05.40
そういえば昔、NetWareというサーバOSがあったな
クライアントのローカルHDDをアクセスするよりも
LANでつながったNetWareサーバ上のファイルをアクセスする方が高速だった
古きよき時代
836:デフォルトの名無しさん
12/01/16 01:37:22.73
JavaのFutureとpthread_joinとの違いが、
スレッドプール使えるかどうかぐらいしか解からん。
アレは、pthread_joinとスレッドプール以外じゃ何が違うの?
(オブジェクトと例外返すのは置いといて)
837:デフォルトの名無しさん
12/01/16 01:47:25.07
いやFutureは結果返すためのものだからそれ置いといたらダメだろ
838:デフォルトの名無しさん
12/01/16 02:01:11.36
pthread_joinも結果は返せるからね。
pthread_joinを軽くラップするだけで、
例外を返すのもオブジェクトを返すのも簡単にできちゃう。
結果を返す事だけに注目すると差異としてはあまりに小さいと思うけど。
839:デフォルトの名無しさん
12/01/16 11:48:41.44
>>831
読みきってから処理するのではなく
読みながら処理する
840:デフォルトの名無しさん
12/01/16 13:00:46.78
無圧縮データでディスクIOが、どれくらい
コスト掛かるのか調べてみた。
調べ方は2つスレッドを走らせ、
片方はひたすらカウント、
もう片方はファイル読み込みしながら、
読み込んだバイト数分だけカウント。
どちらもカウント変数をクリティカルセクションで囲んだ。
CPUは2コア。
この条件で実行するとファイル読み込み
してるほうが1/8程度遅かった
遅い遅い言うけどそうでも無いのな。
841:デフォルトの名無しさん
12/01/17 17:41:36.51
キャッシュ読んでるだけじゃないのそれ
842:デフォルトの名無しさん
12/01/17 20:46:09.02
まぁ、NTFSの圧縮ファイルシステム使って早くなるなら、
みんな圧縮してるよね。
843:デフォルトの名無しさん
12/01/18 00:09:55.35
それは一旦全部解答してから読み込むからでしょ
844:デフォルトの名無しさん
12/01/18 15:32:20.55
その認識は完全に間違ってる
URLリンク(blogs.msdn.com)
845:デフォルトの名無しさん
12/01/21 07:08:56.51
2chのログは圧縮フォルダに入れた方が圧倒的に速い
846:デフォルトの名無しさん
12/01/22 10:58:15.73
パソコン側のHDDキャッシュがお馬鹿ってことじゃあ
847:デフォルトの名無しさん
12/01/23 09:41:58.18
>>846
正しいだろ。
848:デフォルトの名無しさん
12/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:デフォルトの名無しさん
12/02/21 23:46:23.99
>>848
非同期IOとか、メモリマップドファイルとか。
複数スレッドから同時アクセスなんかしたら、ディスクシークが増えて、
帰って遅くなるのは当たり前。
850:デフォルトの名無しさん
12/02/21 23:47:16.21
>>848
NCQにまかせて神に祈る
ってのは冗談で
1. 読む順番が決まっているならデータをデフラグでその順番に並べておく
2. その順番に読めるように1スレッドで読みに行く
851:デフォルトの名無しさん
12/02/22 00:02:11.03
>>849
理屈じゃ分かっちゃいたんだけどねぇ。まさかここまで遅いとは・・・。
>>850
並列化は諦めるしかないのかねぇ。
852:デフォルトの名無しさん
12/02/22 00:31:00.86
ファイルを読むスレッド(1つだけ)とMD5の計算他をするスレッドを分けるとか?
CPU時間がどっちかに偏ってたらだめかもしれませんが。
853:852
12/02/22 00:34:57.35
って850さんが既に言ってますね。ファイルを読むスレッド1+それ以外の計算をするスレッド複数。
そしてディスクアクセスの時間>>計算の時間なら、ディスクが物理的に1つしかない以上は並列化は無理かと。
854:デフォルトの名無しさん
12/02/22 00:49:03.05
>>852
それが微妙なんだよね。
MD5の計算って一般的に順序依存があるから、
1つ前に計算した計算結果が無いと、
次の計算が始められないんだよ。
そんなんもんで、ファイル別なら順序依存が無いから
とりあえず、1スレッド1ファイル処理にしてたんだけど。
実は、ディスクアクセスというよりMD5の
順序依存が一番足引っ張ってんのかもね。
あと、MD5の計算時間だけど読み込みの10倍遅いよ。
855:デフォルトの名無しさん
12/02/22 00:57:48.08
>>854
~かもね、とかの妄想に付き合うのは疲れるから、調べてから書けよ
856:デフォルトの名無しさん
12/02/22 01:17:35.11
>>855
調べるつってもなぁ。発想の問題じゃない?
これ以上調べられることあるかい?
857:デフォルトの名無しさん
12/02/22 01:18:33.05
頼むから喧嘩はやめてくれよな
858:デフォルトの名無しさん
12/02/22 01:18:41.54
> 順序依存が一番足引っ張ってんのかもね。
を明らかにすればいいじゃない
859:デフォルトの名無しさん
12/02/22 01:24:03.16
>あと、MD5の計算時間だけど読み込みの10倍遅いよ。
あれ?それならいけるんじゃない?
仮に11コアのCPUがあったとして、
1コア目→ディスクから10個のファイルを読み出してメモリに吐く
2~11コア目→1コア1ファイル分担当で計算
って形で10コアまでスケールするはずだと思うんだけど。コアはスレッドと読み替えてもok。
860:デフォルトの名無しさん
12/02/22 01:33:14.66
>>859
ロード時間L, MD5計算時間Mとすると(L=10M)
馬鹿正直にやったら10(L+M) = 110M
お前のやり方だと10L+M = 101M
どこがスケールしてるんだ?
ついでに2スレッドでも101Mは出ると思う
861:デフォルトの名無しさん
12/02/22 01:34:10.53
>>860
ごめんどっちが遅いのか勘違いした
吊ってくるわ
862:デフォルトの名無しさん
12/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:デフォルトの名無しさん
12/02/22 01:42:35.74
>>858
ディスクアクセスの改善が無理ならMD5の
順序依存を直すしか無いと言えるんだけど。
もう本当に打つ手がないか意見が聞けないとなんとも。
>>859
確かにね。最終的にはそれが一番効率がいいのかなとも
思うんだけど、ただその方法は計算するファイルは1ファイルまるごと
読み込まないといけないんだよね。
そこがちょっともっといい方法が無いかと引っかかるよ。
864:859
12/02/22 01:45:16.15
861が俺のレスみたいに見えるので一応自己弁護しておこうw
ロード時間L, MD5計算時間Mとすると10L=M
シングルスレッド→10(L+M)=110L
11コアによるマルチスレッド→10L+M=10.1L
とほぼ11倍の性能ということで理屈上スケールはするはずだ、と。もう寝るおやすみ~
865:デフォルトの名無しさん
12/02/22 01:46:07.56
>>862
机上の計算の計算式がイミフなんだが
866:860
12/02/22 01:47:47.73
>>864
うんごめん
そのとおり
867:859
12/02/22 01:49:07.58
俺のアホー
マルチスレッドは10L+M=20Lだ。効率は50%弱か。今度こそおやすみー
868:862
12/02/22 02:01:42.37
見直すといろいろあれだったので気にしないでw
869: ◆0uxK91AxII
12/02/22 15:13:40.47
thread一つ、非同期読込と計算を交互に行う。
870:デフォルトの名無しさん
12/02/22 17:09:49.10
読み込み時間がクリティカルなんだから
読み込みスレッドが他の作業をしたらダメなんじゃないの?
871:デフォルトの名無しさん
12/02/22 19:17:39.81
HDD一個に複数からアクセスすれば、パフォーマンス低下するのが当然じゃあ
872:デフォルトの名無しさん
12/02/22 20:04:50.74
SSDなら実測値が結構改善するんかね
大して普及してないから宛にならんけど
873:デフォルトの名無しさん
12/02/23 00:31:39.79
スレッド制御に頭使いすぎてI/Oウエイトによる遅延完全に無視してない?
874:デフォルトの名無しさん
12/02/23 00:40:50.43
>>872
普及はどこから出てきた
875:デフォルトの名無しさん
12/02/23 01:04:22.28
>>874
SSDから。
876:デフォルトの名無しさん
12/02/23 01:07:07.00
いやだから。
SSDがとんだけ普及してるか、は実測値に影響する項なのか?ってことだろ
877:デフォルトの名無しさん
12/02/23 01:23:30.75
普及してるかどうかは実測値には影響しないよ。
SSD上での実測値改善が見られるとありがたいけど、
世の中SSD搭載してないPCも多いから、
SSDだけで速くなるプログラムはよくないよねって話しだし。
878:デフォルトの名無しさん
12/02/23 01:25:38.17
そっちかよ
自分とこの環境で動かすんじゃないのか
879:デフォルトの名無しさん
12/02/23 01:49:14.20
自作のハッシュ計算ツールだけど、MD5計算速度はキャッシュに乗ってる状態だと
3GHz弱のCore2Duo程度のCPUでも300MB/sは超えてるぞ。
計算のが十倍遅いってどういうことだ?
HDDなんて速くても100MB/s題だと思うが…
880:デフォルトの名無しさん
12/02/23 01:57:30.10
スレッド構成を書いてもらわないとなんとも言えないなぁ
単にシングルスレッドなら100MB/s超えるしね
881:デフォルトの名無しさん
12/02/23 01:59:55.78
>>879
読み込み時間を差し引いた計算時間はどれぐらいだったの?
882:デフォルトの名無しさん
12/02/23 02:05:32.93
>>879
300MB/sってのは、MD5の関数なりクラスなりが1秒間に
計算できた情報量という理解であってる?
883:デフォルトの名無しさん
12/02/23 02:07:57.39
読み込みと計算は別スレッドで同時にやってるから正確には分からんな。
まあいろいろ状況によって時間が変わるけど、計算だけなら最速時で400MB/sくらいだった希ガス。
ああもちろん、読み込みやってもキャッシュに乗ってたら最速だとほぼ同じくらいまで行くよ。
884:デフォルトの名無しさん
12/02/23 02:31:42.72
純粋な計算速度が負けるってのは構成が gcc+linux+Phenom X4 1.8Ghz だからなのかねぇ
885:デフォルトの名無しさん
12/02/25 14:26:44.01
ちょっとスレッドとは違うかもしれないんだけど
メッセージキューを設計しています
シグナルハンドラからキューに積みたいんですが
どうしても排他制御ができません
うまい方法はありますでしょうか
886:885
12/02/25 14:28:07.28
自己解決しました
887:デフォルトの名無しさん
12/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:デフォルトの名無しさん
12/02/28 00:38:36.19
MSの今のList<T>の実装では問題ないはずだけど保証されているわけではない
でもそれデリゲート呼び出しのコストがかさむから普通にループ回したほうが速いだろ
並列でやるんなら、4コアなら領域を4分割して中でループ回したほうがいい
889:デフォルトの名無しさん
12/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:デフォルトの名無しさん
12/02/28 00:47:12.66
訂正
読み取りだけならスレッドセーフだと書いてあるな
891:デフォルトの名無しさん
12/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:デフォルトの名無しさん
12/02/29 21:27:49.37
なんでキャッシュでコンテキストスイッチが起こるのよ…
893:デフォルトの名無しさん
12/02/29 22:05:31.00
>>891
コンテキストスイッチは関係ない。
>それぞれの変数が同じキャッシュラインに乗らないようにするには
キャッシュは8~32バイトぐらいの単位で管理しているから、
適当に無駄なメモリを確保して、それぞれのメモリアドレスが
隣接しないようにすればよい。
894:デフォルトの名無しさん
12/02/29 22:19:38.86
>それぞれのスレッドを単独で実行させた場合
はああ?
895:デフォルトの名無しさん
12/03/01 00:23:04.48
メモリバリアの間違い?
896:デフォルトの名無しさん
12/03/01 00:47:56.20
なんでメモリバリアが出てくんだよ
897:デフォルトの名無しさん
12/03/01 00:55:22.06
コンテキストスイッチみたいなのはCPUを占有すると起こるものなの
無限ループしてパソコンがハングしたらどうするつもりなんだろうね
898:デフォルトの名無しさん
12/03/01 01:28:54.69
1スレッドで実行→コンテキストスイッチが起こらない
3スレッドで実行→コンテキストスイッチが起こりまくる
これのどこが悪いのか俺にはわからないのだがとりあえずCPUはいくつある?
899:デフォルトの名無しさん
12/03/01 08:36:10.06
>>898
cpuは4コアです。
>>897
各ループにSleepは挟んでます。
>>893
無駄なメモリを置いて、キャッシュ対策しようと思います。
また、コンテキストスイッチ数が多いのは、別の原因を探してみます。
900:デフォルトの名無しさん
12/03/01 08:45:24.09
Sleep入れたらそりゃぁ、コンテキストスイッチもするだろうよ。
901:デフォルトの名無しさん
12/03/01 15:54:56.63
コンテキストスイッチさせるのがSleepの目的のひとつだもんよ。
902:デフォルトの名無しさん
12/03/01 16:16:45.26
static変数に書き込み続けるスレッドとか
Sleep挟んでますとか
キャッシュ競合を避けるとか
何 考 え て る の よ ?
903:デフォルトの名無しさん
12/03/01 16:43:35.12
マルチプロセスほど枯れきっちゃいない技術だから、ということでしょうがあんめぇ
904:デフォルトの名無しさん
12/03/01 17:01:12.69
スレッドとかどう捉えてるんだろうね?
905:デフォルトの名無しさん
12/03/01 19:41:07.35
>Sleep
噴いたわw
906:デフォルトの名無しさん
12/03/01 20:09:58.15
Windowsなんて常時、100スレッド以上動いてるのに。
907: ◆0uxK91AxII
12/03/01 20:27:46.46
4CPU環境、速い順に
キャッシュラインを別にした3thread
キャッシュラインが同じっぽい3thread
threadを作らずに1thread
908:デフォルトの名無しさん
12/03/01 20:42:09.96
>>907
>キャッシュラインが同じっぽい3thread
>threadを作らずに1thread
このふたつどっちが早いかは環境やプログラムによるだろ。
後者の方が早くなる事もあるよ。
909: ◆0uxK91AxII
12/03/02 10:33:44.96
環境と粒度に依存。
910:デフォルトの名無しさん
12/03/26 15:59:30.82
メインプロセスと同じ物理コア内のHyperThreading論理コアで実行されている
サブプロセスが、メインプロセスの動作を邪魔しないようにするためのAPI関数は
ありませんか?
例えば、SetProcessAffinityMaskを同じ値にした2つのプロセスは
SetPriorityClassでサブの優先度を下げれば、メインプロセスが
動いているときはサブプロセスはほとんど動作しなくなります。
しかし、SetProcessAffinityMaskを、メインプロセスで1、サブプロセスで2に
した場合、サブプロセスの優先度が低いにもかかわらず、メインプロセスと
CPUリソースを均等に割り振っているようです。
これを防ぐための、SetProcessPriorityに変わるようなAPI関数はありませんか?
911:910
12/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:デフォルトの名無しさん
12/03/26 16:27:27.46
そんなaffinity maskを設定するのが悪い
913: ◆0uxK91AxII
12/03/26 16:47:02.42
下手の考え休むに似たり。
914:910
12/03/26 16:56:47.14
AffinityMaskを設定したのは、確実に再現させるためです。
実際には設定しなくても、多くのプロセスが動いている場合に
優先度の高いプロセスが、優先度の低いプロセスに阻害される
可能性を排除したいのです。
915:デフォルトの名無しさん
12/03/26 20:42:35.46
そんなπとかどーでもいいもん計算せずに実用的なもんつくれよ。
πなんて20桁でもあれば地球の外周を計算できるぞ。
916:デフォルトの名無しさん
12/03/26 22:29:33.41
>>910
>メインプロセスの動作を邪魔しないようにするためのAPI関数はありませんか?
OSは何?
>Dのパターンでのタイムを見ると、サブの優先度がメインより低いにもかかわらず
>Cのパターンと同じになっています。
もしかしてWindows?
Windowsにはプライオリティブーストなど、CPU占有率の高いプロセスのプライ
オリティを強制的に下げる機能や、アクティブウィンドウを持つプロセスの
プライオリティを強制的に上げる機能があるから、設定した通りのプライオリティ
で動作している事は保証されないよ?
917:910
12/03/27 09:12:32.64
>そんなπとか
superπを作っているのではなく、優先度の制御ソフトを作ろうとしています。
具体的には動画エンコードしながらゲームしているのですが、
core 2のときはエンコーダのプロセス優先度をIDLEかBELOW_NORMALにしておけば
ゲームのフレームレートが落ちることはなかったのですが、
core i7にしたら落ちるようになってしまったのです。
918:910
12/03/27 09:28:22.17
>OSは何?
Windows全般ですが、7固有のAPIでもかまいません。
PriorityBoostで優先度が動的に上下するのは知っています。
BのパターンのメインプロセスはE/Fに比べて
若干時間が長くなっており、これがPriorityBoostなどによる
効果だと思いますが、これくらいは問題としていません。
919:デフォルトの名無しさん
12/03/27 09:36:39.40
>>917
動画エンコードプロセスに対して、Battle Encoder Shirase みたいな制御をするとか?
920:デフォルトの名無しさん
12/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
12/03/27 10:53:19.74
>919 このソフトを試してみたいと思います。
これでうまくいくようなら、メインプロセスと同じ物理コアの別論理コアで
動くスレッドに対して同じような処理をするプログラムを作ってみようと思います。
>920 ハード的に制御してくれるAPIがないか知りたかったのです。
エンコーダはマルチスレッドですが、GPUは使っていません。
ゲームとエンコーダをE/Fのパターンのように違う物理コアのAffinityMaskにしてしまえば
ゲームのフレームレートが落ちないことは確認しました。
922:営利利用に関するLR審議中@詳細は自治スレへ
12/03/29 23:58:28.02
>>911
その計算時間どういう操作してどう計ったの?
838万ケタを同時に計算開始しただけ?
論理CPUの割り当てが別なら優先度なんて関係ないに決まってるんだが、意味分かってるか?
ゲームメインを物理コアにだけマスク指定したら問題なさそうな気がするが、それじゃうまくいかないか?
923:910
12/04/02 12:23:22.30
計算時間はsuperπが計測しています。
同時に計算開始しました。
2つの開始ボタンを押す間の数百ミリ秒は、今回は無視です。
>論理CPUの割り当てが~
だから、それを優先付けるAPIはないかという質問です。
HyperThreadingを使用するとパフォーマンスが落ちると問題視され
Pentium4からずいぶん時間がたったので、そろそろ出ていないかと思いました。
ないので代替案を提示してくださってるのだと思いますが。
>ゲームメインを物理~
それだと、論理コアが1つ遊んでしまいます。
924:営利利用に関するLR審議中@詳細は自治スレへ
12/04/02 17:53:01.73
遊べば他方を圧迫しない、働けば圧迫する
HTのために2つあるのは状態に関するレジスタ類だけだもの
925:営利利用に関するLR審議中@詳細は自治スレへ
12/04/02 20:40:06.53
自分で設定する気が無いんならOSに任せろ
926:915
12/04/02 20:57:35.84
>>923
SetProcessAffinityMask
URLリンク(msdn.microsoft.com)
ムダだろうがこれ使ってみれば?
927:営利利用に関するLR審議中@詳細は自治スレへ
12/04/02 21:05:59.53
既出か。メンゴメンゴ。
928:営利利用に関するLR審議中@詳細は自治スレへ
12/04/02 21:25:52.93
>>ゲームメインを物理~
>それだと、論理コアが1つ遊んでしまいます。
何を言ってるのか分からなくなってきた。
論理コアをあそばせるのがもったいないほどCPUを使い切るマルチスレッド化が出来てるのか?
もうちょっと詳しくどういう動作をさせてるのか、どういうスレッド構成になってるのか書いてくれ。
まさかCPUパワーが余ってるのに論理コアが遊んでるのは許せないとかとち狂ったこと言ってないよな、念のために聞くが。
929:営利利用に関するLR審議中@詳細は自治スレへ
12/04/02 21:29:09.18
>>928
どんな理由でもかまわないだろ・・・
930:営利利用に関するLR審議中@詳細は自治スレへ
12/04/02 21:44:51.68
結局のところ>>924でどうにもならないんじゃないの?
931:営利利用に関するLR審議中@詳細は自治スレへ
12/04/02 23:47:25.54
元の質問に誰も答えないのは、万が一あったりするとアレだからだろうねぇ。
でも、さすがに無いと思うよ、そんなAPIは。
別な方法で妥協するしかないんじゃないかな。
932:営利利用に関するLR審議中@詳細は自治スレへ
12/04/03 07:42:04.28
あるか否かは、CPUのニーモニックコードのリストを見ればわかるよ。
そこに命令が用意されていないなら、CPUの内部状態をコントロールしようがない。
非公開命令が用意されている可能性は残るけどな。
933:営利利用に関するLR審議中@詳細は自治スレへ
12/04/03 11:36:54.07
結局一緒じゃねーか。
あとそういうニーモニックがあるかどうかじゃ確実には分からんよ。
無いと思うけどね仕組み上から考えても。
934:営利利用に関するLR審議中@詳細は自治スレへ
12/04/03 14:07:48.98
なんでハードウェアの話になってしまったのかよくわかんないけど、
OS のスケジューリングの話じゃないの?
こんなのとか。
URLリンク(kerneltrap.org)
Windows も HT を意識したスケジューリングをしてくれればいいのにね。
935:営利利用に関するLR審議中@詳細は自治スレへ
12/04/03 15:03:29.48
そりゃOSレベルじゃ制御してない部分の話だもん。
どころかハードレベルでも制御不能だろってのが優勢。
936:営利利用に関するLR審議中@詳細は自治スレへ
12/04/04 07:28:13.10
>>934
してるよ
URLリンク(www.dosv.jp)
APIでプログラマに公開されてるかは知らんが
937:営利利用に関するLR審議中@詳細は自治スレへ
12/04/04 10:42:53.69
物理マルチコアにHTなんていらないんじゃないかな
938:営利利用に関するLR審議中@詳細は自治スレへ
12/04/04 10:44:43.96
HTをONにすると2000ではひっかかりまくるが、XPではスムーズ。
どうみても対応している。
939:営利利用に関するLR審議中@詳細は自治スレへ
12/04/04 11:02:06.05
ただlinuxみたいに同一物理コアの別論理コアに割り当てられたスレッドの優先順位を考慮して
タイムスライスの比率を変えるようなことはしてないね。
940:営利利用に関するLR審議中@詳細は自治スレへ
12/04/04 11:08:09.89
別コアなのにタイムスライスって、スレッドを一時停止してるっことなんだが、
Linuxではそんなことしてるのか。逆にコスト高くつくんじゃないのか。
941:910
12/04/04 11:42:02.39
HyperThreadingは空いている演算器を有効に使うためのものなのに
メインで使っている演算器も奪ってしまうのはおかしいと考えており
別のOSでは実際にそれを回避するようにもなっているということで
とりあえず安心しました。
942:営利利用に関するLR審議中@詳細は自治スレへ
12/04/04 13:07:41.32
なんというか・・・
同時に動かすから、空いてるのを有効に使えるのよ
そして同時に動かせば他方を圧迫する
圧迫を回避する=片方を止める=空いてるのを使えてない なのよ
943:営利利用に関するLR審議中@詳細は自治スレへ
12/04/04 14:29:03.38
>>941
なってねーよ馬鹿かお前は。
944:営利利用に関するLR審議中@詳細は自治スレへ
12/04/04 14:30:35.88
あいつは人の話を聞かないからなあ。
何でも都合よく解釈しやがる。
945:営利利用に関するLR審議中@詳細は自治スレへ
12/04/05 13:36:26.86
そんな理論武装で大丈夫か?
946:営利利用に関するLR審議中@詳細は自治スレへ
12/04/06 15:00:20.07
pthread_rwlockの使い方をおしえて
947:営利利用に関するLR審議中@詳細は自治スレへ
12/04/06 16:30:03.14
>>946
その前に聞くが、pthread_mutex_lockの使い方くらいは知っているのか?
pthread_rwlockはそれより厄介だぞ。
URLリンク(www.tsoftware.jp)の図4が理解できないならやめとけ。
つーか、本当にrwlockが必要なのか?
948:デフォルトの名無しさん
12/05/11 15:36:21.96
2CoreのCPUなら問題ないのに、
HTをONにするとフリーズしたり不安定になるプログラムって何が原因なんだろう?
949:デフォルトの名無しさん
12/05/11 15:41:22.67
複数のスレッドを使うプログラムだろうから、スレッド間の同期がいい加減なのだろう。
950:デフォルトの名無しさん
12/05/12 01:16:48.20
同時に動くとまずいコードがあるんだろう
951:デフォルトの名無しさん
12/05/12 12:53:15.98
2Coreなら大丈夫というのがおかしい。
952:デフォルトの名無しさん
12/05/12 13:07:54.49
別におかしくないよ。
953:デフォルトの名無しさん
12/05/12 13:38:09.65
いやおかしい。
おかしくないなら、2CoreでOKで、HTだとダメなパターンプリーズ。
954:デフォルトの名無しさん
12/05/12 13:45:24.65
ドライバレベルなら昔あったな。
省電力でCPUクロックダウン/休止させる時にHTなので全部止まっちゃいました(テヘっ)ってのが。
955:デフォルトの名無しさん
12/05/12 13:47:28.79
試してみて動いた=OKだと思ってるなら根本的に勘違いしてる
956:デフォルトの名無しさん
12/05/12 13:51:32.68
>>953
そんなこと考えてる暇あったら、HT時に起こってる問題を正確に掴むべき。
ちょっとしたタイミングの違いで動いたり、動かなかったりなんてのはいくらでもある。
957:デフォルトの名無しさん
12/05/12 13:53:22.20
おまえの勘違い半端ねぇ
958:デフォルトの名無しさん
12/05/12 13:54:19.83
たまたまの話ならどうでもいい。
頭の悪い突っ込みは必要ないから。
959:デフォルトの名無しさん
12/05/12 13:55:56.52
突っ込みはしたものの、
HTだけダメなパターンはなに一つも思いつきませんでした。
ごめんなさい。
960:デフォルトの名無しさん
12/05/12 14:01:26.21
お前に思いつくかどうかなんてどうでも良いんだよ。
961:デフォルトの名無しさん
12/05/12 14:03:59.23
>ちょっとしたタイミングの違いで動いたり、動かなかったりなんてのはいくらでもある。
この原因は二つ。
・同期処理をしていない。
・同期処理が必要な部分を洗い出せていない。
HTがダメで2CoreがOKな理由になってないなぁ。
考える暇がないのか考える頭がないのか。
962:デフォルトの名無しさん
12/05/12 14:06:39.92
相談スレで相談したら自分でやれって言う奴を相手にするな。
ただ煽りたいだけの馬鹿なんだから。
963:デフォルトの名無しさん
12/05/12 14:06:45.64
現に原因不明の不具合を目の前にして、そんな事考えるだけ無駄だと分からないやつは開発向いてない。
964:デフォルトの名無しさん
12/05/12 15:03:57.50
問題の起きるメカニズムを解明するのは興味深いが、
解明したところで自己満足以外に得られるものがないからな
結局きっちり同期するしかないんだし
965:デフォルトの名無しさん
12/05/12 15:05:54.53
二つの処理が30ナノ秒以内に終わらないとタイムアウト
するウンコな処理があって2CPUだと偶然動いたとか。
KUSOなコードに論理性を求めるほうが時間の無駄。
単にHT環境で再現するという明らかな不具合を直せばよろしい。
966:デフォルトの名無しさん
12/05/12 18:26:42.65
Pen4の頃のHTを使っていた時は明らかに普通のデュアルCPUと
タイミングが違ってバグの出方も全然違ったよ
>>965の言っているように運よく再現できる環境があるなら
そこで治せばいいんじゃない
967:デフォルトの名無しさん
12/05/12 20:16:48.32
>>953
1スレッドがループ内でレジスタを使い切るパターンだろ
フリーズまではいかんが、挙動が悪くなる
968:デフォルトの名無しさん
12/05/12 20:37:58.42
自分で2CoreではセーフなのにHTをオンにしたら動かない!って言ってるのに、
「そんなパターンは無い!」とか分裂症ですか?って感じ。
そんなパターンがあるからその現象が発生してるのは明らかなのに。
現実逃避もいい加減にしろよ。
969:デフォルトの名無しさん
12/05/12 21:02:29.35
スペック厨で、自分の最強ハードに問題が有るって事が気に入らないんだろう
目の前で起きてる問題をどう解決するかが問題なんだがオタクは空気がよめないね
970:デフォルトの名無しさん
12/05/12 21:07:20.42
HTをオフにしたら動きました。
971:デフォルトの名無しさん
12/05/12 21:19:10.76
>>953
void threadA(){
while(1);
}
void threadB(){
while(1);
}
972:デフォルトの名無しさん
12/05/13 02:00:44.76
それのどこがHTがダメなんだ?
973:デフォルトの名無しさん
12/05/14 09:08:39.75
>>971
シングルコアならOSがタイムシェアリングして均等に実行してくれる。
マルチコアならOSがそれぞれのコアに割り当てて均等に実行してくれる。
HTだとOSはそれぞれの仮想コアに割り当てて均等に実行しているつもりでも、
片方のスレッドが動いている間、もう片方のスレッドは満足に実行されない。
上のようなBusyLoop場合とくに顕著で、何もしない処理がCPUを占有する事になる。
これを防ぐために何もしないから他の仮想コアに処理を渡してよい事を示す
命令が追加されている。
974:デフォルトの名無しさん
12/05/14 16:30:14.82
htでもだいたい均等に割り振られるが。
975:デフォルトの名無しさん
12/05/14 17:15:11.15
HT非対応なんだろ
976:デフォルトの名無しさん
12/05/18 21:50:52.80
すいません。教えてください。
signalマスクをかけたスレッドの関数内で、popenをコールしてるんですが、ctrl+Cするとポインタ(NULLでないpopenの戻り値)からのfgetsが成功する時としない時があるんですが留意する事って何かありますか?
ちゃんとpthread_joinは出来ているのでマスクには問題無いと思うのですが。
宜しくお願いします。