2011-10-09 60 views
5

當通過parfib.hs code在github上讀書,我看到了關於一元版本的內存分配此評論:空間分析

Monad-par version: 
fib(38) non-threaded: 23.3s 23.1s 
fib(38) 1 thread : 24.7s 24.5s 
fib(38) 4 threads:  8.2s 31.3s 
fib(40) 4 threads: 20.6s 78.6s **240GB allocated** 

是否有任何紙張或博客文章,解釋這個巨大的內存佔用?非單向版本的內存分配在代碼註釋中記錄爲17GB(對於fib(42))。我搜索了Simon Monlow的par monad論文和演示文稿,但是我還沒有看到parfib的內存佔用情況分析。

+3

請注意,在運行過程中分配240GB並不一定表示有任何運行時使用240GB的時間。 Haskell(以及其他基於功能語言的)程序傾向於執行分配和解除分配的時隙 - 這就是爲什麼很多關於GHC的優化研究關注分配策略和垃圾收集器的原因。 –

回答

4

我認爲這是我在源代碼中的評論。最大的問題是monad-par的默認實現使用了一個優雅但可能效率低下的體系結構,其中Par計算會生成Par動作的跟蹤作爲惰性數據結構。這對分離出調度程序邏輯非常有用,但編譯器並沒有完全清除(消除)中間數據結構。

有很多衆所周知的方法可以使這一點更好。這只是花時間來實施它們。如果你看看github倉庫最近的一些開發(在分支機構上),我們開始用它的前身工作(「Haskell CnC」)探索的一些替代調度策略來填充monad-par。

我們希望將下一個主要版本中的默認調度程序更改爲parfib行爲與「原始」par/pseq更接近的行爲。