憂鬱な午後のひととき


2月27日_

第3回x86/x64最適化勉強会

何人かに「ネタがあるのか?」「2回もやってすごいな」という心配(呆れ?)を気にせず作ってしまった.

発表者募集中. LTもOK.

2月26日_
〈ますます勝手に関西遺産〉我こそ自由の体現者
同じ新聞でも関東のはつまらんというのはこっちに来て知った. こういう記事も無いんだよなあ.
2月25日_
法事で京都に行く. で, 久しぶりにゲーム会社で働いてる友達に会う. 相変わらず低レイヤでがりがり(でもC++でテンプレートメタプログラミング)プログラムしてるそうな. いろいろ面白い話を伺った. とにかく少ないメモリでやりくりするのが大変なんだそう. 最近は商品直結のことをしてないのでそういうのも引かれる.
2月24日_

数論暗号勉強会でグレブナー基底の存在やBuchbergerのアルゴリズムなどの発表担当. 次回はF4アルゴリズムなどの予定.

勉強会が終わってからせっかくだからとFACOM 128Bというリレー式計算機というのを見せていただいた. なんと実際に動いてる!

ボタンを押すとがちゃがちゃという機械音とともに, パンチカードを読み込んで隣のところから結果が出てくる. 約60年前の機械が動いてるというのに感動した.

FACOM 128B

コンピュータ博物館を見ると加減算の性能は5~10FLOPS?

後ろの本棚みたいなところに入ってる四角いもの一つ一つがリレー. もともとは電話のやつを流用したか, 技術を使っただったかそういうのらしい.

ついでに言うと一緒に見学していた人が(展示してある)黒電話を初めて見たというのも聞いて, ああそういう時代かと思った.

そしてこの後にプロシンで聞いたパラメトロンが登場する.

同じフロアに京のモック展示もあってそちらは10PFLOPS. こちらはこちらで開発者たちの熱いメッセージがいい感じ. 紹介ビデオなども気合入ってるなあ.

2月22日_

Quick Search algorithmがどの程度速いのか調べてみた.

30MBぐらいのファイルの中からある単語が何回登場するのかを計測する. Quick Search algorithm(以下QS)の初期化部分は除いて純粋な探索部分のみとstrstrとの比較をした.

VCのstrstrはまだSSE4.2の文字列処理命令が使われてない(未確認)せいか5文字ぐらいでもQSの方が速かった(@Sandy Bridge). けど, Linuxのは結構最適化されていて16文字ぐらいでもstrstrの方が速かった(@Xeon X5650).

あれ~がっかりと思って元の実装をよく見ると文字列の一致確定の部分でmemcmpを使っている. なんとなくここをばらしてみたら2倍ぐらいは速くなって, 8~9文字ぐらいでQSの方が速くなった. VCではそこの効果は1割ぐらいだった.

改良後のコードはこんな感じ.

class QuickSearch {
    static const size_t SIZE = 256;
    size_t len_;
    int tbl_[SIZE];
    std::string str_;
    void init(const char *begin)
    {
        std::fill(tbl_, tbl_ + SIZE, static_cast<int>(len_ + 1));
        for (size_t i = 0; i < len_; i++) {
            tbl_[static_cast<unsigned char>(begin[i])] = len_ - i;
        }
    }
public:
    explicit QuickSearch(const char *begin, const char *end = 0)
        : len_(end ? end - begin : strlen(begin))
        , str_(begin, len_)
    {
        init(begin);
    }
    const char *find(const char *begin, const char *end) const
    {
        while (begin <= end - len_) {
            for (size_t i = 0; i < len_; i++) {
                if (str_[i] != begin[i]) {
                    goto NEXT;
                }
            }
            return begin;
        NEXT:
            begin += tbl_[static_cast<unsigned char>(begin[len_])];
        }
        return 0;
    }
};

もちろん単語や検索するテキストによってその値は大きく変わるから上記の値はあくまで一例(ベンチマークに使ったコード). でも第一印象では8文字で切り替えるハイブリッドな実装がよさげ.

SSE4.2の復習と共に予想が正しいか後で調査する.

2月20日_
fmathのMakefileの中でgccのバージョンチェックに
GCC_VER=$(shell gcc --version|head -1|awk '{print $$NF}')
ってやってたら, gcc -dumpversionでいけるよと教えていただいた. 知らなんだ.
懇親会
2000円しか財布になかったので諦めたけどあのメンツでその判断は無かった. 素直にshinhさんのご好意に甘えてお金を貸してもらえばよかった.
2月19日_
日経サイエンス2011年3月号(約1年前なのに注意)
なんとなく読み返してみる. 皮肉なことに「見えてきた原子力の未来図」というPR(とは書いてないけど)記事が載っている. 「日本の建設・管理技術は世界的に高く評価されている」というのが実体がどうだったか. 様々な報道を見ても分かるが, 特に朝日新聞連載記事の「プロメテウスの罠」を見ると気が滅入る.
2月18日_

第6回JVMソースコードリーディングの会に飛び入り参加.

Javaは普段全く触らないのだけどC++による実装を眺めながらの解説が面白そうだったので.

今回はCMS(Concurrent Mark and Sweep)の話. GCの間やっぱり1秒とか止まってしまうのをなんとか回避したいということで導入されている. ただConcurrentとは言ってもここで実装されているCMSは完全に止まらないわけではなく, ちょっとはSTW(Stop The World)の期間はあるらしい. といっても0.1秒未満ぐらいとか.

また, スループット性能は普通のGCに比べて落ちるので既存のやつを置き換えるものでもない.

あと, リアルタイムOSほどではないけどもっと止まる時間を保証するものとしてはG1というのもあるらしい.

2月15日_
OpenSSLの終了処理ってどうするのがよいのだろう. いろいろ試したけどどうしてもvalgrindでleak報告を0にできない. 加えて関数呼び出し順序もよーわからん.
#include <openssl/engine.h>
#include <openssl/ssl.h>
#include <openssl/err.h>
#include <openssl/rand.h>
#include <openssl/conf.h>
#include <stdio.h>

int main()
{
    SSL_load_error_strings();
    SSL_library_init();

    ERR_remove_state(0);
    EVP_cleanup();
    CRYPTO_cleanup_all_ex_data();
    ENGINE_cleanup();
    ERR_free_strings();
    CONF_modules_unload(1); // openssl/conf.h
    /* this decreases one leak, but is this correct? */
//    OPENSSL_free(SSL_COMP_get_compression_methods());
}
これだと3個のleak. 最後の//を外すと2個になる. ただソースを見る限りではこの返り値はfree不要って書いてあるように見えるんだよなあ.
てか, 誰もが思ってるだろうけどなんでSSL_library_term();が無いのか.
2月11日_

コンパイラ実装会(2)に参加.

新宿は1年3ヶ月振り. やっぱり人が多い. 会場を探して付近をぐるぐる回ってるといろいろ声をかけられる. 歌舞伎町というのはなんか雰囲気が違ってちょっとびびる.

今回はblogなどをよく拝見していた7shiさんに初めてお会いするのが目的.
# サンクと継続の勉強会の配布資料なんて物凄い力作!
今日はF#で書かれたXbyakちっくなARMやMIPSコード出力ツールのコードなどを見せていただく.

"勉強会"ではなくて, 各自が好きなことやってる. ただ成り行きでXbyakのBrainf*ckや四則演算のJITサンプルコードの解説をさせてもらった. ほんの少しboost::spirit::qiの説明もしたのでプチ裏boost勉強会っぽい(そんなことは無いか).

もっといろいろお話を伺いたかったけど用事があったので途中で退散. 残念.

2月10日_
今日の社内機会学習勉強会はshuyoさんのtwitterの論文ネタ. あらためてあの分量のコーパスを用意したパワーに恐れ入る.
2月9日_
会社の人が持ってきてくれてた日経エレクトロニクスをまとめて読むと数カ月前でも今と流れが異なってることがあったりしてなかなか面白い. しかし, 雑誌に載ってる顔写真がことごとく男性ばかりでなんだかなあ. なんでこんなに偏ってしまってるんだろう.
ところで2011-11-28号にあったBIOSウイルスを無効化するINT∅(0に斜線)というハードウェアの記事の中のBlack Cellという暗号の話がなんだか変だ.
2月2日_
金沢の雪にびびってちゃんと帰れるか心配だったけど無事帰宅. いろいろ面白い発表があったので刺激になった.

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