我正在学习Haskell中的半显式并行性,并且有些困惑。
par :: a -> b -> b
人们说,这种方法允许我们通过并行计算Haskell程序的每个子表达式来实现自动并行化。但是这种方法有以下缺点:
1)它创建了太多的小工作项,不能有效地进行调度。据我所知,如果你对Haskell程序的每行都使用par函数,那么它将创建太多的线程,这根本不切实际。这是正确的吗?
2)使用这种方法,数据依赖关系会限制并行性。如果我理解正确,这意味着每个子表达式必须是独立的。就像在par函数中,a和b必须是独立的。
3)Haskell运行时系统不一定会创建一个线程来计算表达式a的值。相反,它会创建一个spark,有可能在父线程之外的不同线程上执行。
所以,我的问题是:最终运行时系统会创建一个线程来计算a吗?或者如果需要计算表达式b,则系统会创建一个新线程来计算a吗?否则,它将不会创建。这是正确的吗?
我是Haskell的新手,所以也许我的问题对于你们所有人来说仍然很基础。谢谢你的回答。
1 + (inc 2)
,其中 inc 是增量函数,那么计算可以用带有操作或函数应用的节点以及每个叶子上的简单值的树来表示。因为 Haskell 避免了工作重复,一些节点可能指向其他子树,所以我们有一个图。图还原是将函数应用于运算符以将图还原为结果值的过程。例如:1 + (inc 2) -> 1 + 3 -> 4;这个视频可以帮助您可视化此过程:http://www.youtube.com/watch?v=ZebxyrCb1ug - jev