![](/img/trans.png)
[英]Why is concurrent haskell non deterministic while parallel haskell primitives (par and pseq) deterministic?
[英]Why do we need 'seq' or 'pseq' with 'par' in Haskell?
我試圖理解為什么我們需要標准示例代碼的所有部分:
a `par` b `pseq` a+b
以下為什么不夠?
a `par` b `par` a+b
上面的表達式似乎非常具有描述性:嘗試並行計算a
和b
,並返回結果a+b
。 僅僅是效率的原因:第二個版本會引發兩次而不是一次?
以下,更簡潔的版本怎么樣?
a `par` a+b
為什么我們需要確保b
前計算a+b
為在原有標准碼?
好。 我想以下文章回答了我的問題: http : //community.haskell.org/~simonmar/papers/threadscope.pdf
總之,問題所在
a `par` b `par` a+b
和
a `par` a+b
是缺乏評估的順序。 在這兩個版本,主線程到達上工作a
(或有時b
)立刻,馬上引起火花“嘶”走,因為沒有更需要啟動一個線程來評估哪些主線程已經開始評估。
原始版本
a `par` b `pseq` a+b
確保主線程在 a+b
b
之前 a+b
(否則將開始評估a
),從而使spark a
有機會實現為並行評估的線程。
a `par` b `par` a+b
創建兩個火花a
和b
,但是a+b
則立即進入所以火花之一將結果失敗(即,它在主線程進行評價)。 問題在於效率,因為我們創造了不必要的火花。 如果您使用它來實現並行分而治之,則開銷將限制您的加速。
a `par` a+b
似乎更好,因為它只會產生一個火花。 然而,試圖評價a
前b
將會以失敗告終火花的a
,和b
不產生火花,這將導致順序計算a+b
。 將順序切換為b+a
將解決此問題,但作為代碼,這不會強制執行排序,Haskell仍然可以將其評估為a+b
。
所以,我們做a `par` b `pseq` a+b
給力的評價b
在主線程之前,我們試圖評估a+b
。 在我們嘗試評估a+b
之前,這給了實現a
機會,並且我們沒有創造任何不必要的火花。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.