憂鬱な午後のひととき


9月30日_
小次郎さん(BBS:1550)
ところで、b < a以外にaとbに条件がありますでしょうか。
あ, すいません. コードから予想できると思いますが a < Q * 4 が抜けていました. あと s == 16 固定とかでもよいです.
一番効果があったのが、「*2」を和にしたことだったという始末でした。
そうなんですか. 私もチェックしてみます. この程度の形なら lea/add/shl を適切に選択してほしいものです.
#昔のCPUならlea, 最近ならaddとか.
9月29日_
↓クイズの続き
下記コードの図形的な意味は以下の通り.
まず直角二等辺三角形の斜辺の中点から縦横に線を延ばして縦横半分の二つの三角形と正方形の三つに分割. 更にその正方形の半分の正方形を右上にとる.
与えられた点(a, b)が右下の三角形の中にあれば左上に平行移動, 真ん中の小さい正方形にあっても右上に移動. 左上の三角形にあれば全体へ2倍(+α)拡大. 残ったL型の部分の領域にある点なら終了. これを繰り返す. 与えられた点が最終的にL型のどこに移動するかを知りたい(下記コードはそれに付随する量, 本来は座標やループ回数も知りたい). プロファイラによるとこれが7割も食っている. 私はループを使わずに計算したいと考えた.
9月28日_
・ここ数カ月間, 20k行のくずコードを3k行に, 8k行のデーモンを80行の関数にし, 8k行だったドライバも今日0.6k行になって一段落, と思っていたのにまだ10kほどあったのが発覚. もう無理, 悪いけど. 流石に力尽きた.
・気分直しにちょっとしたパズル.
下の関数は今年頭ぐらいにいじった某エンジンの中で重たかった部分をずっと簡単にしたものなんですが, これを速くしたい.
int calc(int a, int b, int s)
{
    const int Q = 1 << s;
    const int Q2 = Q * 2;
    const int Q3 = Q * 3;
    assert(b < a && a < Q * 4);
    int n = 0;
    for (;;) {
        if (a < Q2) {
            n = n * 2;
        } else if (b >= Q2) {
            n = n * 2 + 1;
            b -= Q2; a -= Q2;
        } else if (b >= Q && a < Q3) {
            b -= Q; a -= Q;
        } else {
            break;
        }
        b = b * 2;
        a = a * 2 + 1;
    }
    return n;
}
値の分布はこんな感じでフラクタルな三角形っぽい. ありゃ, (自分なりの)答えは持ってるけど導出過程がさっぱり思い出せない.
9月27日_
・C. ぼんやり説でも選びたい
今朝の朝日新聞の書籍広告内のチャート. yes/noが薄い緑と赤という視覚的に分かりにくい矢印のデザインもどうかと思うが(どちらか破線にするとかすればよいのに), 性善説/性悪説の場所から矢印が3箇所でてるような.
・一難去ってまた一難
でかVAIOノートから怪音が…. ファンのあたりから聞こえるのでなにかぶつかっているのかと思ったが, そうではなくてスピーカーから出ているやん. 全部ミュートにしても聞こえるのは何故. 危ないなあ.
9月26日_
glibc malloc資料[革命の日々!]
ビデオも公開されていてありがたい. glibcのソースは読んだことないけど, ポインタの下位ビットを使う, 小さいメモリ確保は配列にする, 大きいメモリは別枠で, 最後に使ったところから再利用, 小さいメモリの確保は排他制御の負担も軽くするためスレッド毎に, ポインタの値そのものも利用する, などは自然な発想. 以前自分で作ったheapもそうしてたし. 本当にパフォーマンスを意識するならそのアプリのメモリ確保パターンに合わせたものを作るべきだと思う. 全てをカバーする汎用的なのを考えるのは私はしたくないな.
9月24日_
↓バックアップ作成 → OS再インストール → キャプチャフィルタのレジストリ取得 → バックアップ復元 → 手動レジストリ設定 による復活手順を進めていたが, バックアップ復元のところでTrue Image 7.0ではRAIDを認識できず失敗することが判明(最新版はどうか知らない). 作成のときはOSのドライバを使うため気がつかなかった. というわけでIDEのディスクをつなぎそちらに復元してみたがどうもうまく動かない. 結局なし崩し的に再インストールするはめに.
9月23日_
・設定ミスしたのかパソコンでテレビを見られなくなってしまった. アプリの再インストールなどいろいろ試みたけど駄目. OSごと再インストールしなあかんのかな. こういうときメーカーのパソコンは不便だ.
・大阪から来た知り合いといろいろおしゃべり. SICPが面白かったそうな. 私は名前を聞いたことがあるぐらい. 今度挑戦してみよう.
9月21日_
・片手でむき出しのデスクトップマシンを持って自転車で2kmほど移動. 腕がおかしくなってしまった. 明日筋肉痛だな.
・首相「人間として国旗国歌に敬意を表するのは法律以前の問題」
「人間として」とか「心の問題」とか「法律以前」とか, 議論のルールからはみ出たことばかり. 筋の通った弁論で勝負しろよなあ.
9月19日_
デジタルラジオの計画白紙[朝日新聞]か. 土壇場で大変やね. テレビの方は本当に予定通りに停波できるのかな.
9月17日_
出席した結婚披露宴の食事はえらいおいしかった. 大分奮発したんやろな. 最後のケーキバイキングを食べ損ねたのが実に悔しい.
9月16日_
飲み会の場で「私の周りにはマルチタスクな女の人 --- おしゃべりしながらでもパソコンに向かって仕事ができるとかそんな意味 --- が多い」という話がでた.
私は無理だ. 何かしてるときはたとえ相槌を打っていたとしても, 「で, どっち?」と聞かれるとまず間違いなく「え, 何が?」と返事するだろう.
#で, それを数回繰り返して相手がブチ切れる.
ただ, 普通に会話してるとき暫く前に喋っていた話の続きが順序を無視して現れたり, 飛躍した結果だけ現れたりすることはある. つまりはアウトオブオーダー(というか単なる置いてけぼり/人の話を聞いてない?). 大学ではそういう人(男)が多かった気がする. 性差のある・なしを議論するつもりは毛頭ないが, 友達がどういうタイプか考えてみるのはちょっと面白い.
9月15日_
最近, あちこちで「新しいことした~い」と叫んでるかも. 面白そうなら首つっこむのでどなたか声掛けて. 早い者勝ちです(笑).
9月14日_
もう少しで全部消せそう. でもIFも腐ってるのでそれも修正しないと….
9月12日_
リファクタリングで数万行減らしたのに, 酷いコードがまだてんこ盛り. ああ, 早くremove allして先に進むための開発がしたい.
9月10日_
『GNU開発ツール』(西田亙)
gccで私が使ったことや見たこともないオプションを利用してその処理プロセスを追いかける. とても勉強になる. ただ筆者の雑誌の連載記事ののりを期待して読み始めるとやや肩すかしを食らう. ライブ感がなくなり, おすましした感じで淡々と進む. 「Computer Architecture Series」の一冊という位置づけや装丁からすると, 敢えてそうしたのかもしれないが少々物足りない. これだけ詳細に追いかけたのだから, それで得た知識を使って 「たとえばこういうことができるよ」という例が最後にあればよかったと思う.
9月9日_
↓オリジナルのコードはある計算(QCD)にかかる時間が70秒弱(@icc)で最適化により8.3秒(トップは7.5秒@gcc). マシンはwoodcrestx2(計4コア), 4GB on 64bit. もともと並列化でスケールしやすい計算だったのでopenMPを使うだけで3倍程度は速くなる.
・二つのCPUを1と2, 一つのCPUが持つ二つのコアをA, BとするとLinuxでは大抵1A, 2A, 1B, 2Bという順序でスレッドが割り振られる. 今回の計算は隣接するスレッドのデータのやりとりが多い. だからCPU間よりもCPU内部でデータのやりとりをするようスレッドの割当順序を 1A, 1B, 2A, 2Bにするとそれだけで1割ほど速くなった(by 似鳥さん, 以下も).
・約1.2GBのデータを4重ループでアクセスするのでその順序が大切なのだが(最適化後は6重ループ)手元のP4Dで速い順序がwoodcrestで遅かったりして難しい(判ったのが締め切り日のアクセス障害でどたばたしていた最中のため詳細不明).
時間オーバーでできなかったが, そんな現象があるということは実機で丁寧にプリフェッチを入れればもっと速くできたのかもしれない.
・64bit環境なのでSIMDレジスタも夢の16本. 組み込み関数しか使えず, コンパイラによるレジスタの割り当てもいまいちな感じなので結局手動でループアンロールして順序入れ換え(iccは素直なので概ね書いた通りに並ぶ). 64byte以下のデータならload順序なんていじってもしゃあないだろうと思ったが, 並び替えてみると数%変化したのは意外.
ちなみに番外編でインテルの技術者がitanium上で直々に最適化した結果は4スレッドで5秒(8スレッドで2.8秒?). 「実はちゃんとプリフェッチ入れてコード書くと速いんですよ」と仰っていた.
9月8日_
・やっとこさネット開通. 5週間もネットが使えないのは実に辛かった.
インテルのコンテスト, うう, 3位か. 甘かったな. 速度向上率/開発コストが最大になるような癖がついてしまたとか, 引っ越しにかぶってあまり時間をとれなかったとか, 先方のサーバの設定ミスで開発機になかなかアクセスできなかった --- 聞いてみると私たちのところだけ何故か3度もミスってたらしい. 流石, 引きの悪さは健在, これからは, はずれ男と呼ぼう --- とかは単なる言い訳. まじで参戦する人が二人もいる(HPC関係の人?)とは思わなかった. トップに0.8秒の差をつけられてしまっては完敗. 審査員に聞くと別のマシンで測ったら順位が逆転した部分があった(?)とかで, お情け的に3位の賞を追加してくれたそうな.
それにしてもこういう機会はなかなかないのでとても面白かった. 主催者の方, どうもありがとうございました.
アセンブリ言語不可の理由が「審査が大変」というのはなんとも…
9月2日_
休み中にSFからジュブナイル, ミステリー, 新書を10冊ほど読んだが一番面白かったのが『陰翳礼賛』(谷崎潤一郎)だったりしたという落ち. ゆっくりした旅の話や日本式の家のよさなど共感できる部分が多かった.

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