gpt4 book ai didi

Haskell:为什么以下顺序运行?

转载 作者:行者123 更新时间:2023-12-02 13:18:29 25 4
gpt4 key购买 nike

美好的一天。给定代码

import           Control.DeepSeq
import Control.Exception
import Control.Parallel
import Control.Parallel.Strategies
import System.Environment
import Text.Printf

l = [34,56,43,1234,456,765,345,4574,58,878,978,456,34,234,1234123,1234,12341234]
f x = Just (sum [1..x])

fun1 :: [Maybe Integer]
fun1 = map f l `using` parList rdeepseq
fun2 :: [Maybe Integer]
fun2 = map f l `using` evalList (rparWith rdeepseq)
fun3 :: [Maybe Integer]
fun3 = map f l `using` evalList (rpar . force)

main :: IO ()
main = print fun1

为什么fun1fun2顺序运行?据我了解, rparWith 应该引发它的争论。答案 here 表示相同。但对于 fun1 和 fun2,我得到的输出类似于“SPARKS:0(0 已转换,0 已溢出,0 无效,0 GC'd,0 失败)”。所以 Sparks 甚至没有被创建。fun3 按预期工作并创建 Spark 。寻求帮助

UPD:我发现rdeepseq使书中的示例(Haskell中的并行和并发编程)按顺序工作。书上说:

And we can use parPair to write a Strategy that fully evaluates both components of a pair in parallel:

parPair rdeepseq rdeepseq :: (NFData a, NFData b) => Strategy (a,b)

To break down what happens when this Strategy is applied to a pair: parPair calls, and evalPair calls rparWith rdeepseq on each component of the pair. So the effect is that each component will be fully evaluated to normal form in parallel.

但是如果我跑

(Just (fib 35), Just (fib 36)) `using` parPair rdeepseq rdeepseq

甚至

(fib 35, fib 36) `using` parPair rdeepseq rdeepseq

Threadscope 仅显示一个正在运行的核心并创建了 0 个 Spark 。

fib 是这样实现的(也来自书本)

fib :: Integer -> Integer
fib 0 = 1
fib 1 = 1
fib n = fib (n-1) + fib (n-2)

最佳答案

rparWith 是使用 realWorld# 定义的,这是一个非常神奇的 GHC 内部值。它的使用方式本质上与应用有时称为accursedUnutterablePerformIO(更正式的说法是unsafeInlinePerformIO)的“函数”相同。仅当所讨论的 IO 实际上异常纯净时,使用它才是合法的。我们的想法是,由于 Eval 只是用于计算,所以应该没问题。但事实上,激发线程是一种 IO 效果,也是我们关心的!优化器以一种不幸的方式重新排列这些效果,导致它们最终被丢弃。修复方法是使用 unsafeDupablePerformIO 代替。这是一个表现更好的“函数”,而且似乎可以解决问题。请参阅the ticket了解详情。

注意:我最初的修复结果有点错误;现在已再次修改。

关于Haskell:为什么以下顺序运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50553279/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com