yarv-dev:359
From: SASADA Koichi <ko1 atdot.net>
Date: Tue, 7 Dec 2004 13:52:58 +0900
Subject: [yarv-dev:359] Re: Stack caching
ささだです。 MAEDA Atusi wrote: > SASADA Koichi <ko1 atdot.net> writes: > > >> はて、なんででしょうか? ほんと全然見当が付きません。 >> >> あとは、Intel CPU のマイクロ命令への変換の過程でどうの、くら >>いしか思いつきません。つまり、利用するローカル変数が多いと >>Intel CPU は遅くなるとか? > > > 何が起きてるのか測れないですかねえ。Performance-Monitoring Counter > (PMC)使って。MSRだっけ。 VTune で、そいつらを使った計測が簡単にできます。 で、VC版 の結果を見てみたところ、retire 命令数は SC 版のほう が小さいのですが、indirect jump における misprediction の数 が、SC 版のほうが多かったです。 コンパイル時に吐くアセンブラを見ても、そんな要素はなさげだと 思ってたんですが、もしかしたら、そのアセンブラリストからさらに 最適化かけてるのかもしれません。 dumpbin で逆アセンブルしてみるのも手なんですが、でかすぎて、 せめて行番号くらい出してくれないと読めません。なんかいい手ない ですかね。 ---- gcc 版のほうですが、マシンを再起動したら SC ありのほうが速 かったです。いったい何が起こったんだろう。目の錯覚(ただのミ ス)ではなかったと思いたいんですが、はて? で、首藤さんに言われてスタックキャッシュのための変数を register VALUE reg_a asm("esi"); みたいにしたら、もうちょっと速くなりました。 > cygwin/gcc 3.3.3 > yarv 1.782000 0.000000 1.782000 ( 1.796000) direct threaded / SC > yarv 2.000000 0.000000 2.000000 ( 2.009000) direct threaded / SC なし > yarv 2.562000 0.000000 2.562000 ( 2.588000) switch/case / SC あり > yarv 2.875000 0.000000 2.875000 ( 2.918000) switch/case / SC なし register VALUE reg_a asm("esi"); register VALUE reg_b asm("edi"); を指定すると: > yarv 1.640000 0.000000 1.640000 ( 1.719000) direct threaded / SC > yarv 1.703000 0.000000 1.703000 ( 1.735000) direct threaded / SC なし > yarv 2.468000 0.000000 2.468000 ( 2.483000) switch/case / SC あり > yarv 3.062000 0.000000 3.062000 ( 3.102000) switch/case / SC なし 素ruby > ruby 15.468000 0.000000 15.468000 ( 15.533000) ちなみに、 register VALUE reg_b asm("edi"); みたいな指定は VC では無理ですかね? -- // SASADA Koichi at atdot dot net // -- ML: yarv-dev quickml.atdot.net 使い方: http://www.atdot.net/~ko1/quickml
354 2004-12-07 09:50 [ko1 atdot.net ] Stack caching 355 2004-12-07 10:10 ┣[ko1 atdot.net ] 356 2004-12-07 10:46 ┣[shudo computer.org ] 358 2004-12-07 13:43 ┃┗[ko1 atdot.net ] 357 2004-12-07 10:57 ┗[maeda-yarv atusi.org] -> 359 2004-12-07 13:52 ┗[ko1 atdot.net ]