簡體   English   中英

為什么我們在Haskell中需要'seq'或'pseq'和'par'?

[英]Why do we need 'seq' or 'pseq' with 'par' in Haskell?

我試圖理解為什么我們需要標准示例代碼的所有部分:

a `par` b `pseq` a+b

以下為什么不夠?

a `par` b `par` a+b

上面的表達式似乎非常具有描述性:嘗試並行計算ab ,並返回結果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 ,是的。

但是, pseq 確保a + b之前評估a和b

有關主題的更多詳細信息,請參閱此鏈接

a `par` b `par` a+b創建兩個火花ab ,但是a+b則立即進入所以火花之一將結果失敗(即,它在主線程進行評價)。 問題在於效率,因為我們創造了不必要的火花。 如果您使用它來實現並行分而治之,則開銷將限制您的加速。

a `par` a+b似乎更好,因為它只會產生一個火花。 然而,試圖評價ab將會以失敗告終火花的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM