2010-09-17 39 views
6

看起來像clojure will have a fork-join implementation它看起來像一個java的fork連接框架的功能包裝。clojure pmap/preduce vs fork-join

我想知道這些和pmap/preduce有什麼區別?

+0

這將是在Clojure中,綴大會上發言的話題:http://clojure-conj.org/speakers#liebke David liebke現在正積極研究clojure的下一個版本 – 2010-09-17 21:39:47

+0

@Alex,這個抽象是什麼促使了這個問題:)。 – Surya 2010-09-18 00:41:14

+0

對ClojureCLR上的fork-join的實現策略是否有任何想法?或者通常確保fork-join API對其他實現是友好的? – 2010-09-18 23:30:49

回答

3

叉連接比基於序列的pmap/preduce更普遍,並且應該允許對並行性進行更細粒度的控制。爲此做的確切的API仍然在空中。

2

從查看代碼中可以看出,它們的功能基本相同 - 唯一的區別是pmap使用代理線程池上運行的期貨,因爲它是底層原語,而使用fork-join。

我不能肯定地說,但我認爲在一般情況下哪一個性能更好的將成爲pmap的標準實施方案,除非有足夠的權衡來使兩者都值得。

它看起來像(至少現在)fork-join框架只支持向量,所以它不是半懶惰的,如pmap

1

據我所知,其中一個區別是,pmap只會在給定的「塊狀」程度上運行。該函數映射到給定的序列的每個成員pmap。如果粒度太小,則並行性的潛在益處會被吞併,造成管理太多Future的開銷。

叉聯接使工作竊取,以便在每個線程上運行多少可以適應。

1

pmap或pvmap都不會讓我們無需使用正確的塊大小。對於我的項目,通常意味着將數據拆分爲塊,並在每個塊上使用映射,然後使用pmap並行映射塊。然後減少並變平。