Entries from 2008-04-01 to 1 month
native の 20-40%の速度が出たらしい ソフトウェアで実装される VM では命令のフェッチとデコード(実行ルーチンへのディスパッチ処理)がそのまま実行のオーバーヘッドになる これらはネイティブコードにはない固有の処理である 実行する命令数を減らす(ル…
pass2(最適化フェーズ)でnamed let または letrec のような local クロージャの call をループ(jump)に変換するときに、その jump がもっとも内側の let の境界を越えてしまいスタックフレームが壊れるバグに遭遇。 pass2 は Gauche のものをほぼそのま…
pass3/$call で embedded のときに args のコンパイル引数の frees が frees-here であるべきバグを修正した。(r5236) このバグも調べるのが大変だった。
ビューティフルコード 4/23 発売か。
ko1さんにすすめられていた論文が無料で読めるらしいので読んでみた。 こんな濃い内容の論文が日本語で無料で読めるのはありがたい。 命令融合やるかなあ?その前にもう少しコードを見直そう。
部分継続とかテンプレートで遊びたいとか、あの論文読みたいとかあるが、ぐっとこらえて今やるべき事をやる。 僕は不器用なのでいろいろやると、全部身につかず終わるからなあ。
まとめは2行だが調べるのは時間がかかった。 $call の find-free で proc -> args の順序で free variables を探していたが良く考えるとこれはまずい。 評価されるのは args の方なので args -> proc の順であるべき。根深いバグになりそうなのでメモ。
以前は push 時にスタックオーバーフローをチェックしていたが、パフォーマンス上 call 時にチェックしたほうが速い(らしい)ので実装。手順は コンパイル時:コンパイル時に各コード片のスタック使用量を計算しコンパイル結果に反映 コンパイル時:CLOSURE…
妻のメッセンジャーでの一言「がんばってバグれ!!!」。 言いたいことは何となく分かるw。
「USBキーボード ウルトラナビ付」のトラックポイントを有効にしつつタッチパッドは無効にする方法を探していたところ 昨日コメントで id:elimさんと通りすがりさんに教えていただきました。 ありがとうございます。 うまくいったのでその方法まとめておきま…
論文を読んだので方針を決めたいところ。 読んで学んだのが「無視できないディスパッチのコスト」を考慮しなければいけないということ。 threaded コードは既に実施済みなので、命令の合成が効果的が高そうであるということがよく分かった。 少なくとも論文…
fread の第2引数と第3引数を間違えてはまりました。 光成さんによれば「VCだとfread( と入力した時点でプロトタイプヒントがでるから間違えないよ」との事。Emacs にもこういうのありそうな気がするんですが、良いのがあったら教えてください
無効にしたい。
http://practical-scheme.net/wiliki/wiliki.cgi?c=s&key=%sR6RSの調べ物で良く使わせていただくので簡単に検索できるようにFirefox のキーワードブックマークした。 Wiliki の検索フォームは POST なのだけど GET で使って良いのかな?まずかったらやめます…
今日中には終わらなかった。無念。
昨日の発見を教訓に多く呼ばれる命令を gcc -S を眺める。 多く呼ばれる命令 Top 5 の gcc -S を眺める PUSH スタックオーバーフローのチェックがやはり長いですね。 それ以外は想定通り。 CONSTANT 問題無し。 REFER_LOCAL 問題無し。 REFER_FREE scheme::O…
Inconsistent handling of letrec internal define と letrec がよく分かっていない人は読むと良い。 Call for Participation: S3 Workshop on Self-sustaining Systems (S3) 2008 Self-sustaining がよく分からないな。あとで調べる。
PUSH 命令やスタック参照を速く出来ないかと考えたところスタックポインタを本当にポインタにすることを思いつきました。 今までは VM が Gauche 「でも」書かれていることを考慮してスタックポインタ sp は stack 配列の index として機能していました。 つ…
昨日スタックオーバーフローのチェックの話を書いたところ、ささださんと shiro さんから「PUSH 時ではなくて CALL 時にチェックすれば良いのではないか?」と教えていただきました。 つまり コンパイル時にそれぞれの call が最大で消費するスタックの量を記…
Continuation Fest 2008 に行ってきました。 会場には早めについた。入り口のところでささださんに「来るとは思わなかった」と言われる(ぉ。 アカデミックな感じでアウェー感がただよってる(笑)。 所属を書いたネームプレートは大学ばかりだ。胸を張って…
Gaku さんに指摘された件。 命令列の終端に達しているか?を毎回チェックしているが重そうだよねえという話。 確かに僕も気になっていた。これを番人形式にすれば速いのではなかろうか。 ただやってみるのではなくてアセンブリのコードを眺める。 その後にど…
mumurik 氏による連載(今後も続くようです) 本人はパフォーマンスチューニングについては詳しくないと謙遜されていましたが僕より明らかに詳しいし経験もあるみたいなので無理やりお願いしてまとめていただいています。 場当たり的なパフォーマンスチュー…
Mac OSX でビルドできるようになったみたいです。Gaku さんに感謝。
さて未だに「何をどう変えたら、どのくらい速くなるか?」などの感覚は得ることは出来ていませんが、計測の重要さは分かってきました。 そこでベンチマークスクリプトを書いて簡単に計測結果を日記貼り用出力に変換するところまで面倒を見ることにしました。…
目に留まること PUSH,CONSTANT,APPLY,REFER_FREE,REFER_LOCAL0 が多い DISPLAY 重い APPLY 重め 繰り返しで多いもの 引数を参照して次の手続きの引数として PUSH 引数としてPUSHしたものをすぐに参照 当たり前だけど PUSH が多い 回数は少ないが BOX が重い …
入力は UTF-8 前提ですが uri decode が動きました。 コードが不完全なのはあとで直すとしてとにかくうれしい。 なぜうれしいかというと R5RS の範囲では uri decode を書くのは、無理なのだけど R6RS では書けるから。 BinaryInputPort, TextualInputPort, …
ELS'08 news: programme published, registration, and more...
fib(26) における実行命令総数比較。 Gauche 自前 2811342 3435386 これはちょっと差がありすぎですね。 (define (fib n) (if (<= n 2) 1 (+ (fib (- n 1)) (fib (- n 2))))) 自前。 #(CLOSURE 38 1 #f 0 0 REFER_LOCAL0 1 PUSH 2 CONSTANT 2 4 BRANCH_NUMBE…
Scheme/L.VMを作る/12.コンパイラ高速化/fib(26)の計測データのGakuさんがまとめてくれたデータを見るといろいろ分かることがある。 大半の命令の実行速度は変わらない 実装レベルでは結構処理が違うのにも関わらず もしかしたら合成命令にしても元の命令た…
Gakuさんがいつものように僕の議論の相手になってくれ、shiroさん、ko1さん実体験に基づきコメントしてくれる。 なんという豪華なメンバーに支えられてるんだ。ありがたい。 追記 ko1さんのフォロー。 http://www.atdot.net/~ko1/diary/200804.html#d11