何人かに「ネタがあるのか?」「2回もやってすごいな」という心配(呆れ?)を気にせず作ってしまった.
発表者募集中. LTもOK.
数論暗号勉強会でグレブナー基底の存在やBuchbergerのアルゴリズムなどの発表担当. 次回はF4アルゴリズムなどの予定.
勉強会が終わってからせっかくだからとFACOM 128Bというリレー式計算機というのを見せていただいた. なんと実際に動いてる!
ボタンを押すとがちゃがちゃという機械音とともに, パンチカードを読み込んで隣のところから結果が出てくる. 約60年前の機械が動いてるというのに感動した.
コンピュータ博物館を見ると加減算の性能は5~10FLOPS?
後ろの本棚みたいなところに入ってる四角いもの一つ一つがリレー. もともとは電話のやつを流用したか, 技術を使っただったかそういうのらしい.
ついでに言うと一緒に見学していた人が(展示してある)黒電話を初めて見たというのも聞いて, ああそういう時代かと思った.
そしてこの後にプロシンで聞いたパラメトロンが登場する.
同じフロアに京のモック展示もあってそちらは10PFLOPS. こちらはこちらで開発者たちの熱いメッセージがいい感じ. 紹介ビデオなども気合入ってるなあ.
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の復習と共に予想が正しいか後で調査する.
GCC_VER=$(shell gcc --version|head -1|awk '{print $$NF}')ってやってたら, gcc -dumpversionでいけるよと教えていただいた. 知らなんだ.
第6回JVMソースコードリーディングの会に飛び入り参加.
Javaは普段全く触らないのだけどC++による実装を眺めながらの解説が面白そうだったので.
今回はCMS(Concurrent Mark and Sweep)の話. GCの間やっぱり1秒とか止まってしまうのをなんとか回避したいということで導入されている. ただConcurrentとは言ってもここで実装されているCMSは完全に止まらないわけではなく, ちょっとはSTW(Stop The World)の期間はあるらしい. といっても0.1秒未満ぐらいとか.
また, スループット性能は普通のGCに比べて落ちるので既存のやつを置き換えるものでもない.
あと, リアルタイムOSほどではないけどもっと止まる時間を保証するものとしてはG1というのもあるらしい.
#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不要って書いてあるように見えるんだよなあ.
コンパイラ実装会(2)に参加.
新宿は1年3ヶ月振り. やっぱり人が多い. 会場を探して付近をぐるぐる回ってるといろいろ声をかけられる. 歌舞伎町というのはなんか雰囲気が違ってちょっとびびる.
今回はblogなどをよく拝見していた7shiさんに初めてお会いするのが目的.
# サンクと継続の勉強会の配布資料なんて物凄い力作!
今日はF#で書かれたXbyakちっくなARMやMIPSコード出力ツールのコードなどを見せていただく.
"勉強会"ではなくて, 各自が好きなことやってる. ただ成り行きでXbyakのBrainf*ckや四則演算のJITサンプルコードの解説をさせてもらった. ほんの少しboost::spirit::qiの説明もしたのでプチ裏boost勉強会っぽい(そんなことは無いか).
もっといろいろお話を伺いたかったけど用事があったので途中で退散. 残念.