NAKAMURA Minoru の日記 (2014年5月)

先月の日記(2014年04月) 今月の日記(2014年05月)
2002 | 10 | 11 | 12
2003 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2004 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2005 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2006 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2007 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2008 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2009 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2010 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2011 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2012 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2013 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2014 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2015 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2016 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2017 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11
ホームページ | 最新のコメント50
インデックス: 食べ歩き | Java | プログラム | UNIX | 画像
最新の日記へのリンク | この日記ページをはてなアンテナに追加 この日記ページをはてなブックマークに追加
はてな ダイアリー アンテナ ブックマーク ブログ
Twitter | mixi | Facebook | Google+
slideshare | github | Qiita



5/31 (土)

カリブ・ラテンアメリカストリート@代々木公園

代々木公園のイベント広場でカリブ・ラテンアメリカストリートというのをやっていた。 あまりラテンアメリカっぽくないお店も多数出店していた。

[Movie] X-Mem: Future & Past

『X-Mem: Future & Past』(原題はX-Mem: Days of Future Past) をチネチッタで観て来た。 相変わらずウルヴァリン!!ウルヴァリン!!な映画だった。


5/28 (水)

[PostgreSQL] C++ で PostgreSQL のモジュールを作る場合の Makefile

Linux で PostgreSQL のモジュールを C++ で作る場合のメモを残しておく。

PostgreSQL のモジュールの作り方は PostgreSQL の公式ドキュメントの35.9 C 言語関数 と、ソースコードを展開した時に postgresql-9.x.y/contrib/ の下をみればだいたい予想できる。

これに従って foo/foo.c というプログラムを書いた場合、以下のような Makefile を赤字を除いて書けばよい。 ただし pg_config コマンドがパスの通った位置にある必要がある。

C++ を使って PostgreSQL のモジュールを作りたい場合には foo/foo.cpp のようなファイルを作成するが、この場合の 赤字を含んだ Makefile にする。

Makefile:
MODULE_big = foo
OBJS = foo.o

PG_CONFIG = pg_config
PGXS := $(shell $(PG_CONFIG) --pgxs)
include $(PGXS)

COMPILER = $(CXX) $(CFLAGS)

%.o : %.cpp
        @if test ! -d $(DEPDIR); then mkdir -p $(DEPDIR); fi
        $(CXX) $(CFLAGS) $(CPPFLAGS) -c -o $@ $< -MMD -MP -MF $(DEPDIR)/$(*F).Po

ポイントは以下の 2 点。

  • .cpp → .o へのルールを .c → .o と同じように書くこと。
  • Makefile 内の変数 COMPILER に C++ コンパイラを指定。これがないとリンカが C++ にならない。

5/26 (月)

Graphviz でボックスの真ん中から線を引く

Graphviz のメモ。

node のスタイルをボックスにして Graphviz を使うと UML のクラス図のようなものが書けるが、この際に label 内を {} でくくり、その中を | で区切ると、セパレータを作ることができる。

たとえば以下のような dot 記述をコンパイルすると、Fig. 1 のようになる。

digraph {
    node  [shape=record,style=filled,fillcolor=gray95];
    edge  [arrowtail=empty];

    4 [label = "{struct ibv_qp|context|pd|send_cq|recv_cq|srq|handle|qp_num|state|qp_type}"];
}
Fig. 1 ボックス内にセパレートしたイメージ図

これは大変便利なのだが、このボックス(graphviz 的には node)をちょうど構造体とみなして、メンバ変数から構造体へのポインタを矢印(graphviz 的には edge)で描こうとした場合、少し問題が生じる。 次の dot 記述をコンパイルすると Fig.2 のようにスロットと関係ないから矢印が伸びてしまう。

digraph {
    node  [shape=record,style=filled,fillcolor=gray95];
    edge  [arrowtail=empty];

    4 [label = "{struct ibv_qp|context|pd|send_cq|recv_cq|srq|handle|qp_num|state|qp_type}"];
    5 [label = "{struct ibv_srq|context|pd|handle}"];
    6 [label = "{struct ibv_cq|context|channel|handle|cqe}"];
    7 [label = "{struct ibv_comp_channel|context|fd}"];

    4:send_cq -> 6 [label = "send_cq"];
    4:recv_cq -> 6 [label = "recv_cq"];
    4:srq     -> 5 [label = "srq"];
    6:channel -> 7 [label = "channel"];
}
Fig. 2 ボックスのどの位置から矢印が出るか制御できない

この場合、下の dot 記述の赤字で追加したよう node の shape を record に設定してフィールドを記述すると、Fig. 3 のようにボックスのどの位置から矢印が出るかを制御できる。

digraph {
    node  [shape=record,style=filled,fillcolor=gray95];
    edge  [arrowtail=empty];

    4 [label = "{struct ibv_qp|context|pd|<send_cq> send_cq|<recv_cq> recv_cq|<srq> srq|handle|qp_num|state|qp_type}"];
    5 [label = "{struct ibv_srq|context|<pd> pd|handle}"];
    6 [label = "{struct ibv_cq|context|<channel> channel|handle|cqe}"];
    7 [label = "{struct ibv_comp_channel|context|fd}"];

    4:send_cq -> 6 [label = "send_cq"];
    4:recv_cq -> 6 [label = "recv_cq"];
    4:srq     -> 5 [label = "srq"];
    6:channel -> 7 [label = "channel"];
}
Fig. 3 ボックスのスロット位置から矢印が出る

5/25 (日)

[Food] 雲林坊@秋葉原

お昼を秋葉原にできた雲林坊(公式食べログ)で食べる。 ここは麻婆豆腐と汁なし坦坦麺がお奨めらしい。


麻婆豆腐

汁あり坦坦麺

第十回 カーネル/VM探検隊

第十回 カーネル/VM探検隊に参加。


5/20 (火)

[CPU] Enhanced REP MOVSB and STOSB Operation(ERMSB) の効果

Ivy Bridge 以降の Intel の x86 CPU は Enhanced REP MOVSB and STOSB Operation(ERMSB) と呼ばれる機構が導入され、バイト単位の転送・ストア命令である REP MOVSBREP STOSB が内部的に高速化されている。 随分前からこれが気になっていた。

自宅の ショップブランド PC 3 号機 が Haswell なので、ERMSB が入っていたと気づき性能を測定してみた。 512 バイトのデータ転送を GLIBC の memcpy() とアセンブラを直接書いたコードで実行したものを 10 億回づつ実行した時間を表にまとめてみる。

Family Core i5-2400
3.10GHz
Core i5-4570
3.20GHz
Xeon E5-2697
2.70GHz
Microarchitecture Sandy Bridge Haswell Ivy Bridge-EP
glibc (memcpy) [centos6] 23.097519 [centos6] 19.032760
[fedora20] 10.655932
[centos6] 19.504777
movsb 63.916112 15.830215 18.046843
movsd 64.117347 15.867435 18.045164
movsq 64.360773 15.858512 18.053021
movdqa(unroll:1) 37.902333 19.828171 30.988308
movdqa(unroll:2) 17.039902 10.379861 14.919834
movdqa(unroll:4) 11.618096 9.514093 9.473016
movdqa(unroll:8) 11.693997 9.512302 9.478773
vex128(unroll:1) 38.778718 19.806860 31.158838
vex128(unroll:2) 17.675478 10.345933 14.906888
vex128(unroll:4) 12.580199 9.491262 11.070020
vex128(unroll:8) 11.805097 9.465746 9.881396
vex256(unroll:1) 17.267204 10.636090 15.240344
vex256(unroll:2) 11.195899 6.600692 9.452402
vex256(unroll:4) 11.668518 5.049585 9.455619

Sandy Bridge は MOVDQA 命令と MOVSB 命令を比べると MOVDQA 命令が 5.5 倍高速だが、Haswell はその差は 1.7 倍に縮まっており、MOVSB 命令がだいぶ高速化している。 このテストではアライメントに沿った 512 バイトを指定したが、もっと複雑なサイズと境界条件であれば Haswell は MOVSB 命令を直接使った方が高速であろう。

計測を CentOS 6.5 / glibc-2.12-1.132 で行った場合、その中の memcpy()MOVSB 命令を比較すると、Sandy Bridge では memcpy() の方が 2.8 倍高速である。 だが、Haswell は逆転し MOVSB 命令は 1.2 倍ほど高速だ。

一方 Fedora 20 / glibc-2.18-12 で行った場合、その中の memcpy() の方が 1.5 倍高速である。 Fedora 20 の memcpy() の内部では MOVDAQ 命令や AVX 命令を使っていると予想される。

追記:5/22

Ivy Bridge-EP の結果を足してみた。


5/17 (土)

第15回タイフェスティバル 2014@代々木公園

代々木公園で第15回タイフェスティバル 2014が開催される。 先週の OKINAWA まつりは野外ステージのあるイベント広場のみだったのだが、タイフェスはケヤキ並木の終わりまで出店が続いていた。 そして人人人。 人多杉。


イベント広場原宿よりの看板

ケヤキ並木の終わりの看板

いろいろ食べる。


ガーリックシュリンプ

ドリアン

タイのタクシーの販売。

工芸品の売り場で幸福を呼ぶカエルを買いましてみた。


緑色のカエル

前から持っていたカエル

渋谷区の妖精 あいりっすん

ハチ公バスからハチ公が居なくなって変なキャラクタに乗っ取られた。 これはゆるキャラなのか?

キリンシティ

渋谷にこんなのができていたのね。 それとも前からあったけど私が気づかなかっただけ?


5/14 (水)

[MyWeb] ファイルの穴を lseek() で検出可能に

Linux 固有の機能だが、Linux カーネル 3.1 から lseek() を使ってファイルの中の穴(hole)を調査することが可能になった。 「Linux で疎なファイル(sparse file)を使う」に詳細を加筆した。


5/11 (日)

[MyWeb] InfiniBand Verbs API Reference

ibv_post_send() が書きあがっていないが、第六弾 「InfiniBand Verbs API Reference」のページをとりあえず公開。

OKINAWAまつり in 代々木公園 2014@代々木公園

代々木公園で OKINAWA まつり。


タコライス

ケヤキ並木で小規模な物産展もやっていた。 チキンをまるごと炙っている店は前にも見たが、Chicken Manというらしい。 1/4 ピースを買うが大変に旨い。


5/6 (火)

バルテュス展 Balthus: A Retrospective@東京都美術館

連休の最終日は上野の東京都美術館でやっているバルテュス展を観にいった。 あまりピンとこず。

ジャック・カロ ― リアリズムと奇想の劇場@国立西洋美術館

一緒に国立西洋美術館でやっていたジャック・カロ ― リアリズムと奇想の劇場も観て行く。 これは企画展で普段特別展をやるスペースの半分を使って開催していた。 お値段も一般 600 円で非常にお徳。

ジャック・カロは 1592 年〜1635 年をロレーヌ地方に住んだ銅版画家。 エングレービングのような膨らみのある絵を比較的簡単なエッチングの技法を使って描く技術を開発した。 またカロの技法が弟子によってエッチングの技法書にまとめられ、永らく教科書的にな位置づけになったそうだ。

カロー展に展示されている作品は大多数はクラインマイスターと呼ばれる 4〜5 センチ角の版画だ。 実際に絵をブリューゲルの時代の銅版画と比べると、線の強弱が見事について奥行きのある絵になっている。

ボンディ@神保町

久しぶりにボンディ。 到着したのが 20 時を過ぎていたと言うのに、非常に人が多い。


5/5 (月)

[Movie] 相棒 劇場版 III

チネチッタで『悪夢ちゃん The夢ovie』を観ようと思ったが時間が合わないため、『相棒 劇場版 III 巨大密室!特命係 絶海の孤島へ』 を観る。

[Food] チャオタイ@川崎店

タイ料理チャオタイ(公式ぐるなび食べログ)へ。


カオソイ ガイ

ガイ パッメッ マモアン

カオソイ ガイというタイ北部特産のカレーラーメンはあまり旨くなかった。 前回もこれを頼んで失敗したと思ったのだが、その時はデジカメの電池で切れていて撮影できなかった。 何事も記録がないと忘れてしまう。 記録大事。


5/4 (日)

肉フェスあらためシンコ・デ・マヨ・フェスティバル

駒沢公園の肉フェス2014に行ってみたが、食券を買うまでに2時間近くかかるというこで撤退。

諦めて代々木公園でやっているシンコ・デ・マヨ・フェスティバルに。


南米のユカ芋揚げ

ペルーアンデスローストチキン

渋谷の NHK では 渋谷DEどーも2014、代々木公園の歩道を子ども交流体験フェスタ 2014 in 代々木公園 <第12回>

[Movie] ネイチャー

チネチッタで『ネイチャー』の 2D 吹き替え版を観てきた。 周囲の客は1列に1人居るかいないかという寂しい状況。

美しい自然のシーンが連続するが、動物が動物を捕食するシーンも多く思わず目を背けるような場面もある。 なかなかお薦めはできないが、暇つぶしには調度良い。


5/3 (土)

[Linux] Driver Update Package の作成がうまくいかない

pib のドライバ部分を Red Hat の Driver Update Package (DUP) に対応させようとしているのだが、CentOS 6 ではうまくいく spec ファイルの書き方が Fedora 20 ではうまく動作しない。

%build
for flavor in %flavors_to_build; do
    rm -rf obj/$flavor
    cp -r source obj/$flavor
    make -C %{kernel_source $flavor} M=$PWD/obj/$flavor
done

Fedora 20 では %{kernel_source $flavor} の部分が /usr/src/kernels/3.13.10-200.fc20.x86_64 と展開されるべきが、/usr/src/kernels/3.13.10-200.fc20-x86_64 と展開されてコンパイルエラーとなる。

+ make -C /usr/src/kernels/3.13.10-200.fc20-x86_64 M=/home/nminoru/rpmbuild/BUILD/pib-0.4.1/obj/default
make: *** /usr/src/kernels/3.13.10-200.fc20-x86_64: No such file or directory.  Stop.

参考

  1. Red Hat Driver Update Packages Official Reference Guide Version: 0.99

5/2 (金)

[Prog] fflush() は NULL を引数にとれる

fflush()FILE 型のストリームのバッファを強制的に吐き出す命令だが、この NULL を指定した場合には stdout/stderr も含めて全ての出力ストリームをフラッシュすることになる。

fflush(NULL);

先月の日記(2014年04月) 今月の日記(2014年05月)
2002 | 10 | 11 | 12
2003 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2004 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2005 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2006 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2007 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2008 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2009 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2010 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2011 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2012 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2013 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2014 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2015 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2016 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2017 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11
ホームページ | 最新のコメント50
インデックス: 食べ歩き | Java | プログラム | UNIX | 画像
最新の日記へのリンク | この日記ページをはてなアンテナに追加 この日記ページをはてなブックマークに追加
はてな ダイアリー アンテナ ブックマーク ブログ
Twitter | mixi | Facebook | Google+
slideshare | github | Qiita


Written by NAKAMURA Minoru, Email: nminoru atmark nminoru dot jp, Twitter:@nminoru_jp