TLにこんなおもしろそうな勉強会があるよって流れてきたけど急に決まったことなのか登録者数0で、なにかの罠かともおもったが、ポチっと1get。
PFNのある大手町ビル、めっちゃ縦長なのと、どっから2階に上がったらいいのかわからないのとで、けっこうおろおろした。1階のローソンでコーヒーとスニッカーズを補給して会場入り。
New LLD linker for ELF / Rui Ueyama, @rui314
- 資料
- 基調講演?
- choromeをWindowsでビルド
- FreeBSDの人たちがGNU排除のために使おうとしている
- MIPSのABIはめちゃくちゃ(mixed-endianがあったり、スペックはGNU ldのコメント)。
- カーネルはリンカースクリプトでメモリ配置を指定しているのでむつかしい。
- リンカーでいちばん遅いのはconstデータをマージするところ
- ld -icfオプション: 名前じゃなくてコンテンツでマージする。(5%-10%くらい小さくなる)
- マージする関数の中にあるリロケーションも考えないといけないのでグラフの比較になる。再帰呼び出しとかもある。
- 余計なことをしない:ELFのヘッダをそのままよんで内部データをつくらない。
- archive file(.a): unixのセマンティックスだとコマンドラインの順に解決していく。相互依存だとこまる。--start-groupがある。
- ranlibのヘッダをよんでおいてlazy symbolを導入して解決。
- ブラウザは大きい(emacsは小さい)chromeはデバッグいれると3GB。17000objfile。hashtable lookupさえしたくない。1回しかしないようにした。C++だとシンボル名が500Bあったりするし。
- wrap機能:シンボル解決するときにリネームするんじゃなくてシンボル解決をおわらせてからつけかえる。
- LTO: llvmのbitcodeをリンカがくっつけてまとめてllvmがネイティブコードにおとす。
- マルチスレッドはこれから。
- Q:gold pluginはつかってない?
- A:hackyなのでみんないや
- Q:hash関数はとくべつ?
- A:ふつう。ELFはnullterminateなのでstrlenがおそい。ELFの文字列に長さをいれたり名前をハッシュ値にしたりというアイデアはある。ELFはそんなに悪くない。。拡張するにも皆の方向性がちがう。
- Q:ICF
- A:C/C++では別な関数は別なアドレスという要求がある(ジャンプやNOPをはさむアイデアはある)。VCはICFがデフォルトon。
- Q:ICFでマージされたらデバッガどうなる?
- A:さいしょにみつかったやつ?ほんしつてきにどうしようもない。
- Q:linker scriptはどこまでサポートしている?
- A:gnuのはデフォルトリンカースクリプトがあってemacsのようになってたり。組込だとROMに置いて実行時にはRAMにコピーされるとか。ワイルドカードがつかえるのもつらい。
- Q:メモリ使用量のベンチマークは?
- A:mmapしているのであまりつかってないとおもう(mmapしっぱなしなので32bitだとつらいかも)。
- Q:multicoreは?
- A:読む順序に依存するところはシーケンシャル(あきらめている)で、リロケーションのところはparallel forにしている。
- Q:新しい機能はついかしたい?
- A:あまりかんがえてない。
- Q:ハッシュテーブルは?
- A:llvmのをつかっている。std::mapはorderdで遅いしunorderdも遅いし。
- 40日セフルコンパイラ
[2016-07-02 14:50]
[2016-07-02 14:52]
katiとか依存関係とかstraceとか / Shinichiro Hamaji, @shinh
- ビルドが遅いとイライラする。
- クリーンのときにmakeしても2分かかる。おそい。
- Android.mkはGNU makeがチューリング完全なのを悪用している。
- make→マケ→カチ→kati
- GoでかいてたけどセダイベツGCが機能してないのでC++で書き直した
- StringPiece C++:string_view
- ワイルドカードはtrieで
- Android.mkではfindしまくっているので自前で実装。
- gmake2分→ckati12.5秒
- Makefileがかきかわってなからったら環境変数がかわってなくて$(shellの結果もかわってなければbuild.ninjaを再利用。
- linux kernelがちょいちょいcore移動させるのでset_affinityしてる。
- STTNI: 空白区切りの文字列リストがよくある。h2oのコードを写経。
- sortも時間をくっている
- Makefileはerror prone。dependency sanitizer。straceで依存関係を自動であつめる。straceの中のprintfが遅い。straceしてるとfutexがタイムアウトするケースがあるっぽい。seccomp-bpf。
[2016-07-02 15:10]
[2016-07-02 15:12]
LLVMとC++でコンパイラフロントエンドをつくった / @Linda_pp
- 資料
- Lispってcommon lispじゃないよね
- おれおれ言語 Dachs: LLVMのフロントエンドとして実装。RubyのようにゆるくてGCあって静的型チェックありの静的リンク。
- AST: boost::variant(安全な共用体)をつかってノードを実装。
- parser: Boost.Split
- 意味解析,IR生成: visitorパタンでぐるぐる。
- バックエンドはぼぼLLVMにまるなげでいける。
- パーサがつらい:テンプレートをつかいすぎて遅い。gdbがクラッシュするレベル。
- 最適化:スタックプロモーション(ヒープのデータをスタックにうつすなど)
- LLVMのC++バインディングの変更がはげしいのがつらい。
- Q:LLVMをつかうと簡単になるけどおもしろい?
- A:動くまでの道が短かくなるので。
[2016-07-02 15:31]
休憩
[2016-07-02 15:36]
なんかトレースする話 / naruse, @nalsh
- 資料
- ps -eFIL: 特権いらない、副作用がない
- perf top: 動いているときには便利、待ちはわからない。RHEL5にはまだない。
- /proc/*/statで実行アドレスIPがわかるのでmapとあわせてみると実行中の関数がわかる (特権不要) gdbでアタッチできないときでもつかえる。
- gcoreでコアはかせてgdbでみる。.gdbinitかいたけど遅い(長い)。実用的にはpythonで書かないといけなさそう。
[2016-07-02 15:44]
[2016-07-02 15:45]
Progrmming TCP responsiveness / Kazuho Oku, @kazuho
- 資料
- TCP公平性のためにslow startが決められている。initial 10。1ACKでウィンドウ1.5倍
- TCP sndbufがあるので優先制御がさくさくうごかない。bioバッファもある。
- OOBは1バイトしか送れないのでつかいものにならない。
- bufはpollでわかる。TCP_NOSENT_LOWATでさらにきりつめられる。
- TCP_INFOをよんでTLSのサイズを調整する。
- 弊害: sndbufがほぼ空になるので遅延が発生。スループットも低くなる。
- RTTが大きくてCWNDが小さいときだけにする。
- イベントループでACKがきてからデータを用意するまでの平均時間を測る。
- Q:これってカーネルでやるべきでは?
- A:TCPをユーザランドにもってくれば? QUICでやるとか。
[2016-07-02 16:03]
[2016-07-02 16:05]
From IA-32 to AVX-512 / 光成滋生, @herumi
- 資料
- IA32の命令セットはディスアセンブルすると同じだけどおなじものがいくつかある。
- 32bitでは狭いレジスタ代入はほかのビットは保存されていたが64bitでは0にすることになった。
- xchg eax,eaxの意味が64bitでかわってしまったのでNOPと定義された。
- mov eax,eaxも上位をクリアするためにつかわれることがある。
- AVXのコードを実行するとdirty状態になってSSEがペナルティをくらう状態になる。(Intelがエミュレータを提供して検出はできる;linux perfでもできる)
- vzeroupperを呼ぶとcleanにもどれる。
- レガシーなレジスタとSSEのpackedとで0クリアしたほうがいいかしないほうがいいかがちがう。
[2016-07-02 16:26]
[2016-07-02 16:30]
Unix domain socket APIのポータビリティ問題 / 田中哲, @tanaka_akr
- 資料
- バークレーの人がクソなAPIにした。
- sun_lenは4.4BSDで追加。sun_familyが1バイトにされた。
- getsocknameでかえってくる流さがいろいろ
- connectとbindのパスがちがっているときのgetsockname。
- bindしてないソケットをgetsockname。
- nul以降にゴミあったらどうなるとか。
- sun_lenはカーネルは無視する、返すときは設定、というのがほとんど。
- nul terminateしてstructサイズを渡すのがベスト。
- Q: sockaddr_storage
- A: これより長いのを返すOSがある。
[2016-07-02 16:50]
休憩
隣の奥さんにHTTP2でなぜSCTPを採用しなかったのか聞いてみた
Q: NATごえ?
A: 優先度を指定できない
A: サーバ側からストリームを追加できなかったような(pushでつかう)
A: SCTPだと暗号化(TLS)がサブストリームごとになってしまう。
A: カーネルに実装されるには時間がかかる(フィードバックがおそい)
A: sctpからhttp2にフィードバックはあった。
[2016-07-02 16:55]
コンパイラを作った話 / 七誌, @7shi
- 資料
- C#で書いてからセルフホスティングしようして力尽きた(できるようになったけど)。
- すべて手書き。
- ビジュアルプログラミングでカーネル開発にもつかえる言語をつくりたかった。
- XMLをつかったらとても手打できないものになってしまった。
- そもそも人手でプログラミングする時代じゃないんでは?とおもいだした。機械学習でなんとかするとか。
- Q:スタックマシン?
- A:ASTの結果をそのままコードに変換して、中間結果はスタック。
[2016-07-02 17:02]
[2016-07-02 17:05]
L1キャッシュ怖い / @kumagi
- [[資料>>なし]]
- radix sortを速くしてた。
- counting sort → LSD radis sort
- software write combining(SWWC): L1がよごれないようにアドレスをかためてから書く。2,3割速くなる。
- NUMA環境ではCPUソケットをまたがるのであまり効かない。 → MSD radis sort (再帰的なコードになって速度が出ない)
- 1度だけMSD radix sortしてのこりはLSD radix sortにした。
- L1キャッシュあふれてでも分岐予測があたった方がはやくなった。L1こわい。
- Q:シングルソケットだとMSDいれた方がよい?
- A:NUMAじゃなくてもMSDいれてキャッシュに乗るようにしたほうが速い。
- もうキャッシュつかわないでスクラッチパッドつかった方がいいんじゃ。。。
[2016-07-02 17:17]
[2016-07-02 17:18]
StackExchangeで見たシステムプログラミング案件 / 八重樫剛史, @hogegashi
- 資料
- ゲーミフィケーションのさじ加減がよくできている
- repz retq: AMD K8のマニュアルに記述があるらしい。
- div zero(1/0)をかくとgccはそのままのコードを履くがclangはコードが消える(undefinedだから)。
- システムコールを使わずに正常終了できるのか?
- システムコールをつかわずにシグナルを送れるのはいくつあるか?
[2016-07-02 17:39]
[2016-07-02 17:39]
俺々OS用スケジューラの設計と実装 / @yitabashi
- [[資料>>なし]]
- 次のタスクを指定する機能もつけた (for RT)
- リンクリストがけっこうめんどくさかった。
[2016-07-02 17:52]
[2016-07-02 17:53]
REMarks: Recording and Annotation Tool for Reproducible Computational Research / @mkasahara
- [[資料>>なし]]
- ゲノム解析
- 一回きりの解析がほとんどだが、やりなおしがあるので記録しておきたい。
- LD_PRELOADでopenをのっとり記録。(ptraceはおそかった) staticリンクはなかったし。
- /procなどは無視するように。
- openをのっとるとハングするプログラムがたくさんあった→jemallocに再入してた(/procでコア数を調べるため)。
- Q: redoツールはいろいろすでにあるのでは?
- A: dyn loaderは生syscallよんでるのがひっかけられないとか、フックするAPIが多すぎるとか、つらい。
- Q: /tmpは?
- A: /tmpとかworkは無視するようにした。
[2016-07-02 18:03]
[2016-07-02 18:03]
Out-of-thin-airの話 / やまさ, @yamasa
- [[資料>>なし]]
- C/C++とJavaとでデータレースの言語仕様が異なる。
- atomic変数にたいしてmemory_order_relaxedでアクセスする場合とか。
- GPU系の人はもっと厳しいメモリモデルを提案している人もいる。
[2016-07-02 18:19]
[2016-07-02 18:19]
いくつかのSHA1実装の比較 / 岸本誠, @ksmakto
- 資料
- スループットとレイテンシ
- ソフトウェアで実装: 1箇所 xor か or のどちらでもよいところがあった。RTLと比較する目的も。
- ループで実装したのとアンロールしたの(2/3くらいの時間)とSSSEつかったもの(1/2くらいの時間)を比較してみた。
- キャッシュがあたたまるとループは速くなる。
- Q:SHAはデータ依存がひどいのでSSEで並列化されるのは自明ではない?
[2016-07-02 18:33]
[2016-07-02 18:35]
No More "No prototype function" / Hiroyuki Miyazaki, @simotin13
- [[資料>>なし]]
- 戻り値がunsigned charなのにプロトタイプ宣言がなかった場合。
- 戻り値の型をバイナリに埋め込んだらいいんじゃね?
- ルネサスのCPUだと戻り値は常に32bitになって発覚しなかったり。
[2016-07-02 18:44]
懇親会
30人くらいでサッポロの THE PERFECT BEER GARDEN 2016 にて。個人で食券買ってビールとツマミを購入するスタイル。営業終了まで続いた。
帰り、道がわからなかったので東京駅まで(たぶん)@9_tiesさんに送ってもらった。
終電おわってたので橋本駅から家まで歩いて1:30。つかれた、はらへった、でも眠いから寝る、充実した一日だったような気がした。