あけましておめでとうございます

去年もたくさん見てもらってありがとうございます。コメントくださった皆様にも大変感謝してます。今年もどうぞよろしくお願いします(^^)
コメントでいいアドバイスをもらったのに手を付けれてないことがいろいろあって、それが心残りです。今年はフットワークを軽くしたいなと、それはつまり自分の処理能力を上げていきたいなと思います。ってちょっと難しい目標だなぁ(^^;
新年早々、抽象化とか凝集度とか再勉強中。.NET のようなきれいな設計を目指したい!

納得いかないこと

こんばんは、siokoshou です。世の中、納得いかないことは多いものですが、今日も一つ納得いかないことが増えてしまったので聞いてください。

\frac13 = 0.3333...
は、おk。じゃあ、両辺に 3 を掛けると
3 * \frac13 = 3 * 0.3333...
よって、
1 = 0.9999...

エェェー、納得いきません!

こちらの本からのネタでした。おもしろいです、コレ。

数と計算の意味がわかる―数学の風景が見える

数と計算の意味がわかる―数学の風景が見える

ちなみに、Windows の電卓で 1 / 3 = して、次に * 3 すると?お試しを。

nop は遅い

あ、もう一つだけ。さっきの gcc のスレッドにまだ続きがあって、強烈におもしろかった。なんで nop で埋めないの?って質問があって、その答えが nop じゃ遅いだろ JK みたいな回答がw

たしかに nop を何バイトも埋めたらデコーダと実行機の数にもよるけど、数サイクル浪費しますね。対して何もしなくて速くて長い命令が上で書いた lea ってことだそうです。nop 遅いって、すごい世界だw いつか nop おせーよとか言ってみたいw やっぱりコンパイラはすごい!

eiz レジスタ?

さらに続き。
もう飽きてきたころに、なんで C のほうが速いんだろうってことで objdump で逆アセンブルしてみたときに見つけた変なレジスタ

4017a5:	8d 74 26 00          	lea    0x0(%esi,%eiz,1),%esi
4017a9:	8d bc 27 00 00 00 00 	lea    0x0(%edi,%eiz,1),%edi
4017b0: ...

Intel形式なら lea edi, [edi + eiz + 0] でしょうか。

eiz レジスタ?ぐぐってみると Add fake index registers, EIZ/RIZ, to x86 assembler/disassembler. だそうで、フェイクらしい。命令フォーマットを読み解いてみると、8d が LEA のオペコード、ModR/M が 74 なので デスティネーションが esi、SIB が 26 なので esi + none、ディスプレースメントが 0。というわけで、インデックスレジスタの指定なしを表してるようです。

さらに、この2つの命令は実行しても何も変わりません。CPU時間を食うのと、スペースを食うだけです。 gcc で -O3 をつけてコンパイルした結果なのになんでこんなのが挟み込まれるのかと思ったら、http://gcc.gnu.org/ml/gcc/2007-03/msg00817.html によるとアラインメント調整だそうです。なるほど納得。命令フェッチが16バイト境界に揃ってると有利とかなんとかありましたね。この2つの命令の次のアドレスがきっちり揃っています。

アセンブルしたコードを見てみると、あちこちにこの命令のバリエーションが挟み込まれています。上の例でも 4byte と 7byte の2つがありますが、ほかに 3byte (8d 76 00 lea 0x0(%esi),%esi)、6byte (8d b6 00 00 00 00 lea 0x0(%esi),%esi) もありました。一つだけ使ったり、上のように二つ並べたりしてます。
いずれも次の命令がきっちり 16byte 境界に揃っていました。ジャンプなどの飛び先を 16byte 境界にそろえているようです。

でも、必ずしも飛び先アドレスが 16byte 境界にそろってるわけでもないので、飛んだ先に十分な命令があれば調整しないとかしてるんでしょうかねぇ。まあ、とにかく、コンパイラには私はかないそうもないとわかりましたw

以上、アセンブラな記録はおしまい。

あこがれの cmov を使ってみた

前のエントリーの続き。
パイプラインの長い現代 CPU の敵はジャンプだ!ってことでジャンプを cmov 命令(条件 mov)に置き換えてみたんだけど、逆に遅くなってしまいました。cmov にあこがれてて、いつか使ってみたいと思ってたのにガッカリした!! やみくもに使ってもうまくいくわけじゃないんですねぇ。

今日だけ x86 とアセンブラな記録

こんばんは、siokoshou です。忘れられない CPU 命令は eieio です。
最近 x86 アセンブラがマイブームです。 x86 に詳しくなかったんですがインテルのマニュアルと古い本を何冊か読んでちょっとわかってきました。で、ネットをふらふらしてたらおもしろそうなネタが転がってたので、高速化にチャレンジしてみました。もっと速いコードが示されてるので実用的な意味はありませんが(^^;

続きを読む

難問解決

国立情報学研究所の先生が型付きラムダ計算についての難問を解決したそうで。未解決問題22問のリストがあって、このリスト中の問題解決は世界初だって。スゲー!

型付きラムダ計算の未解決問題集
http://tlca.di.unito.it/opltlca/

一問目は 1958年 Haskell Curry 由来の問題!はぅ。
Problem # 5 にある、分数みたいな表記法の意味が知りたいです。こないだの「プログラム意味論」にもこの表記が出てくるんですが、なんの説明もなくてこれが何を意味しているんだかさっぱり…。まあ、何から何まで難しい本でした…