憂鬱な午後のひととき


2月27日_
・マウスピース1週間目の検診. 想像以上に強い歯ぎしりらしくてこんなに傷が付いてるのは初めて見たらしい. 穴が空いたら作り直しだとか.
・『仮面の男(鉄仮面の改題)』(アレクサンドル・デュマ 石川登志夫訳)
三銃士の最期を描く. NHKで今やってる人形劇や昔のNHKのアニメと大分雰囲気が違う(てかこっちが本家やけど). アラミスが反逆者になってるし, 人形劇の若くて危なっかしいダルタニアンと違ってこちらは親友と国王の命令との間で悩むし. ポルトスの最期は凄まじかった.
2月26日_
CompView 暗号理論ワークショップ行ってみたかったが, 会議が入っていたのと東横線半分止まってたしでいけなかった. 残念. それにしてもすごい混雑だった.
・女子スケート
帰ってからニュースでやってた. 今回のオリンピックを映像で見るのは初めてだったりする. もっと明るい曲の方がよかった気がするなあ.
偉大なる折田先生
今年のキャラは知らない. ピカチュウな分かったけど.
2月25日_
男女共同参画の話を聞いた. ああいうのはトップが動かないと駄目らしい. "育児"も大事だけど10年後に訪れるであろう"介護"の問題も視野にいれないとあかんというのは盲点だった. ちょうど男性の同僚が育児休暇を取得しているけど, そういうのはまだまだ特別ケースなんだろうなと思った.
2月24日_
VC2005の頃からひそかに拡張されていた範囲ベースのforはfor each (int x in v)とう形で C++0xのはfor (int x : v)なんやよね. VC2010RCでもC++0x形式はエラーになっちゃうけど直すんだよなあ. せやないとVC6のforの変数のスコープが古い仕様のままだったような悪夢の再来になってしまう.
#include <stdio.h>

int main()
{
    int a[] = { 1, 2, 3, 4, 3 };
//    for (auto x : a) { // C++0x
    for each (auto x in a) { // VC10
        printf("%d\n", x);
    }
}
2月23日_
第三回カーネル/VM探検隊
なかなかマニアックなネタが揃っていた. 最後まで聞いてみたかったが, 最近寝るのがやたら早いし, みんなLTで5~10分といいつつ結構長く話すので諦めて10時前に帰ってしまった.
sexyhookをちらっと見てみた. 引数の数に応じてマクロを定義してるけどこれは
#define SEXYHOOK_API_HOOK_BEGIN(DLL,RET,NAME, A) \
SEXYHOOK_API_BEGIN_LOW(__LINE__) \
typedef RET (WINAPI * HookDef)A; \
const char * getHookDllNameFor(){ return DLL; } \
const char * getHookApiNameFor(){ return SEXYHOOK_LINE_TOSTR(NAME); } \
static HookDef * getOrignalAPI(){ static HookDef orignalAPI; return &orignalAPI;} \
static RET WINAPI HookFunction A
とやって
 SEXYHOOK_CLASS_HOOK_0_BEGIN(int,Child::g)
  ↓
 SEXYHOOK_CLASS_HOOK_BEGIN(int,Child::g, ())

 SEXYHOOK_CLASS_HOOK_1_BEGIN(OpClass,OpClass::operator +,const OpClass& x)
  ↓
 SEXYHOOK_CLASS_HOOK_BEGIN(OpClass,OpClass::operator +,(const OpClass& x))

 SEXYHOOK_FUNC_HOOK_2_BEGIN( int, SEXYHOOK_CDECL, mul<int>, const int& a , const int& b)
  ↓
 SEXYHOOK_FUNC_HOOK_BEGIN( int, SEXYHOOK_CDECL, mul<int>, (const int& a , const int& b))
と使えばすっきりですね.
2月22日_
・今日は2の日だ. 電車の人は切符を買いに行ったりするのだろうか.
なんとっ!? ビットパターンはどうなってるんだろう? ah/al/bh/bl/ch/cl/dh/dl でもう8個だし。
下にちょろっと書いたように, 64bitモードではr8~r15のレジスタが追加されてそれを表現するためにrexプレフィックスが登場しました. で, 64bitレジスタはrax, rbx, rcx, edx, rdi, rsi, rbp, rsp, r8, ..., r15, 32bitはeax, ebx, ..., r8d, ..., 16bitはax, bx, ..., r8w, ...となってるので8bitでもal, bl, .., となって自然にrdi, rsi, rbp, rspの下位8bit dil, sil, bpl, splが割り当てられたのでしょう. だからrexなしのahたちとは同居できなかったりします. つまりmov al, ahやmov al, silはOKだけどmov ah, silは存在しません(ahを表すにはrexがあってはならず, silを表すにはrexがある必要があるため).
この仕様, 「だからx86/x64は…」と言われそうだな.
2月21日_
Float → Double の代入を行って「誤差が発生する」ケースってどんなのでしょうか?
仮数部のビット数は Double のほうが多いし、基数も同じだから特に問題になるような 「変換」は起きないような気がするんですが。
単にdouble→floatの書き間違いだったりして.
それはともかく, 誤差が発生することは無いのは正しいのだけれども, x86のFPU/SSEにおいては「すべてのfloat xに対してbinary表現が(float)(double)x == x」とは限らなかったりする. SNaN(0x7f800001以上0x7fc00000未満のbinary表現で表されるfloatの値. 最上位bitが立っていてもいい)に対してcastするとQNaNになる(0x00400000のor値になる)のでその範囲では異なる. まあ普通は恒等写像と思っておいて問題ないんですが.
2月20日_
歯の定期検診に行ったら, 寝てるときに強くかみしめてるのか結構歯がすり減ってる部分があるらしい. 肩こりとも関係あるかもしれないのでマウスピースを作ってもらった. なんとなくがっしりしたものをイメージしてたけど透明のビニールで厚さ1mmもない薄いものだった. それでもはめてみると意外と邪魔な感じ. これで多少は楽になるのかな.
2月19日_
pmovmskbはバイト単位の文字列処理なんかで使いますね. たとえば昔書いたfast strlen and memchr by SSE2
esiとかの下位8bitは64bit拡張のrexプレフィックスがついたせいで自然に使えるようになってしまったというところですかね.
2月18日_
いまどきじゃないアセンブラプログラミング
>気になるパフォーマンスは約1.15倍速
2^28要素のfloat配列ということは1GB x 2(src/dst)readして1GB writeだからメモリアクセスで律速だろうなあ. 数KBでのデータなら気持ちましな結果になるのでは. あとXbyakの紹介ありがとうでした.
2月17日_
「紅白梅図屏風」:「金泥」ではなくやはり「金箔」?
2003~2004年頃, その屏風には金箔は使われていなかったという説があって, 以前NHKの番組をみた(cf. あの国宝はだまし絵だった!?). とても面白かったけど, 実は実は, 金箔は使われていたという可能性が高いそうな. 番組の続編も期待したい.
2月16日_
ようやく首の痛みがましになってきた. 今回は本当に酷かった.
Xbyakのローカルラベルの扱いにバグがあったので修正(今回初めてその機能を使って発覚).
fmathの更新. SIMD版の__m128 exp_ps(__m128), __m128 log_ps(__m128)を追加して若干の最適化. 上記最新版Xbyak入れてFMATH_USE_XBYAKを定義して使って下さい(ちょっと速くなる). 64bit Windows版の__m128 exp_ps(__m128)を作るのにはまった. __m128はレジスタ渡しではなくptr [rcx]経由なのか? あとxmm6以降自由に使えないのが不便. そのせいで数割遅くなっちゃうんだけどやだな.
あと, 今回のケースではminps, maxpsは遅くて使えないことも理解した. 結局範囲外は特別扱いすることにした.
も一つ, SSE4.1で登場したpextrdとかってたいして高速というわけではないんだな. movd + psrldでいい.
2月7日_
先週から首と肩の痛みが酷くて困る. 今までの肩こりと違って横になると起きるときに頭を持って首を固定しないと痛くて起き上がれない.
2月6日_
gccで-msse4つきで_mm_cvtsi128_si32()を使うとmovdではなくpextrdが使われてしまう.
% cat t.c
#include &lt;xmmintrin.h&gt;
int main(int argc)
{
    return _mm_cvtsi128_si32(_mm_cvtsi32_si128(argc));
}
% gcc t.c -S -O3 -msse4 -fomit-frame-pointer && cat t.s
main:
        leal    4(%esp), %ecx
        andl    $-16, %esp
        pushl   -4(%ecx)
        pushl   %ecx
        movd    (%ecx), %xmm0
        popl    %ecx
        pextrd  $0, %xmm0, %eax
        leal    -4(%ecx), %esp
        ret
-march=core2もつけるとmovdにしてくれるけどなんでそうなってるのかわからない(-march=k8やamdfam10でもpextrd). pextrdなんてSSE4.1(と一部のcore2)でしか使えないし, 使えたとしてもmovdの方が速いんだから常にmovdでいいのに. というかintrinsicなのに勝手に命令を変えないで欲しい. バグじゃないのと言ってみたけどrejectされた. いまいち納得できない.
で今更ながら気がついたのだけど, gccではcpuidに応じてSIMD命令を切り換えるプログラムを書くには実装を分割してそれぞれのコンパイルオプションを変えるしかないんだな. めんどくさ. ヘッダのみのライブラリを提供するのは不可能だ.
2月5日_
『白夜』(ドストエフスキー 小沼文彦訳)
ひきこもりの妄想青年が一目惚れした女性に振られる話, と言っちゃっていいのか分からんけどまあそういう話. 殆ど初対面の女性に延々と自分を語りだす(10ページ以上! 全部で100ページしかない短編なのに)のは危ない気がする. 女性も一緒になりましょうみたいなこと言っててさくっと振るあたり恐ろしい.
2月4日_
公開鍵暗号の数理最終回
全部で7日間. これだけまとめて系統だって暗号の話を聞いたのは初めてで非常に勉強になった. それ系の論文も大分読みやすくなるんじゃないかと思う. 毎日いかせてもらえたのもありがたかった.
2月3日_
『後宮小説』(酒見賢一)
壮大なほら話. ヒロインの(というか全編に漂う)とぼけぐあいがなかなかよろしい. ほら話と言えば井上ひさしの『新釈遠野物語』(結構お気に入り)や『吉里吉里人』も楽しい.

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