Optimizing Hash-Array Mapped Tries for Fast and Lean Immutable JVM Collectionsの輪読会を開催したのでレポブログです。
OOPSLA2015で発表されたCHAMPというScalaのimmutable.HashMapとして採用されているデータ構造についての論文です。 実際にScalaのソースを見ても論文へのリンクがついていました。
CHAMP自体はHAMT(Hash Array Mapped Trie)というHashMapの改善バージョンといった位置づけで内部のデータ構造を効率化したり、JVM向けの最適化(JVMだとarrayもobjectだからlength propertyとか無駄になっちゃうよねとか)しているものでした。
いきなりこの論文を読み始めたんですがHAMTについてはっきり分かる形では書かれておらず、前提になっているアレコレを急いで調べたりしましたがそれはそれで学びになったのでよかったのではないでしょうか。
目次
- ScalaのHashMapに関する論文(Optimizing Hash-Array Mapped Tries for Fast and Lean Immutable JVM Collections)輪読会 in FOLIOを開催した - だいたいよくわからないブログ <- いまここ
- ScalaのHashMapに関する論文(Optimizing Hash-Array Mapped Tries for Fast and Lean Immutable JVM Collections)輪読会 in FOLIO メモその1 HAMT編 - だいたいよくわからないブログ
- ScalaのHashMapに関する論文(Optimizing Hash-Array Mapped Tries for Fast and Lean Immutable JVM Collections)輪読会 in FOLIO メモその2 JVM CompressedOOPs編 - だいたいよくわからないブログ
- ScalaのHashMapに関する論文(Optimizing Hash-Array Mapped Tries for Fast and Lean Immutable JVM Collections)輪読会 in FOLIO メモその3 CHAMP編 - だいたいよくわからないブログ
HAMT
HAMTについては以下の資料が理解に役立つと思います。特に最初のものが図解で基本的なアイデア(Hash値をn bitずつに区切ったtrie木を構築してbitmaskとともに圧縮して持つ)がわかりやすいと思いました。
- Introduction to HAMT — Idea of the day
- Optimizing Hash-Array Mapped Tries for Fast and Lean Immutable JVM Collections | the morning paper
- 元論文 = Ideal Hash Trees
動画も参考になると思います。
ベースとなる価値観としてimmutable collectionというかpersistent data structure周りの直感があると役に立つので 純粋関数型データ構造(PDFS) を読んだことがあるとピンとくるところがあるかもしれません。(読んだことがなくてもHAMTは理解できる)
このデータ構造のキモはbitmaskでデータを圧縮して持つことにありますが、その際にpopulation countというビット演算が利用されているところが興味深いところでした。popcntは様々なCPUで専用命令があるのである程度の処理性能の向上が期待できそうですね。
CHAMP
CHAMPについてはHAMTに比べると情報が少ないのですが下記が参考になると思います。
動画も参考になると思います。(同じタイトルですが別の人の別の講演)
内容的には新しいアイデアでHAMTを一歩すすめた形で、HAMTでお〜っとなった後に読むと面白いのではないかと思いました。(JVMの方が効く最適化ではあるものの、JVM以外でも有効なような気もする・・?みたいな疑問もあり解像度がすごい高い訳では無いですがアイデアは理解できたと思います。)
輪読会について
はじめは予習なしでアドリブでだらだら毎週ちょっとずつ読んでいこうという目論見だったのですが、前提知識などがある程度必要でその場で読み進めるのは難しそうだったので毎週二人ずつ予習して30分ずつ解説という形を取らせてもらいました。最初は予習なしで募集しておいてアレですがみんな快く予習&発表に協力してくれました。7人くらいでわいわいやれたので発表頻度的にもあまり頻繁ではなくできたかなと思っています。(木をcanonical formにする形式化のところを担当する人と、ベンチマーク取ってるところを担当する人で難易度の差が激しかったりはする)
普段使ってるScalaのデータ構造も意外と実装を知らなかったりするのでこういうところで一つずつ中身を知っていけるといいですね。
余談
4年越しで計画の1/6が進んだのであと20年くらいしたら全部読み終わるかもしれない₍₍ (ง´・_・`)ว ⁾⁾
読む予定があるわけじゃないけどscala collectionのコメントにある論文を集めてみた
— まっちゃら @ FOLIO (@matsu_chara) 2019年7月14日
ConcurrentTrie https://t.co/OYzQCB4Tjw
HashMap https://t.co/5ppRtytUFP
IntMap https://t.co/4gHFDLyHH4
RedBlackhttps://t.co/p5eEjsp9xD
RedBlack https://t.co/qWa2cqPtkQ
RedBlack https://t.co/FFIBO49Ay1