並列ML: MaPLe v0.2 がリリースされていた

POPL 2021 の論文 Provably Space-Efficient Parallel Functional Programming が出たのに合わせて2020年末*1MaPLe v0.2 がリリースされていました。
前回の POPL の時は aobench を動かす記事 並列ML: MaPLe で AObench を高速化 を書きました。

MaPLe(mpl) は並列実行のために改良が加えられたML処理系(いわゆる Parallel ML)の一つで、処理系の提供する並列実行用関数を使うとスレッドを良い感じに割り当ててマルチコアを使うことが出来るようになることを目論んでいます(多分)。

v0.2 で提供される主なプリミティブは以下のようなもので、

signature FORK_JOIN = sig
  val par: (unit -> 'a) * (unit -> 'b) -> 'a * 'b
  val parfor: int -> (int * int) -> (int -> unit) -> unit
end

これは v0.1 と変わらず、これまでと全く同じコードが動きます*2

改良点

v0.2 での改良点は、ヒープアロケータをスレッドスケジューラと統合したことと、メモリ使用量の上限の理論的上限を与えたことです。
v0.1 では回収出来ないメモリがスレッド内に積み上がる可能性があったのを回避出来るようになりました。

これによって論文中のベンチマークでは最大メモリ使用量が大幅に減っており、シングルスレッド実行の場合でも MLton に対して顕著に最大メモリ使用量が減っています。
並列化したことによって(無駄にメモリ使用量が膨らんで)メモリ律速になることが避けられそうですね。

ただし、替わりに(?)実行時間は数%低下しているようです。

ベンチマーク(AObench)

毎度おなじみ AObench を動かして再現実験してみます。前回と全く同じVM環境上で動かします。

実行時間

処理系 real user sys
gcc 0m0.870s 0m0.876s 0m0.004s
mlton(20201002) 0m1.827s 0m1.836s 0m0.012s
mpl(20201216) 0m0.477s 0m1.855s 0m0.017s

MPLは前回よりやや遅くなっていますが、論文中でも実行時間は前回リリース時点に比べてやや(n < 10%)悪くなっていますので順当な結果と言えそうです。
他の処理系でもやや処理が遅くなってますのでむしろ実行環境の方が心配されますね。。。(ストレージがヘタって来てるかな…)

メモリ使用量

メモリ使用量も簡単に比較しました。
一瞬で終わってしまいpsコマンドを動かす暇が無いため (width, height) = (1024,768) に設定しました*3
この設定だと4並列で6.5秒ほど掛かります。

f:id:eldesh:20210103140655p:plain
MPL v0.2 と v0.1 の AObenchSML に於けるメモリ使用量比較

最終的なメモリ使用量は v0.1 が 41216 kB、v0.2 が 33948 kB でした。18%の差があります。
このベンチマークはスレッド内でほとんど明示的にアロケーションしない(スレッドは全体のピクセル配列の担当行を更新する)のですが意外と差がつきましたね。

*1:2020/12/17

*2:manticoreさん…聞いてますか…?

*3:普段は (width, height) = (256, 256)