Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 在Haskell程序中评测多线程性能&x2014;没有使用并行策略的加速_Multithreading_Haskell_Parallel Processing_Profiling - Fatal编程技术网

Multithreading 在Haskell程序中评测多线程性能&x2014;没有使用并行策略的加速

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%的活动,这在单线程程序上没有任何改进 当然,如果没有对实际计划的描述,这个问题将是无效的。本质上,我创建了一个可遍历的数据结

在尝试在Haskell程序中添加多线程功能后,我注意到性能根本没有提高。通过追踪,我从threadscope获得了以下数据:

绿色表示正在运行,橙色表示垃圾回收。 这里垂直的绿色条表示火花创建,蓝色条表示并行GC请求,浅蓝色条表示线程创建。 标签是:spark created、请求并行GC、创建线程n和从cap 2窃取spark

平均而言,我在4个内核上只获得了大约25%的活动,这在单线程程序上没有任何改进

当然,如果没有对实际计划的描述,这个问题将是无效的。本质上,我创建了一个可遍历的数据结构(例如树),然后在其上fmap一个函数,然后将其输入到一个图像写入例程中(解释了程序运行结束时,经过15秒的明确的单线程段)。函数的构造和fmapping都需要花费大量的时间来运行,尽管第二个函数的运行时间稍长

上面的图表是通过在图像写入之前为该数据结构添加一个parTraversable策略生成的。我还尝试在数据结构上使用toList,然后使用各种并行列表策略(parList、parListChunk、parBuffer),但每次在大范围的参数(甚至使用大数据块)上的结果都是相似的。
在将函数应用于可遍历的数据结构之前,我还尝试对其进行全面评估,但出现了完全相同的问题

以下是一些附加统计信息(针对同一程序的不同运行):

我不确定我还能提供什么有用的信息来帮助回答这个问题。分析并没有揭示任何有趣的东西:它与单核统计数据相同,只是增加了一个空闲时间,占用了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