Multithreading 在Haskell程序中评测多线程性能&x2014;没有使用并行策略的加速
在尝试在Haskell程序中添加多线程功能后,我注意到性能根本没有提高。通过追踪,我从threadscope获得了以下数据: 绿色表示正在运行,橙色表示垃圾回收。 这里垂直的绿色条表示火花创建,蓝色条表示并行GC请求,浅蓝色条表示线程创建。 标签是:spark created、请求并行GC、创建线程n和从cap 2窃取spark 平均而言,我在4个内核上只获得了大约25%的活动,这在单线程程序上没有任何改进 当然,如果没有对实际计划的描述,这个问题将是无效的。本质上,我创建了一个可遍历的数据结构(例如树),然后在其上fmap一个函数,然后将其输入到一个图像写入例程中(解释了程序运行结束时,经过15秒的明确的单线程段)。函数的构造和fmapping都需要花费大量的时间来运行,尽管第二个函数的运行时间稍长 上面的图表是通过在图像写入之前为该数据结构添加一个parTraversable策略生成的。我还尝试在数据结构上使用toList,然后使用各种并行列表策略(parList、parListChunk、parBuffer),但每次在大范围的参数(甚至使用大数据块)上的结果都是相似的。Multithreading 在Haskell程序中评测多线程性能&x2014;没有使用并行策略的加速,multithreading,haskell,parallel-processing,profiling,Multithreading,Haskell,Parallel Processing,Profiling,在尝试在Haskell程序中添加多线程功能后,我注意到性能根本没有提高。通过追踪,我从threadscope获得了以下数据: 绿色表示正在运行,橙色表示垃圾回收。 这里垂直的绿色条表示火花创建,蓝色条表示并行GC请求,浅蓝色条表示线程创建。 标签是:spark created、请求并行GC、创建线程n和从cap 2窃取spark 平均而言,我在4个内核上只获得了大约25%的活动,这在单线程程序上没有任何改进 当然,如果没有对实际计划的描述,这个问题将是无效的。本质上,我创建了一个可遍历的数据结
在将函数应用于可遍历的数据结构之前,我还尝试对其进行全面评估,但出现了完全相同的问题 以下是一些附加统计信息(针对同一程序的不同运行): 我不确定我还能提供什么有用的信息来帮助回答这个问题。分析并没有揭示任何有趣的东西:它与单核统计数据相同,只是增加了一个空闲时间,占用了75%的时间,正如上面所预期的那样
发生了什么阻止了有用的并行化?很抱歉,我无法及时提供代码来帮助受访者。我花了一段时间才弄清问题的确切位置 问题如下:我正在映射一个函数
f :: a -> S b
在可遍历的数据结构上
structure :: T a
其中S和T是两个可遍历函子
然后,当使用parTraversable时,我错误地写了
Compose (fmap f structure) `using` parTraversable rdeepseq
而不是
Compose $ fmap f structure `using` parTraversable rdeepseq
因此,我错误地使用composets的可遍历实例来执行多线程处理(使用Data.Functor.Compose)
(这看起来应该很容易抓住,但我花了一段时间才从代码中提取出上面的错误!)
现在看起来好多了
您是否在某个地方有代码,或者至少有代码的相关部分?一旦我从我拥有的程序中提取了相关代码,剩下的就是我上面概述的描述,因此我觉得包含任何实际代码都没有帮助。我也不知道我使用的fmap函数是什么有什么关系,只要它是纯函数(它是纯函数)。无论如何,这应该是可并行的,即使可遍历结构的构造可能不是。也许,你自己会发现问题所在。如果不是的话,我们可以看看回购协议。关于问题,你无法弄清楚的是,它们往往会出现在你认为不应该看到的地方。:-)英语是描述计算机程序的一种相当模糊的语言,人们不能用它来为自己编译和试用。
Compose $ fmap f structure `using` parTraversable rdeepseq