5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

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

1 :デフォルトの名無しさん:2006/09/10(日) 00:13:53
マルチスレッドプログラミングについて語るスレ。
OS・言語・環境は問わないが、それゆえ明記すべし。

その1 http://pc3.2ch.net/tech/kako/997/997345868.html
その2 http://pc5.2ch.net/test/read.cgi/tech/1037636153/
その3 http://pc8.2ch.net/test/read.cgi/tech/1098268137/
その4 http://pc8.2ch.net/test/read.cgi/tech/1130984585/

2 :デフォルトの名無しさん:2006/09/10(日) 00:19:06
関連スレ

【マルチコア】並列化について語る【使いこなせ】
http://pc8.2ch.net/test/read.cgi/tech/1137540671/

pthread地獄 (UNIX板)
http://pc8.2ch.net/test/read.cgi/unix/1010933537/


関連しやすいので一応

ネットワークプログラミング相談室 Port17
http://pc8.2ch.net/test/read.cgi/tech/1148944560/l50

書籍とかはもういいでしょ

3 :デフォルトの名無しさん:2006/09/10(日) 00:33:25


4 :デフォルトの名無しさん:2006/09/10(日) 15:04:22
4ね

5 :デフォルトの名無しさん:2006/09/10(日) 16:03:40
5免蒙る

6 :デフォルトの名無しさん:2006/09/11(月) 07:05:53
pthreadで排他制御やりたいときはmutexしか選択肢は無いんでしょうか?

7 :デフォルトの名無しさん:2006/09/11(月) 22:08:46
condition,semaphore

8 :デフォルトの名無しさん:2006/09/18(月) 01:43:12
本とかはもういいとして、このソースのthread部分は秀逸だっていうの
教えてください

9 :デフォルトの名無しさん:2006/09/18(月) 09:25:39
apache2(ウソ)

10 :デフォルトの名無しさん:2006/09/18(月) 10:05:22
Windowsのスレッドのタイムスライスは、上限が20msと聞きますが
これを制限する方法はありませんか?
できれば、3〜5msに押さえたいのです。

11 :デフォルトの名無しさん:2006/09/18(月) 16:44:32
NT4.0を使って、boot.iniで設定。
Windows Embeddedならどっかで設定できたような。
Vistaは割り込み頻度を変えるAPIがあったかもしれず。

12 :デフォルトの名無しさん:2006/09/18(月) 20:34:42
Fiber使ってで明示的にスイッチするとか

13 :デフォルトの名無しさん:2006/09/18(月) 21:47:30
>>11
ありがとうございます。
こちらでも調べてみたのですが
win9x/2000でのスレッド単位での設定は出来ないようですね。
スレッドスケジューラを少しいじれば、可変に出来る気がするのですが
あんまり需要無いんですかね。

>>12
ファイバを使ってsuspendを置くか、スレッド関数にSleepを置くか、
結局のところ、これしかしかないのですね……
どちらか採用して、今のプロジェクトを進めようと思います。

14 :デフォルトの名無しさん:2006/09/19(火) 10:53:29
>>10

たしか、どっかにVistaのタイムスライスに関する blogがあったな。
××をすると、スイッチが最小時間になると適らないとか。

どっかの、MVPの blogだったと思う。


15 :デフォルトの名無しさん:2006/09/19(火) 21:01:54
>>14
Vista+タイムスライスでググってみた。
ttp://d.hatena.ne.jp/NyaRuRu/searchdiary?word=*%5BVista%5D
ついでに
ttp://www.itmedia.co.jp/help/tips/windows/w0129.html

16 :デフォルトの名無しさん:2006/09/21(木) 21:28:56
InsideWindowsには
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\PriorityControl]
のWin32PrioritySeparation
をいじればいいと書いてある


17 :デフォルトの名無しさん:2006/09/21(木) 22:55:26
ってスレッド単位で制御したいのか

そりゃ無理っぽいな

18 :デフォルトの名無しさん:2006/10/07(土) 12:26:02


19 :デフォルトの名無しさん:2006/10/10(火) 14:57:19
>>14
kernel修正すればいいじゃん。
2.6.xなら安定してるしNPTLを使えばOKだし

20 :デフォルトの名無しさん:2006/10/10(火) 21:20:44
?

21 :デフォルトの名無しさん:2006/10/26(木) 16:02:30
マルチプロセスのプログラムはWindowsで作れますか?

22 :デフォルトの名無しさん:2006/10/26(木) 17:21:43
>>21が意図してるものとは異なるかもしれんが、マルチプロセスのアプリケーションなら作れる。
しかし>>21の質問の仕方からして、>>21には到底無理だろう。

23 :デフォルトの名無しさん:2006/11/04(土) 17:13:38
質問させてください。
Win32APIのSuspendThread()に自スレッドを指定して、
自分自身を眠らせるということは可能でしょうか?

24 :デフォルトの名無しさん:2006/11/04(土) 18:06:36
試せばいいじゃん

25 :デフォルトの名無しさん:2006/11/04(土) 18:47:40
どうやって起こすの?
イベントオブジェクト作ってWaitForしたほうがマシだと思うが・・・

26 :デフォルトの名無しさん:2006/11/04(土) 19:11:44
>>24
すいません、「可能」は「アリ」に置き換えてくださいorz
一応動くんですが、何かマズイんじゃないかなぁと思いまして。

>>25
仰るとおり実用的ではないですが、ちょっと気になったもので…

27 :デフォルトの名無しさん:2006/11/06(月) 15:24:05
>>23
他スレッドからResumeThreadしようとしたとき、Resumeしても SuspendThread の直前だったため
Resume後即 Suspend してしまうケースがある。 → 解決するためには「スレッドのステート(idle,busyなど)」を設けて、
排他的に操作する必要あり。適切なイベントオブジェクトを使って待つ方が良い。

それでもまぁ他のスレッドを Suspend するのに比べればはるかに罪は少ない。

28 :デフォルトの名無しさん:2006/11/07(火) 09:09:31
408 :名無しさん@お腹いっぱい。:2006/11/05(日) 18:14:14
Kentsfield(1P4C) vs Woodcrest(2P4C)
http://www.hardwarezone.com/articles/view.php?id=2102&cid=2&pg=4
Opteronサーバー死んだな…
Clovertown 1.60GHz $455*2 >>> Opteron 2220 SE $786*2
Clovertown 2.33GHz $851*2 >>> Opteron 8220 SE $2149*4

29 :デフォルトの名無しさん:2006/11/09(木) 22:08:24
967 名前:923[sage] 投稿日:2006/09/09(土) 17:29:41
>>959
>intrinsicはスルーか。
済みません、仰りたいことの意味が良く分りませんでした。
このプログラムの要点は、

volatile long a = 0x00001111;
void thread1(){
 while(1)a=0x00001111;
}
void thread2(){
 while(1)a=0x22220000;
}
int main(){
_beginthread(thread1);
_beginthread(thread2);
 while(1)if(a != 0x00001111 && a != 0x22220000)エラー;

return 0;
}

です。組み込み命令云々の余地があるのでしょうか?

main, thread1, thread2が開始される。
〜〜〜時間が十分経過〜〜〜
thread2が動き出す。a=0x22220000が実行される。
mainが動き出す。a!=0x00001111の評価をする。真であった。
thread1が動き出す。a=0x00001111が実行される。
mainが動き出す。a!=22220000の評価をする。真であった。
mainが動き出す。エラー処理を行う・・・???。

30 :デフォルトの名無しさん:2006/11/10(金) 02:13:19
複数のスレッドを起動する場合、
システムに異常が発生しても全てのスレッドを
必ずきちんと終了させたい場合、各スレッドで try catch
入れるんでしょうか?
それとも別に良い常套手段があるんでしょうか?


31 :デフォルトの名無しさん:2006/11/10(金) 06:01:09
システムに異常が発生した事を検知する関数が真を返したらすべてのスレッドが自主的に終了するようにしたらいいんちゃうん?

32 :デフォルトの名無しさん:2006/11/10(金) 08:53:37
ええんちゃう? 最高ちゃう?

33 :デフォルトの名無しさん:2006/11/10(金) 09:56:27
volatile最強伝説復活wwwwwwwwwwwwwww

34 :デフォルトの名無しさん:2006/11/10(金) 19:04:31
このスレも自主的に終了するようにしたらいいんちゃうん?

35 :デフォルトの名無しさん:2006/11/10(金) 20:51:25
ええんちゃう? 最高ちゃう?

36 :デフォルトの名無しさん:2006/11/10(金) 23:12:02
>>29

while(1)if(a != 0x00001111 && a != 0x22220000)エラー;
を分解して
while ( true )
{
if ( a != 0x00001111 ) // a is 0x22220000
{
if ( a != 0x22220000 ) // a is 0x00001111
{
throw std::runtime_error("死んでしまえ");
}
}
}


37 :デフォルトの名無しさん:2006/11/17(金) 16:54:00
>>36
こうすりゃいいんじゃね?

while(1){
int _a = a;
if(_a != 0x00001111 && _a != 0x22220000)エラー;
}

要は00001111か22220000以外が見つかればエラーにしたいんだから。
>>29指摘のコンテキストスイッチによる嘘エラー検出は回避できる。


38 :デフォルトの名無しさん:2006/11/19(日) 14:18:42
初心者です。
スレッドの状態(実行中・サスペンド中など)を知るAPIってありますか?

State = ResumeThread( th_handle ) 又は
State = SuspendThread( th_handle )
として サスペンドカウントを見て状態を更新させています。
状態を監視する別スレッドがこのStateを見て、レジューム・サスペンドの実行をおこなっているのですが、

どーやら、状態を監視するスレッドが見ているStateと実際の状態が異なるらしく、
レジューム中のスレッドにResumeThread を実行したり、サスペンド中のスレッドにSuspendThread を実行しちゃったりしています。

なにかアドバイスもらえませんか?
おねがいします。

OS : Window XP Home
言語: C++
環境: VC++6.0

39 :デフォルトの名無しさん:2006/11/19(日) 14:24:04
resume/suspendよりも、event objectやwindow messageを使って
眠らせることをオススメするよ。

40 :38:2006/11/19(日) 14:35:34
>>39

アドバイス、ありがとうございます。
イベント使って、再設計してみます。

それと、色々さがしたんすけど、やっぱりスレッド状態を知るAPIとかは
ないんすかね?





41 :デフォルトの名無しさん:2006/11/19(日) 14:39:09
知ったところでどうしょうもない、とだけ言っておこう。
だからないのよ。

42 :38:2006/11/19(日) 14:45:36
>>41
了解です。ありがとうございます。

助かります〜

43 :デフォルトの名無しさん:2006/11/19(日) 17:51:29
>>40
状態を調べたところでその次のステップで状態が変わってる可能性もあるわけで、
結局、排他やロックなどが必要になるわけです。
だったらはじめから>>39の方法の方が妥当なのです。

44 :38:2006/11/19(日) 23:36:56
38です。
イベント使って再設計したとこ、なんとか思い通りに動いてくれました。
みなさん、どうもありがとう。
いい勉強になりました〜

45 :デフォルトの名無しさん:2006/11/20(月) 16:10:26
linux上のC言語での質問です。

pthread_create を使ってスレッドを生成すると、そのスレッドが完了しても
1個スレッドが残るんですが、これって開放出来ないんですか?

デバッガで調べると「pthread_managear」というスレッドのようなのですが。


46 :デフォルトの名無しさん:2006/11/20(月) 20:40:45
>>45
スレッドマネージャもためらいきずばかりなんだよね
自殺はよくない

47 :デフォルトの名無しさん:2006/11/21(火) 01:19:01
どのlinux?
それなくなったとか聞いたんだが

48 :デフォルトの名無しさん:2006/11/21(火) 09:28:07
>47
Red Hat Linux 7.3 です。

49 :デフォルトの名無しさん:2006/11/21(火) 19:20:58
pthread_joinしてないとかそういう話じゃないの?

50 :デフォルトの名無しさん:2006/11/22(水) 13:33:05
>49
joinはしてます。
あと 、pthread_detach も試して見ましたが変わらずでした。

51 :デフォルトの名無しさん:2006/11/23(木) 14:14:40
windows c言語です。
_beginthreadexでスレッドを数千つくろうとしてるのですが、
スレッド数400ぐらいこえたところで、_beginthreadが0を返しだすので仕方なくsleepいりのbusyloop
で待って_beginthreadしつづけています。
スレッド数をタスクマネージャでながめると400になり、だんだんへって10桁程度になってから
また400に跳ね上がるのくりかえしをして、正常に終了します。が遅いです。
だんだん減っているときにはすぐに次の_beginthreadが成功してくれて、
なぜ、400のままずっといき、最後がだんだん減っておわらないのかわからないです。
あと、なぜ400で限界になるのでしょうか?
ちなみにスタックサイズをでかくするとスレッド数の限界はもっと減ります。
メモリがどんどんくわれていってスレッドももっとたくさんできて欲しいのですが・・・
スレッドの内容はメモリを動的確保しhtmlをネットから拾ってきて読むものです。

これだけでわかる人 ヒントください。

52 :デフォルトの名無しさん:2006/11/23(木) 14:19:52
>>51
http://www.biccamera.com/bicbic/jsp/w/pcoption/memory/0407/index.jsp

53 :デフォルトの名無しさん:2006/11/23(木) 15:12:17
>>52
え それはないと思う。
プロセスの使用メモリ35MBぐらいなんです。
全部で1Gつんでるのに。

54 :デフォルトの名無しさん:2006/11/23(木) 15:25:10
スタックメモリサイズの制限でしょ

55 :デフォルトの名無しさん:2006/11/23(木) 16:03:20
> スレッドの内容はメモリを動的確保しhtmlをネットから拾ってきて読むものです。

ジョブキューイングとかワーカスレッドとか知らんかね?

56 :デフォルトの名無しさん:2006/11/23(木) 17:00:57
1プロセスにスレッド400個ってのは設計上どうなんだろ…。
タスクマネージャ見ても最高でSystemの78個程度だ。


57 :デフォルトの名無しさん:2006/11/23(木) 21:32:18
>>56
同意。

スレッドの生成と、管理にはそれなりのコストがかかるから、
むやみに増やしてもかえって遅くなる。

せいぜい数個から10数個くらいにとどめておくべきと思う。


58 :デフォルトの名無しさん:2006/11/23(木) 22:29:39
数千スレッド使いたいってあほか。


59 :デフォルトの名無しさん:2006/11/23(木) 23:13:58
PCの玄海に挑戦したかっただけだろうよきっと

60 :デフォルトの名無しさん:2006/11/24(金) 01:00:08
どうもスレッドからみでは、本当に同時平行に処理したいことと、
そうでないことの区別ができてないことが多いようだ。


61 :デフォルトの名無しさん:2006/11/24(金) 01:07:32
この場合は
・ネットへのリクエスト
・得られた情報の分析
が並行処理対象になると思うんだが、
前者と後者ではやりかたがぜんぜん違うよなあ

62 :デフォルトの名無しさん:2006/11/24(金) 01:45:14
あまりのスケールのでかさに、別件でスレッドを使おうか迷っているのが
バカらしくなってきた

63 :デフォルトの名無しさん:2006/11/24(金) 02:08:29
うちだと_beginthread()しまくるだけの奴で
スレッド2000個ちょっとまで作れるな

64 :デフォルトの名無しさん:2006/11/24(金) 14:14:52
ふと>51の質問みて思ったんですが、スレッドを分ける(並列にする)
と処理速度って上がるんでしょうか。

処理の内容によるでしょうけど、単純にCPU性能に依存するような
処理で、並列に処理可能な場合とか。


まあ普通そういう目的でマルチスレッドを利用したりするわけじゃないですが。

65 :デフォルトの名無しさん:2006/11/24(金) 14:15:53
ふと>51の質問みて思ったんですが、スレッドを分ける(並列にする)
と処理速度って上がるんでしょうか。

処理の内容によるでしょうけど、単純にCPU性能に依存するような
処理で、直列に処理してたけど並列に処理可能な場合とか。


まあ普通そういう目的でマルチスレッドを利用したりするわけじゃないですが。

66 :デフォルトの名無しさん:2006/11/24(金) 14:16:56
連書きスマソ;

67 :デフォルトの名無しさん:2006/11/24(金) 15:08:49
>>64
動作中スレッド数よりもCPUコア数が多いなら、スレッドを並列化することで高速化する。
仮に1Core1CPUで単純に並列化した場合、全く高速化しないかオーバーヘッドの分遅くなる。
まぁ、CPUコア数の数倍以上のスレッドを起こすと資源の競合が発生するから速くなる筈がない罠。

68 :デフォルトの名無しさん:2006/11/24(金) 16:02:59
>>67
CPUに限らず、資源が競合する処理なら、確かにそうなるな。

逆に言えば資源を競合しないI/Oウェイトなどが多い処理なら、
CPU数より極端に多いスレッド数でも処理は早くなるといえる。

たとえば今回のようなhtmlファイルのダウンロードの場合、
相手方のサーバーのレスポンス待ちが発生するので、複数のスレッドで別々の
htmlファイルを同時に取得しにいったほうがいい。

ただ、やりすぎると今度はスレッド切り替えとか、メモリスワップとか、回線速度の限界とかで
オーバーヘッドが大きくなるので遅くなる。


69 :デフォルトの名無しさん:2006/11/24(金) 16:05:55
tcpip.sysの同時接続制限とか関係ないのかな?

70 :デフォルトの名無しさん:2006/11/24(金) 18:03:54
>67 68
サンクス!
実はウチの作ってるアプリで性能を指摘されてるトコがあって、
並列化ってどうなんだろうと思ったんで、参考になりました。

とりあえずCPU依存の処理は効果薄って事ですね。

71 :デフォルトの名無しさん:2006/11/24(金) 19:12:42
>>70
並列化を考える前に、やることは色々あると思うよ。
CPUに、P4以上の制限つけていいならiccでコンパイルしてみるとか。
iccがあれば、並列化も簡単に試せるしね。
まぁ、詳細はスレ違いになるんで省略するけど。

72 :デフォルトの名無しさん:2006/11/25(土) 01:58:51
CPU依存の処理で高速化を考えるなら、並列化ではなくアルゴリズムの最適化を考えたほうがいい。

スパコンでもない限り、今のパソコンはせいぜい4コア。
並列処理させても、4倍未満にしかならない。

だけどうまくアルゴリズムを工夫すれば、数倍から数百倍の速度が稼げる可能性がある。


73 :デフォルトの名無しさん:2006/11/25(土) 02:07:56
DELLの6万円パソコン買ったほうがよくね?
10台でも60万。さてアナタの2人月より安い?高い?

74 :デフォルトの名無しさん:2006/11/25(土) 02:08:38
無限に並列化可能な処理と仮定するなら、クラスタリングもありかと。
所謂グリッドコンピューティング。

75 :デフォルトの名無しさん:2006/11/25(土) 02:12:36
あと2倍になればいいだけなのにチューニングだとかほざいて
無駄にコードを複雑にしようとしていたボケがいたので
サーバを3倍に増やして終わりにしました。

76 :デフォルトの名無しさん:2006/11/25(土) 02:53:01
ま、そこら辺は完全にケースバイケースだよね。お仕事でやってるならコスト次第。
このスレ的には並列度を上げる方向に収束すると美しいんだけど。

77 :デフォルトの名無しさん:2006/11/25(土) 03:05:17
そんな勝手に方向を決められても。

78 :デフォルトの名無しさん:2006/11/25(土) 12:57:34
>>71
>iccがあれば、並列化も簡単に試せるしね。
体感で速くなったためしがない。

いったいどういう場合に効果があるのか…。

人間が見ればすぐ分かるが、コンパイラの並列可能判定って
どの程度のものなんだろう。

79 :デフォルトの名無しさん:2006/11/25(土) 12:58:54
↑もちろん手動で並列化したら高速化できる状況での話ね。

80 :デフォルトの名無しさん:2006/11/25(土) 13:11:18
>>78
勿論、最低限-parallelは指定しているとして、単純なループなら並列化してくれる可能性はあるよ。
尤も、OpenMPを手軽に試せるという積もりで書いたんだけど。

81 :デフォルトの名無しさん:2006/11/30(木) 20:10:54
Sunコンパイラ最強伝説

82 :デフォルトの名無しさん:2006/12/02(土) 20:35:28
最近、コンパイラの最適化性能比較ってあんま情報ないな。


83 :デフォルトの名無しさん:2006/12/03(日) 21:51:02
すいません、マルチスレッドですか?

84 :デフォルトの名無しさん:2006/12/03(日) 22:42:46
はい、マルチスレッドです。

85 :デフォルトの名無しさん:2006/12/03(日) 23:28:53
あなたを、マルチスレッドです。

86 :デフォルトの名無しさん:2006/12/06(水) 23:09:42
今日は徹夜でpthreadを勉強します。

87 :デフォルトの名無しさん:2006/12/07(木) 01:09:39
こんやは徹夜で、マルチスレッドです。


88 :デフォルトの名無しさん:2006/12/07(木) 11:08:50
それはいいマルチスレッドですね。

89 :デフォルトの名無しさん:2006/12/07(木) 22:25:54
俺はみんながマルチスレッドしたあとでいいよ

90 :デフォルトの名無しさん:2006/12/07(木) 22:29:26
みんないっしょでこそマルチスレッドです

91 :デフォルトの名無しさん:2006/12/07(木) 23:01:07
俺ちょっと疲れたからみんな先にいってくれ

92 :デフォルトの名無しさん:2006/12/08(金) 03:40:09
急激にスレの質が落ちて参りました

93 :デフォルトの名無しさん:2006/12/08(金) 14:50:27
みんなでマルチコスレッドしねぇ?

94 :デフォルトの名無しさん:2006/12/08(金) 21:05:24
JavaScriptの分際でマルチスレッドしてやがる事に最近気付いた。
仕組みどうなってんのよ?

95 :デフォルトの名無しさん:2006/12/08(金) 21:57:49
Javascriptなら中身見れるでしょーが

96 :デフォルトの名無しさん:2006/12/08(金) 22:03:46
ソースの問題じゃなくてCPUがどう処理をこなしているか知りたいんだよな

97 :デフォルトの名無しさん:2006/12/09(土) 00:36:36
並行動作はせんと思うが

98 :デフォルトの名無しさん:2006/12/09(土) 00:59:15
CPU?

99 :デフォルトの名無しさん:2006/12/09(土) 01:01:50
onBlurとonClickで並列処理するよ。

100 :デフォルトの名無しさん:2006/12/09(土) 01:02:26
だめだこりゃ

101 :デフォルトの名無しさん:2006/12/09(土) 01:14:01
<script>
function Test(){
while(1){}
}
</script>

...
<span onclick="Test()">Hello World!</span>


でブラウザ死ぬけど?

102 :デフォルトの名無しさん:2006/12/09(土) 01:18:19


103 :デフォルトの名無しさん:2006/12/09(土) 01:28:07
どのブラウザで?
つかブラウザネタをここでやるのか・・・ヤだなあ

104 :デフォルトの名無しさん:2006/12/09(土) 04:50:27
ここはやっぱり伝家の宝刀 volatileネタを持ち出して本来のスレの荒れ方に戻そうよ。

105 :デフォルトの名無しさん:2006/12/11(月) 10:38:50
Intel C++ Compiler for LinuxでOpenMPを使った並列化をやっているのですが、Intel Thread ProfilerにはLinux版が存在しないので、
暗黙的/明示的なバリア, ループの分割, critical構文等のオーバーヘッドや負荷の不均衡が検出出来ず、いまいちパフォーマンスが伸び悩んでおります。
このような問題を解決できるLinux用のツールは存在するのでしょうか?
それともWindowsに移行するという選択肢しかないのでしょうか?
なんだかレベルの低い質問で慙愧に堪えないのですが、もし誘導や解答をいただければ嬉しいです。

Intel Thread Profiler
http://www.intel.com/cd/software/products/ijkk/jpn/threading/310854.htm

106 :デフォルトの名無しさん:2006/12/11(月) 18:47:00
一昔前だったらまともなスレッドプログラミングしたけりゃSolaris使え、で
片付けられてたような気がするけど私も興味あるので識者の降臨を待つ。
Valgrind(Helgrinid)の他にLinuxで実用に耐えるツールはあるのかな、と。

107 :デフォルトの名無しさん:2006/12/11(月) 19:06:34
とりあえず脳味噌ぶら〜んから適当に検索。
ttp://www.nbrains.net/php/pukiwiki/index.php?link%BD%B8%2F%B3%AB%C8%AF%B4%C4%B6%AD%B7%CF#Debugger
ttp://www.nbrains.net/php/pukiwiki/index.php?link%BD%B8%2F%B3%AB%C8%AF%CA%E4%BD%F5%A5%C4%A1%BC%A5%EB%B7%CF#Profiler

108 :105:2006/12/11(月) 22:40:37
>>106-107
御解答有難う御座います。
わざわざ検索していただいたのに申し訳ないのですが、ちょっとその中には無いようですorz
凹んでいるだけでは何にもならないので、とりあえず"OpenMP"でググって片っ端から有望そうな所を覗いてみました。
結果、Omni OpenMP Compilerにtlogviewなるツールがあることがわかりました。
http://phase.hpcc.jp/Omni/openmp-tutorial/sld049.htm
これを使えば、「iccでOpenMPを使った限界までのパフォーマンスチューニング」は難しそうですが、
「自分のコードの駄目なところ(計算粒度、ロードバランス等)を効率的に見つける」ことはできそうな感じです。
これを使って駄目だったらWinへの移行も検討してみようと思います。

109 :デフォルトの名無しさん:2006/12/11(月) 22:42:55
SolarisがN:Mスレッドモデルをやめたのは効率が悪かったから?

110 :デフォルトの名無しさん:2006/12/11(月) 23:45:55
アプリが1:1モデルを前提に作られる(チューンされる)ようになったから。
アプリといってもぶっちゃけoracleだが。
SolarisのためだけにN:M用チューンするのは時間の無駄だからね。

これを効率というならば効率だね。

111 :デフォルトの名無しさん:2006/12/20(水) 09:58:49
I/.O主体の仕事は前提とかチューンってこととは関係なく、
1:1の方が効率がいい場合が多いでしょ。
CPUを明け渡すのがカーネル内であることが多いから。
だからエンタープライズが主戦場のSolarisでは当然のことかと。

112 :デフォルトの名無しさん:2006/12/20(水) 10:23:41
OSが1:1ばかりになったというのもあるよ

113 :デフォルトの名無しさん:2006/12/21(木) 01:18:13
 そういうことは関係ない。
ちゃんと選んでやっている。

114 :デフォルトの名無しさん:2006/12/21(木) 01:28:43
M:Nはシグナルの動きが1:1のときと全く同じにはならない。
両モードでのデバッグや検証コストを掛けられない。

もう一つは>>112のとおり。
OS屋のオナニーで仕様が決まる時代は終わった。

115 :デフォルトの名無しさん:2006/12/22(金) 22:55:26
マルチスレッドのデバッグではまっています
(私が作ったんじゃないのですが)
beginthreadが50個、EnterCriticaSectionが40個くらい、
スレッド最大200個くらいが動くとんでもないシステムです。
(もちろん満足に動いてないです)

とりあえず、下記の方針でソースをチェックしようと思いますが、
他にもありますでしょうか?

1 InitializeCriticalSection()以前の行に、_beginthreadを呼び出す関数に入ってないか
2 スタティック変数、グローバル変数にEnterCriticalSecitonなしで書き込みを
行ってないか
3 newで作ったオブジェクトのポインタを複数のスレッドで参照してないか

116 :デフォルトの名無しさん:2006/12/22(金) 23:13:58
>>115
問題を正しく特定できてるのか?

117 :デフォルトの名無しさん:2006/12/23(土) 00:10:24
>>116
とにかくアクセス違反で落ちたり、
const変数が書き換わったりするみたいです

もちろんマルチスレッドが原因かは特定できないのですが、
(ただ、ソースを見ると明らかにマルチスレッドを扱いきれてないです)
今、メモリ周りとかいろんな方面から数人で見ています。
もちろんデバッガ使ったりログ吐いたりはしています。



118 :デフォルトの名無しさん:2006/12/23(土) 01:17:19
>>115

あと、EnterCriticalSectionへの再帰がないか。
同一スレッドだと、EnterCriticalSectionの挙動が変わるから注意。


119 :デフォルトの名無しさん:2006/12/23(土) 03:03:16
どれくらいのスパゲッティ度かにもよるけども
仮想的なdbを用意して、データへのアクセスは必ずdb経由にするのも手だぞ。
(ポインタは渡さない、必ず生データのやり取りにする)
少なくとも知らない間に書き換わることはなくなる。
パフォーマンスは落ちるけどな。

120 :デフォルトの名無しさん:2006/12/23(土) 09:02:59
>>118

なるほど、それは知りませんでした。ありがトン!!!!!

>>119

うーん、なるほど。それも覚えておきます。ありがトン!!!
とりあえず、ある程度安定してきたら、
再設計など検討するらしいです。

28 KB
■ このスレッドは過去ログ倉庫に格納されています

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)