[2021-03-20 13:30]

sat / オープニング

[2021-03-20 13:33]

rui314 / 超高速リンカmold

  • リンカはなんどか作ってる
  • lldは広くつかわれている
  • リンカはドキュメントがよくないが難しいものでない。
  • リンカの存在意義: 分割コンパイルして時間を節約したい そもそも一発でサイズ的にコンパイルできない。
  • ローダー: 実行ファイル→メモリ
  • リンカ: オブジェクトファイル→実行ファイル
  • リンカの基本機能: オブジェクトをまとめてリロケーションを適用する
  • 静的ライブラリ: オブジェクトファイルのかたまり、小分けになっていて必要なものだけつかうようになっている。セキュリティーアップデートがあったときにリンクしなおし。
  • 共有ライブラリ: 実行ファイルに埋め込まなくてもよい。アップデートしたときにプログラムが異常になる可能性。
  • 動的リロケーション: 実行時にアドレス書き換え
  • PLT(procedure linkage table)/GOT(global offset table): テキストセグメントを書き換えなくてもよくなるように間接ジャンプ/間接参照
  • リンカがやること: オブジェクトファイル・ライブラリをよむ→シンボル解決→PLT/GOTを決める→レイアウトを決める→ XXXX
  • リンカが速くなるとうれしいこと: 差分ビルドが速くなる。
  • chrome(2GB): gold 10秒、mold2秒
  • なぜ速いか?: 中間表現をつかわない(mmapしてそのままつかう)。並列化する(lldでもがんばったけど)。
  • chromeのリロケーション: 35000000 とにかく多い
  • 基本的にデータ並列で。Intel TBBをつかっている。並列forループ。
  • 並行コンテナをつかう。ロックフリー。tbb::concurrent_hash_map。シンボル解決。
  • map-reduceパターン: build-idオプションで利用。2GBのハッシュ値の計算でハッシュ値のハッシュ値で。
  • paralle scanパターン: 文字列のオフセットを計算するときに中間値をおぼえておくことで高速化(つかってないけど)
  • malloc: mimallocが一番スケールした。
  • ファイルは上書きする方が速い。
  • 大量にmmapするとexitが遅くなる。
  • 速くするヒント:
    • 推測せずに計測する
    • テータが先、コードは後
    • 何度も書く 二度目は早く書ける
  • 差分リンクはうまくやらないと速くならない。ローカルな変更かどうかむづかしい。
  • リンク時最適化(LTO): llvmの吐いたビットコードをリンク時にコンパイルする。でも時間がかかって遅い。
  • moldはX86_64専用でつくっている。Linuxでしか試してない。最初から移植性を考えるとたいへん。

[2021-03-20 14:09]

[2021-03-20 14:09]

KOBA789 / 音の出る CPU

  • DBMSをつくってる。
  • 近年自作CPUがアツい!
  • CPUはシリコンでできている。いがいと知られてないですが。
  • でも半導体でなくても作れる
  • 小学生のときに300個リレーを買った!
  • 困りごと:
    • リレーで論理回路をつくるときの知見はインターネットにころがってない! (インターネット以前のものだから)
    • シミュレータがない
  • まずは回路CADをつくる! (今回の発表の進捗)
  • リレーのコイル片側は必ずGNDにするとショートしなくなる。シミュレータも作りやすくなる。
  • CADとシミュレータを融合して動く回路図に。60fpsでヌルヌル動いてほしい。
  • いまどきのGUIはReactとTypeScriptだが、きつい。遅いコードもひどい。
  • Rustで書いてwebassembleでWebGLをつかう。
  • WebGL(OpenGL)は三角しか書けない。CADとしては機能が足りない→実装
  • Immediate mode GUI(IMGUI): ステートレスで毎回書き直す(差分更新しない)。ゲームエンジンと相性がいい。
  • GPUが速いから問題ない。CPU→GPUのRPCが遅いだけ。減らせばOK。1回まで減らした。
  • デモ: リレー30個でリングオシレータ、全加算器
  • SVGだと実装は楽だがスケールするか心配。CADの内部状態とSVGの状態を同期されるのが面倒。
  • 音は実装がまにあってないだけ。
  • WebGLをたたくにはいちどjavascriptの世界をとおるが、そもそも処理が重いので問題ない。
  • HDL: 効率はいいけど楽しくない。趣味だし。

[2021-03-20 14:34]

[2021-03-20 14:35]

inductor / Red Hatが新しく作り始めたVMMの話

  • 10分で完全理解したかったlibkrun
  • 最低限のデバイスエミュレーションとC APIを備えたRustのmicroVM
  • firecrackerからコードを拝借している
  • vsockベースのTSI(transparent socket impersonation) virtio-netをつかわず
  • コンテナのプロセス分離をVMでやる (gVisorとかKata Containerとか)
  • Kataだとコンテナ間が共有されてしまう。
  • network namespaceで連携

[2021-03-20 14:44]

休憩 10分

IMG_20210320_144710

[2021-03-20 14:55]

msyksphinz / Rustで作るフルスクラッチQEMU型エミュレータ

  • QEMU型(binary translation)の命令セットエミュレータを作った。
  • RTLシミュレータと命令セットシミュレータで動作つきあわせて確認したり。
  • QEMU: システム全体をエミュレートできるのが特徴
  • ゲストアーキテクチャ→TCG(tiny code generator)→ホスト命令
  • インタプリタ型(1命令ごと解釈)
  • バイナリ変換型(ゲスト命令をゲスト命令に変換して実行する)
  • QEMUは中間コードの最適化が強力
  • 自作QEMUのデバッグがたいへん。どんな命令が生成されたか確認できない。DWARFを吐ければいいが。
  • 自作QEMU on 本家QEMUで解決!
  • riscv-testsでAtomic命令以外は動作確認
  • Spikeよりは速いがQEMUより遅い。
  • QEMU高速化テクニック
    • TCB Block Chaining (basic block)
      • basic blockの出口(分岐)で制御モードに戻っている
      • ジャンプ命令で直接飛ぶようにスタブを書き換える
      • プロファイルとったらエミュレーションの時間よりも制御時間が多い
    • TCG Lookup and Jump
      • レジスタ間接ジャンプのきにテーブルを索く
  • Rustを使ってよかったか? よくなかったところ:
    • ゴリゴリにメモリアクセスするのでunsafe文ばかりになってしまう
    • ジャンプ先がコンパイラが知らないところなので静的解析できない
  • エミュレータのシミュレータのちがい: CPUのコアだけ模擬するのがシミュレータ、システム全体だとエミュレータと呼んでるような気がする。

[2021-03-20 15:19]

[2021-03-20 15:21]

mzyy94 / HDMI探検隊

  • HDMIの機能: 映像、音声、イーサネット、機器コントロール、ディスプレイ制御(CEC,DDC)
  • CEC: 単線バス規格
  • DDC: I2C
    • DDC/CI 輝度音量変更など
    • HDCP コンテンツ保護 鍵交換
    • EDID 表示情報
    • SCDC HDMI2.0
  • RaspberryPiでいじってみる
  • CEC: apt install cec-utils、 cec-client -s <<< "tx .."
  • CECは認証がないので送信元を偽装できる。低速なのでバスが詰る(妨害できる)。
  • DDCは/boot/config.txtでデバイスツリーでI2Cバスを直接さわる。
  • i2cdetect -y 2 (rappi4は 12)
  • BadHDMI: 悪意をもったHDMI機器 (CECやDDCに認証機構がないため)
  • CECを傍受してリモコン入力のパスワードを盗むとか
  • #BadHDMI

[2021-03-20 15:32]

[2021-03-20 15:32]

mu-mu-mu / Intel MPK入門

  • memory protection keys
  • プロセス内のメモリアクセス権限をページテーブルの設定以外でできるように
  • Ring3で設定できる (コンテキストスイッチ不要)
  • あらかじめページテーブルにPkeyを設定しておけば wrpkruでアクセス権・ライト権を設定(PKRUレジスタ)
  • まだアプリではほとんどつかわれてない。アプリの改造がたいへんだからか。
  • ざっくり2回以上権限を変えるならmprotectより速くなる。

[2021-03-20 15:42]

[2021-03-20 15:43]

nullpo_head / WebAssemblyのWeb以外のこと全部話す

  • google meetの背景ぼかしにつかわれている
  • web外wasm: wasmer, envoy, krustlet, kernel-wasm, nabulet
  • Wasmがあついのはなぜか: Java(portable), CLI(bytecode), NaCl/eBPF(sandbox), Lua(embeddable) を複合的に解決しようとしている
  • 特徴: safe, language-independent, porable, open
  • 言語仕様がちいさいのでバックエンドをつくりやすい
  • オブジェクトファイルフォーマットが決まっている
  • なにができるかはwasm外とのインターフェースで決まる。
  • WASI: OS上でwasmを動かすためのAPI/ABI。posixとおなじかちょい下。安全性はsystemcallの安全性に依存する。capabilityで対応する予定。スマホのようなセキュリティモデルがネイティブアプリでも。
  • Proxy-wasm: proxyでパケットをさわる。
  • 双方向(hostcall,guestcall),safe,portable,fastなところはwasmがはまる
  • 2008年にwasmがあったらdockerがなくてもよかっただろうとdockerの中のひとがいっているらしい。

[2021-03-20 16:06]

休憩 10分

IMG_20210320_161301

[2021-03-20 16:15]

herumi / WebAssembly向け多倍長演算の実装

  • パアリング: 暗号文の内積や署名の集約ができる高機能暗号
    • 暗号文のまま積和演算(L2準同型暗号)
    • クロス集計につかえる
    • http://herumi.github.io/ango
    • 楕円曲線をつかう
    • 384bitの整数の(x+y)%p, (x*y)%p がたくさんでてくる
  • wasmにはCでできる範囲の演算しかなくキャリーがない。
  • キャリーがあるかは (x+y) < x でわかる
  • clang-11でuint128_tをつくれる拡張 _ExtInt がはいった。
  • emccをつかっている(clangではなく)
  • wasmで暗号化はどのくらいサイドチャンネル攻撃の対策は? スマホならいいけどサーバサイドだと対策が必要だろう(定数時間で演算するモード

を用意するなど)。

  • mod pはどうしている? 話すと長いので省略した。
  • SIMDはツールがこなれてきてないので様子見。

[2021-03-20 16:40]

garasubo / RustでOSをつくると何がうれしいかを論文から探る

  • Rustをつかうことで新しいOSの設計を模索する論文を紹介する。
  • Tock
    • 省メモリなマイクロコントローラ用OS Arm Coretex-Mなどが対象
    • アプリの独立性をたもちつつ柔軟性もほしい (静的リソース確保を避けたい(最大値を決めるのがむづい))
    • Grants: システムコールで動的にメモリを確保するときに、プロセスのメモリGrant型としてをOSに貸し出す。エラーをつけて返す。
  • ReadLeaf
    • Rustをつかったマイクロカーネル
    • Rustの言語機能でfalut isolation
    • posixサブセットを実装
    • 共有ヒープをつかったドメイン間通信
    • ドメインがクラッシュしても参照型 RRef のドメイン情報で対応できる
  • Theseus
    • コンポーネント間のステートスピル(情報のもれだし)を少なくする
    • OSの実行モデルと言語の実行モデルを近づける
    • すべてのコンポーネントをおなじアドレス空間でうごかす
    • 言語制約でタスクのリソースを管理

[2021-03-20 16:50]

[2021-03-20 16:51]

tj8000rpm / OVS-DPDKとOpenStackで作るおうちNFV環境の構築

  • DPDKの思想: CPUコアがたくさんあるのでカーネルじゃなくてアプリでやる。CPUとNICをひもづける。
  • OvS(open vswitch): 安定している。DPDK対応
  • ハイパーバイザーでは実コアを意識する。共有キャッシュとか。
  • TCP: iperf: 余裕で10Gbps達成
  • UDP: DPDKのpkggenで測ると7Mpps。

[2021-03-20 17:01]

[2021-03-20 17:01]

fadis / Wasserstein逆FM音源

  • パラメータ調整がむつかしくて滅んだ。
  • 遺伝的FM音源: ピアノの音をそこそこ再現するパラメータがみつかった。人間がだめなだけだった。でも運だのみ。
  • 勾配法で探そうとしても谷がたくさんあって最小点に辿りつけない。
  • ωに制約をつけると探索しやすくなる。でも倍音が少ない。倍音の周波数もズレてしまう。音が似てない。
  • 損失関数: 平均二乗誤差は適していない→wasserstein距離: なめらかな誤差になった。
  • でも解析的に微分できな→数値的にやればよい
  • 課題: 計算に時間がかかる。微分の計算に時間がかかる。

[2021-03-20 17:12]

Unterground_idle / Linux KernelにおけるCompactionについて

  • compaction: alloc/deallocの繰り返しのfragmentationを緩和する
  • movable pagesをfree pagesに移動する。
  • isolation pagesとしてロックをとりつづけないようにしている

nhoriguchi / Linuxのhugepageの開発動向

  • hugepage: 巨大化したアプリを実行するときにTLBの利用効率を上げる。
  • ちょっと性能が上がる。
  • linuxにはhugetlbとthp(transparent hugepage)の2つの実装がある。
  • DBではthpは無効にされることが多い。
  • vmemmap page (struct page): 物理メモリの1.6%を専有する。
    • hugepageでおなじ内容なら節約できる。
  • thp page cache support: anonだけでなくふつうのページキャッシュでも利用できるように。
    • ページが共有されていてもよいようにページのsplitとマッピングのsplitを分けられる。
  • XArray: radixtreeのおきかえ multi index entryが便利
  • thp失敗したときにどうするか
    • always: compactionをためす
    • defer: 4KBにfallbackして裏でcompaction
    • never: 4KBにおちる
    • macvise: MADV_HUGEPAGEで指定されていればalways、でなければnever
    • defer+madvise:

[2021-03-20 17:32]

nekomatu

  • アンケートよろ

[2021-03-20 17:34]

配信はとてもスムーズだった。

休憩時間が短かいのはオンラインだからトイレが混雑しないというがあるかな。