憂鬱な午後のひととき

7月30日_

cgo on mingw64

なぜかよく分からないがmingw64のgoではCFLAGSの-Iオプションが効かない. goのソースコードに直接#cgo CFLAGS:-I...と書くとうまくいく.

またLD_RUN_PATHの環境変数が効かないのでPATHに共有ライブラリがあるパスを追加する.

7月28日_

mingw64の共有ライブラリ

mignw64は拡張子がdllとsoの両方を受け付ける. VCで作ったDLLも使える. 逆にmingw64のgccで作った共有ライブラリはVCから使える. 知らんかった. 面白い.

//add.c
int add(int x, int y)
{
    return x + y;
}
gcc -shared -o lib/add.so add.cpp -Wl,--out-implib,lib/libadd.a

VCの__declspec(dllexport)とかは無くてもよいようだ.

add.soの中身はDLL. -Wl,--out-implib,lib/libadd.aでlibadd.aが生成される. この中身はVCで作るadd.lib.

VCからはclコマンドに直接libadd.aを指定すると警告は出るけどちゃんとリンクされる. 実行時にはadd.soが読み込まれて動く.

7月27日_

東工大首藤研

久しぶりにお邪魔する(shudo.net). 2時間議論 + 2時間レクチャー. いろいろ交流ができるとよいな.

7月26日_

cygwinとmingw64

mingw64でなんか動かないなといろいろ調べたら uint64_tに対して__builtin_clzlを使うとバグる. なぜだあと思ったらmingw64ではsizeof(long) = 4なのだった.

したがって__builtin_clzllを使わなければならない.

printfの%zdを使いたいときは__USE_MINGW_ANSI_STDIO=1つけないといけないとかいろいろ難しい.

7月25日_

大学の先生

10年以上振りの方々とお会いする. みなさんお元気でなにより(生存者バイアス). 会場は何度かいったことがあるお店だったが15分ぐらいさまよった. 今回はiPhoneの地図を見ながらだったのだけど駄目だった.

7月24日_

getaddrinfoとstaticリンク

pthreadをstaticリンクするときはオブジェクトを全部リンクさせるように明示しないと実行時に落ちる.

#include <stdio.h>
#include <thread>

void f(const char *msg)
{
    printf("f %s\n", msg);
}

int main()
{
    std::thread t(f, "this");
    puts("main");
    t.join();
    puts("end");
}
g++ -Ofast -g t.cpp -std=c++11 -static -lpthread
./a.out
% ./a.out
main
Segmentation fault

0x0000000000408020 <std::thread::join()+32>: xor    esi,esi
0x0000000000408022 <std::thread::join()+34>: call   0x0

std::thread::join()の中で0番地を呼んでる.

g++ t.cpp -std=c++11 -Ofast -static -Wl,--whole-archive -lpthread -Wl,--no-whole-archive

とすると正しくpthread_joinが呼ばれる.

dynamicリンクのときはweakと通常のシンボルがあると通常のものが見つかるまで探す. staticリンクのときはweakが見つかるとそこで終わる. weakがstrubだったらsegvしてしまう.

で, getaddrinfoだがstaticリンクしようとすると

warning: Using 'getaddrinfo' in statically linked applications requires
at runtime the shared libraries from the glibc version used for linking

というようなエラーがでる. 動くときもあれば実行時に落ちるときもある. 歴史的事情は知らないけどFAQのようだ. まあ諦めろということらしい.

7月19日_

『光の場, 電子の海―量子場理論への道』(吉田伸夫)

読みごたえがあった. 非常に面白かった. これはすばらしいテキスト. 大学生のとき, 量子力学はともかく, 第二量子化やゲージ理論のあたりから分からなくなった. 「生成・消滅演算子の作用する空間はなんですか」と聞いたら「後で構成する」みたいな返事で, 順序が逆ではと思ったのを思い出す.

数学のゲージ理論も勉強したが結局自分の中では素粒子理論とくっつかなかった.

ボーア, ハイゼンベルグ他多数の学者があれこれ悩みながらあーだこーだとやっていたのだった(当たり前だが). 論文に対する姿勢が人それぞれなのが楽しい. というか中性子の発見の前によくこんなこと考えていたな. 今もう一度教科書で勉強すればもっと分かるようになるかもしれない. お盆に教科書を持って帰ってみるか.

7月8日_

寝てる

朝早く起きて作業してから夕方ぐらいまで寝てる. 体が動かん. 土曜日出かけるとしんどいな.

7月7日_

IPA未踏キックオフ参加

いろ面白い発表を聞いた. 終わってから「かんだやぶそば」で久しぶりに蕎麦を食べた. この店は15年位前に来たな.

7月6日_

ライブ観察で解く脳皮質形成のメカニズム

いろんな分野の最先端の話を気軽に聞けてとてもいい.

ニューロンは互いにぶつからないように伸びたり縮んだりしながら隙間なく伸びていくそうな. うまいことできてる. 日本神経科学会 市民公開講座と大体似た内容だったもよう.

7月3日_

体がだるい

ここ1, 2週間おっそろしくだるくて辛い. しんどすぎる. 夏ばてかな.

7月2日_

Microsoft MVP

受賞できた. もう1年Visual Studio使える.

7月1日_

無理数時計

先日のtcfm meetupのLTで紹介されていたもの.

C++のfind使ってるけど遅いので「Boyer-Moore法など使えば速くなるかも」みたいな話がされていたけど, Intel系CPUでBM法使って速くなるケースってあまりないよなと思ってコードを見てみた.

C++に慣れてない人なのかな, stringを値渡ししていた.

まず中間結果を表示しないようにしてデフォルトで円周率でのベンチマーク. 時間がかかるので1/6の4時間だけやってみる.

オリジナル ; 45秒. CPUはi7-7700

const参照に変更 ; 14秒. これだけで3倍速くなった.

次に昔作ってたSSE4.2によるfindStrを使ってみる(cf SSE4.2の文字列処理命令の紹介).
use mie::findStr ; 2秒 ; (要xbyak)

7倍速くなった. オリジナルの21倍速. 24時間分計算しても12秒ちょいで出来た.

他も気になるところはあるけどまあこんな程度で.

# 実はmie::findStrの前にmemmem()を使ってみたけど速くならなかった. これはちょっと意外.

(加筆)ちょっとミスリーディングだった. memmemでしか確認してないのはうっかりだった. strstrを使うと14秒だった. つまりstd::findじゃなくてstrstrを使うべき. これはstd::findは単なるforループをコンパイラが頑張って最適化するのに対してstrstrは職人さんがアセンブラで実装してるから(標準関数だしね).


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