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 にする。
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}"]; }

これは大変便利なのだが、このボックス(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"]; }

この場合、下の 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"]; }

5/25 (日)
5/20 (火)
[CPU] Enhanced REP MOVSB and STOSB Operation(ERMSB) の効果
Ivy Bridge 以降の Intel の x86 CPU は Enhanced REP MOVSB and STOSB Operation(ERMSB) と呼ばれる機構が導入され、バイト単位の転送・ストア命令である REP MOVSB
や REP STOSB
が内部的に高速化されている。
随分前からこれが気になっていた。
Ivy BridgeからEnhanced REP MOVSB and STOSB operation(ERMSB)というのが入って普通にREP MOVSBすれば、小手先のREP MOVSDよりも速いらしい。条件によってはAVXを使った方が高速らしい。
— 中村 実 (@nminoru_jp) 2012, 7月 25
自宅の ショップブランド 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 センチ角の版画だ。 実際に絵をブリューゲルの時代の銅版画と比べると、線の強弱が見事について奥行きのある絵になっている。
[Food] ボンディ@神保町
久しぶりにボンディ。 到着したのが 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.
参考
- Red Hat Driver Update Packages Official Reference Guide Version: 0.99