cgo on mingw64
なぜかよく分からないがmingw64のgoではCFLAGSの-Iオプションが効かない. goのソースコードに直接#cgo CFLAGS:-I...と書くとうまくいく.
またLD_RUN_PATHの環境変数が効かないのでPATHに共有ライブラリがあるパスを追加する.
cgo on mingw64
なぜかよく分からないがmingw64のgoではCFLAGSの-Iオプションが効かない. goのソースコードに直接#cgo CFLAGS:-I...と書くとうまくいく.
またLD_RUN_PATHの環境変数が効かないのでPATHに共有ライブラリがあるパスを追加する.
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が読み込まれて動く.
東工大首藤研
久しぶりにお邪魔する(shudo.net). 2時間議論 + 2時間レクチャー. いろいろ交流ができるとよいな.
cygwinとmingw64
mingw64でなんか動かないなといろいろ調べたら uint64_tに対して__builtin_clzlを使うとバグる. なぜだあと思ったらmingw64ではsizeof(long) = 4なのだった.
したがって__builtin_clzllを使わなければならない.
printfの%zdを使いたいときは__USE_MINGW_ANSI_STDIO=1つけないといけないとかいろいろ難しい.
大学の先生
10年以上振りの方々とお会いする. みなさんお元気でなにより(生存者バイアス). 会場は何度かいったことがあるお店だったが15分ぐらいさまよった. 今回はiPhoneの地図を見ながらだったのだけど駄目だった.
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のようだ. まあ諦めろということらしい.
『光の場, 電子の海―量子場理論への道』(吉田伸夫)
読みごたえがあった. 非常に面白かった. これはすばらしいテキスト. 大学生のとき, 量子力学はともかく, 第二量子化やゲージ理論のあたりから分からなくなった. 「生成・消滅演算子の作用する空間はなんですか」と聞いたら「後で構成する」みたいな返事で, 順序が逆ではと思ったのを思い出す.
数学のゲージ理論も勉強したが結局自分の中では素粒子理論とくっつかなかった.
ボーア, ハイゼンベルグ他多数の学者があれこれ悩みながらあーだこーだとやっていたのだった(当たり前だが). 論文に対する姿勢が人それぞれなのが楽しい. というか中性子の発見の前によくこんなこと考えていたな. 今もう一度教科書で勉強すればもっと分かるようになるかもしれない. お盆に教科書を持って帰ってみるか.
寝てる
朝早く起きて作業してから夕方ぐらいまで寝てる. 体が動かん. 土曜日出かけるとしんどいな.
IPA未踏キックオフ参加
いろ面白い発表を聞いた. 終わってから「かんだやぶそば」で久しぶりに蕎麦を食べた. この店は15年位前に来たな.
いろんな分野の最先端の話を気軽に聞けてとてもいい.
ニューロンは互いにぶつからないように伸びたり縮んだりしながら隙間なく伸びていくそうな. うまいことできてる. 日本神経科学会 市民公開講座と大体似た内容だったもよう.
体がだるい
ここ1, 2週間おっそろしくだるくて辛い. しんどすぎる. 夏ばてかな.
Microsoft MVP
受賞できた. もう1年Visual Studio使える.
先日の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は職人さんがアセンブラで実装してるから(標準関数だしね).