multithreading - 对并行Haskell感到困惑

标签 multithreading haskell parallel-processing

这段代码如何:

parfib :: Int -> Int
parfib 0 = 1
parfib 1 = 1
parfib n = nf2 `par` (nf1 `par` (nf1+nf2+1))
           where nf1 = parfib (n-1)
                 nf2 = parfib (n-2)

比这更好的是:
parfib :: Int -> Int
parfib 0 = 1
parfib 1 = 1
parfib n = nf2 `par` (nf1 `seq` (nf1+nf2+1))
           where nf1 = parfib (n-1)
                 nf2 = parfib (n-2)

我没有在网上找到的解释说“为了确保以正确的顺序对主表达式求值(即在不阻塞子任务的主任务的情况下,使用seq注释)”。

为什么使用seq?我知道这会迫使解释器首先评估parfib(n-1),但为什么有必要呢?

当执行第二个程序时,交互程序是否会在并行评估nf1 + nf2 + 1表达式的nf1时引发一个新的过程来评估nf2?有什么需要告诉它指定它应该以nf1开头?

最佳答案

nf1并行评估nf1+...并没有多大意义,因为后者依赖于nf1,因此它所要做的只是阻塞nf1的 Spark 。使用seq,只有在知道它已经被评估后,它才会尝试使用nf1

关于multithreading - 对并行Haskell感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/713150/

相关文章:

r - 如何使用 parRF 方法使随机森林运行得更快

Java:同步缓冲区

haskell - IHP - 如何通过自定义 Web Socket Controller 在客户端之间发送和接收数据?

algorithm - 计算奇数的 PRAM CREW 算法

c++ - OpenMP 和文件 I/O

haskell - Haskell 中 "!!"的含义

c# - 使用内存屏障

java - Spring:如何使@Component线程安全?

java - 将synchronizedList与for循环结合使用并在其中添加项目

haskell - IO 操作是否在绿色线程中运行?