[表示 : 全て 最新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】
【言語】
【実行環境】
【その他特記する事項】

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を設定したのは、確実に再現させるためです。
実際には設定しなくても、多くのプロセスが動いている場合に
優先度の高いプロセスが、優先度の低いプロセスに阻害される
可能性を排除したいのです。






[ 続きを読む ] / [ 携帯版 ]

前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