並列ML: MaPLe v0.2 がリリースされていた
POPL 2021 の論文 Provably Space-Efficient Parallel Functional Programming が出たのに合わせて2020年末*1にMaPLe 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%)悪くなっていますので順当な結果と言えそうです。
他の処理系でもやや処理が遅くなってますのでむしろ実行環境の方が心配されますね。。。(ストレージがヘタって来てるかな…)