憂鬱な午後のひととき


1月31日_
事務方の送別会で夜ご飯が油ものだったので, いつもより少し多めに7km走る. 帰宅中, ちょっと考えごとしてたら道を間違えた. 眼鏡を掛けてないからよく見えない. 夜分にキョロキョロと怪しい人になってしまった.
1月30日_
FPUの演算例外を設定するなら同時にSSEの設定もしないとねって書いてたが, VC2005だと __control87_2というのがあってアセンブラを使わなくてもこれで設定できるようだ.
ところでPentiumDでldmxcsrを使うと目茶苦茶遅くなる(500クロックぐらいかかる?)感じなんだが, うちのところだけなんやろか. 単体で測るとそんなに食ってないみたいなのにアプリの中で使うと遅くなる. 何故?
1月29日_
産む機械
「わかりやすく説明しようとした」らしい. お見事. わずか4文字で彼の女性観を如実に表現している. 並の人間にできるこっちゃない. 昨晩見たときは速攻で辞任かと思ったがそのつもりはないらしいね.
1月28日_
ものづくり展」が目的で上野の国立科学博物館へ. が, しかし同じく展示されていた「シアター360」に吸い込まれる. 全く前知識無しで見たのでもの凄い衝撃を受けた. 自分がびゅんびゅん飛んでるよ~. これでラピュタのリメイク見たい.
毒気を抜かれながらも目的の展示場へ. 鋳型を作る新しいアイデアとか, 表面加工で変わる音色とか, 機械は20ミクロンの精度なのに人間がやると2ミクロンの精度(だったと思う)とか, 面白いことたくさん. 工事中のせいか, 会場の案内が分かりにくかったのは少し気になった.
機械式連立方程式計算器のパネルの背景に使われていた数式は明らかに中学生レベルの数学が分かってない人によるデザイン. 情けない.
1月27日_
昨日は, あまりに緊張して頭が真っ白, 散々な結果だった. そんな時でも, 同時に自分ってこんなに緊張するんや, 知らんかった, こりゃあかんやんと驚いて観察してる第三者的自分がいてたり.
1月25日_
・「心のままに,荒野を行け」(仕事の流儀)
よくもまあ, ああいう生活を20年間も続けてるなと驚愕. 「プロフェッショナルとは」に対する返事もシンプルだけど覚えておきたい.
・↓本当はやってません. なんてったって大人だしさ(C)るきさん.
1月24日_
結婚披露宴の返事. すんません, 一度やってみたかってん.
1月23日_
式を計算するXbyakサンプル追加. boost::spiritとの共演(狂宴?).
1月22日_
昨日のバグは, 定数しかない場合のアドレス生成ミス. これ作ってる時は当然1命令ずつ正しいかのテストやアドレス生成全パターンのテストを書いてチェックしてるのやけど, これだけ外した. 正確に言うとテストには入ってて, エラーすら出てたにも関わらず, 自分の勝手な思い込みで黙殺してた. 駄目駄目やん.
1月21日_
・「来週のテーマは身近に潜む捏造の罠」--- あるある大事典III
捏造は論外だが, 見る側の科学的なものの考え方を啓蒙することも大事だろう. 最近の子供の科学嫌いがよく伝えられるがその親や周辺が駄目なんじゃなかろうか. つくば万博(1985年)の頃の科学万能感は行き過ぎだったかもしれないけど(それでもあの高揚感は好きだった), バブル崩壊後あたりから科学に対する冷たい視線が増えた気がする. そのくせ似非科学には振り回される. 以前のこんな記事も根は同じ.
センター試験のリスニングだって50万人が受けるなら「1個も壊れない」を保証するのはあまり現実的でない. 95%の確率で1個も壊れないためには1000万個に1個しか壊れない精度, 99%の確率を望むなら2億個に1個だ. それぐらい小学生か中学生の確率の計算で分かる. だから実施側も障害を前提に再テストの用意をしている. マスコミが伝えるべきは, それでもなお「公平性」を要求するならいくらの予算が必要か, あるいは実施を諦めるのかの判断材料だと思う.
Xbyakバグ修正
1月20日_
電子ピアノに付属していたヘッドホンが壊れたので代わりのものを購入. 家で使うからノイズキャンセリングは不要. できるだけ軽く, 圧迫感が無くてよい音がでそうなもの, そこそこの値段としてMDR-D66を選択(7千円). ヘッドホンにしろ, イヤホンにしろ, 今まで付属品しか使ってなかったのでその違いに驚く. アパートだと常時ヘッドホンで使わざるをえないから, 今まで実にもったいなかった.
Xbyak入門者向け説明加筆.
1月19日_
鞄から手袋を出そうとしてうっかり携帯電話を落としてしまった. 記憶にある限り多分初めて. 下がコンクリートだったが, ちょっと傷ついたぐらいでなんともない(今のところ). これだけ普及しているものだから少々の衝撃で壊れてちゃいかんのだろう. パソコンも最近は落としたり水に濡れたりしても大丈夫というのが増えてきている. より一般に普及するための次のステージに来てるということか.
1月17日_
実際のところ, 量子化に適用するとどうなるのか試してみた[quantize.cpp].
    Quantize(const uint32 qTbl[64])
    {
        push(esi);
        push(edi);
        const int _P = 4 * 2;
        mov(edi, ptr [esp+_P+4]); // dest
        mov(esi, ptr [esp+_P+8]); // src
        for (int i = 0; i < N; i++) {
            udiv(qTbl[i], i * 4);
            mov(ptr[edi+i*4], eax);
        }
        pop(edi);
        pop(esi);
        ret();
    }
上記関数は
void quantize(uint32 dest[64], const uint32 src[64],
              const uint32 qTbl[64])
{
    for (int i = 0; i < N; i++) {
        dest[i] = src[i] / qTbl[i];
    }
}
と同値だが最適化されたコードを生成する関数.
udiv(uint32 dividend, int offset)は以前から何度か書いてるのを少し修正したもので, eax = [esi+offset] / dividendを計算するコードを出力する関数(なんかくどい(^^;). 今回はべたっとN(=64)回ループ展開をした. やってみると速くなったり遅くなったり. C版の5~10倍!速くなるときもあれば0.8倍ぐらいになることもある. いろいろためしてみると, どうやらcodeとdataのアドレスに何か関連があるっぽい. キャッシュがおかしくなっちゃうのかな. とりあえずコード領域をnewしてずらしてみると大丈夫なようだが確信なし. なんか微妙.
xbyak.hの319行目のdoAllocを0にするとstackからとるようになり, 遅くなることがあった.
1月16日_
Xbyakの専用ページを作った.
1月14日_
略称は数解研.
え, そんなの一度も使ったことないし聞いたことも無い.「数研」か, せいぜい「数理研」だったぞ. 世代が違うのか?
1月13日_
NHK紅白の余波
それがタブーの国ならともかく, ハレの悪ふざけぐらいで苦情の電話するなよなあと思う(私も, 最初見たときは何やってんやとびっくりしたが). 「子供への影響」というなら, ろくに挨拶もしない派遣や, 大人のいじめや, 自分勝手で幼稚な大人ばかりのドラマの方がよっぽどどうかと思うが. 今後, 出演者に覚書やら念書が必要になれば, 生放送から意外な演出の可能性を減らすことに加担したのは視聴者だ.
1月12日_
台所の蛇口も漏れていたので同時に直してもらう. が, 生産中止で部品も無いらしく, 結局丸ごと交換することに. ところが, その蛇口がとれにくい構造だったりして大変.
「ああ, シンクごとどけないと交換できませんね」
「えっ」
「いや, 簡単ですよ, …, あれガスコンロのところまで一体型ですね. 全部どけないと」
「げっ」
という訳で, 急遽, お鍋やガスコンロや食器などもろもろ退避, 空っぽになったところで横1.7mのキッチンを二人で動かす(持ち上がるのだ!). どけると, 施工の手抜きさ加減がよく分かる. 壁歪んでるし. 排水口の穴の隙間からゴキが入ってくることがあるらしい. 後でテープで目張りしとこ.
1月11日_
Xbyak技術野郎の復讐の付録ネタ. yを与えると, 関数 f(x) = x + y を返す関数を作る.
struct AddFunc : public Xbyak::CodeGenerator {
    AddFunc(int y)
    {
        mov(eax, ptr[esp+4]);
        add(eax, y);
        ret();
    }
    int (*get() const)(int) { return (int (*)(int))getCode(); }
};
    ...
    AddFunc a(3);
    int (*add3)(int) = a.get();
    printf("3 + 2 = %d\n", add3(2));
当然add3の中身は
    mov    eax, dword ptr [esp+4]
    add    eax, 3
    ret
Binary 2.0的解決. いや, そんなことよりも関数ポインタを返すメソッドのconstをどこに書くのかしばらく迷った.
1月10日_
やっとこさ壊れた給湯器の修理に来た. 「ふざけんな, こんにゃろ, はよ来んか, なんとかかんとか」と言おうと思ってたが, しんどいのでたいして言えんかった. 夜シャワー浴びて栓を締めたら水がちょろちょろ止まらない. なんなんだ一体. ええかげんにしてくれよ….
1月8日_
一昨日, 折角友達やまるまるとした赤ちゃんに会ってたのに途中から嘔吐感が酷くて, 昨日, 今日とへたれ気味. みなさんも気いつけて.
1月5日_
・って, もう5日かよ. この1週間, コーディング三昧だった. こんなに集中したのは久しぶり.
・制御レジスタをいじらずに浮動小数の値を負の無限大に切り捨てるにはどうするのが一番速いだろう.
1月4日_
とりあえずxbyak ver. 1.00を公開. 途中で疲れてぐちゃぐちゃなので中は見ないで. 一息入れて綺麗にしなきゃ. その前にまずは自分で遊んでみないとな.
しかし, 2000行以下なのね. 意外とコンパクトだ.
1月3日_
IA32命令をひたすら実装中. 今日, はまったところ.
    push dword 2
    push word 2
でスタックはそれぞれ4, 2バイト減るが,
    push byte 2
ではスタックは4バイト減る. 言われてみればそらそうなんだけど.
1月2日_
漸くMMX/SSE~SSE3部分完了. 汎用レジスタはとりあえず使用頻度の高いものだけ用意するにしても莫大になりそう. さて, 分岐はどう実装しようか.
1月1日_
JITアセンブラ, MMX/SSE周りぐらいは楽だろうと思ったら例外が多くて繁雑. 命令名のサフィックスとバイナリのプレフィックスぐらい統一してくれ. Intelのマニュアル自体, 時々間違ってるし. テストも同時に作ってるが面倒過ぎる. 改めてこんな複雑怪奇なフォーマットをGHzオーダーでデコードし, RISC命令に分割するIntel, AMDは偉大だと思った.

御意見は光成滋生<herumi@nifty.com>までお願いします