- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个我正在尝试并行化的程序(带有可运行代码的完整粘贴 here )。
我分析并发现大部分时间都花在 findNearest
上。这本质上是一个简单的 foldr
超过Data.Map
.
findNearest :: RGB -> M.Map k RGB -> (k, Word32)
findNearest rgb m0 =
M.foldrWithKey' minDistance (k0, distance rgb r0) m0
where (k0, r0) = M.findMin m0
minDistance k r x@(_, d1) =
-- Euclidean distance in RGB-space
let d0 = distance rgb r
in if d0 < d1 then (k, d0) else x
parFindNearest
应该执行
findNearest
在较大的
Map
的子树上并行.
parFindNearest :: NFData k => RGB -> M.Map k RGB -> (k, Word32)
parFindNearest rgb = minimumBy (comparing snd)
. parMap rdeepseq (findNearest rgb)
. M.splitRoot
ghc -O2 -threaded
编译的结果并与
+RTS -s -N2
一起运行
839,892,616 bytes allocated in the heap
123,999,464 bytes copied during GC
5,320,184 bytes maximum residency (19 sample(s))
3,214,200 bytes maximum slop
16 MB total memory in use (0 MB lost due to fragmentation)
Tot time (elapsed) Avg pause Max pause
Gen 0 1550 colls, 1550 par 0.23s 0.11s 0.0001s 0.0004s
Gen 1 19 colls, 18 par 0.11s 0.06s 0.0030s 0.0052s
Parallel GC work balance: 16.48% (serial 0%, perfect 100%)
TASKS: 6 (1 bound, 5 peak workers (5 total), using -N2)
SPARKS: 215623 (1318 converted, 0 overflowed, 0 dud, 198111 GC'd, 16194 fizzled)
INIT time 0.00s ( 0.00s elapsed)
MUT time 3.72s ( 3.66s elapsed)
GC time 0.34s ( 0.17s elapsed)
EXIT time 0.00s ( 0.00s elapsed)
Total time 4.07s ( 3.84s elapsed)
Alloc rate 225,726,318 bytes per MUT second
Productivity 91.6% of total user, 97.1% of total elapsed
gc_alloc_block_sync: 9862
whitehole_spin: 0
gen[0].sync: 0
gen[1].sync: 2103
findNearest
返回自定义严格对数据类型而不是元组
Control.Parallel.Strategies
中的 rdeepseq ,但我的 Spark 仍然是 GC'd。
最佳答案
我不是平行策略方面的专家,所以我可能完全错了。但:
如果您通过设置足够大的分配区域来禁用 GC(例如,使用 -A20M
运行时选项),您会看到大多数 spark 已失败,而不是 GC。这意味着它们在相应的 Spark 完成之前通过普通程序流程进行评估。minimumBy
部队parMap
立即获得结果,开始评估它们。同时,sparks被调度和执行,但为时已晚。当 spark 完成时,主线程已经评估了该值。没有 -A20M
, sparks 是 GC'd 因为值是在调度 spark 之前评估和 GC'd 的。
这是一个简化的测试用例:
import Control.Parallel.Strategies
f :: Integer -> Integer
f 0 = 1
f n = n * f (n - 1)
main :: IO ()
main = do
let l = [n..n+10]
n = 1
res = parMap rdeepseq f l
print res
SPARKS: 11 (0 converted, 0 overflowed, 0 dud, 0 GC'd, 11 fizzled)
import Control.Parallel.Strategies
import Control.Concurrent
f :: Integer -> Integer
f 0 = 1
f n = n * f (n - 1)
main :: IO ()
main = do
let l = [n..n+10]
n = 1
res = parMap rdeepseq f l
res `seq` threadDelay 1
print res
SPARKS: 11 (11 converted, 0 overflowed, 0 dud, 0 GC'd, 0 fizzled)
l = [n..n+1000]
在我的示例中),并且它们不够重(尝试设置
n = 1000
在我的示例中)。
关于haskell - Parallel Haskell - GHC GC'ing sparks,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22638421/
以下片段的效果之间有什么区别(如果有的话): cout << "Some text" << s1 << "some more text\n"; cout << "Some text" + s1 + "
在解释器模式下运行 python 时,什么是 more-ing 或 less-ing 多行输出的最佳替代方案? 假设,存在一个对象变量foo,它有很多属性。 dir(foo) 会转储到屏幕上。我们无法
在阅读“Lucene in Action 2nd edition”时,我看到了关于 Filter 的描述。可用于在 Lucene 中进行结果过滤的类。 Lucene 有很多过滤器重复 Query类。例
为了满足我对 C 知识的渴求,在连接到我的家庭网络的两个 linux 机器上,我正在编写一个基本的 telnet,它包含 send() 和 recv( ) 的字符串(只是为了获得套接字和线程的一些经验
给定以下三个简单函数: func twice_Array_of_Int(a: [Int]) -> [Int] { return a + a } func twice_Array_of_T(a:
如我的 previous question 中所述,我正在尝试在功能上制作一些有点像向导的东西。我已经确定了一个单独的框架,并添加了一个sizer。我为希望用户看到的每个屏幕构建面板,将它们添加到框架
据我了解,range-v3 库的 View 操作(目前需要 C++17,但要成为 C++20 中 STL 的正式部分)提供了可链接的类 STL 算法,这些算法是延迟计算的。作为实验,我创建了以下代码来
如何选择来自一位特定作者的所有项目?可能这样吗?或者,如果我也想要很多项目类型和项目包(项目有很多项目),我该如何编辑实体? 元素 /** * @ORM\Table() * @ORM\Entity
我想选择以正则表达式结尾的单词,但我想排除以 thing 结尾的单词。例如: everything running catching nothing 这几个词中,选running和catching,排
使用 Julia 1.5.3 和 Julia 1.6.0 两个版本似乎都不支持 & 用于 BitArrays。 我有两个 BitArray,例如 x = BitArray([1,0,1]) 和 y=B
我有一个读取二进制文件然后使用 struct.unpack() 解压文件内容的函数。我的功能工作得很好。如果/当我使用长的“格式”字符串解压缩整个文件时,它会更快。问题是有时字节对齐会发生变化,因此我
阅读维基百科上的“ARM 架构”,发现以下说法: Registers R0-R7 are the same across all CPU modes; they are never banked. R
您好,我需要 ssh 到一个 IP 地址并通过 shell 脚本运行我的 Java 代码我就是这样做的 ssh $LINE java -Djava.library.path=/N/u/sbpatil/
该程序应该读取字符串输入的值并返回结果。 但是,当我使用 System.out.println(Arrays.toString(stack.toArray())); 为了检查堆栈在最后甚至在程序期间的
在 Alpine 镜像中构建的 GO 可执行文件存在一个奇怪的行为,其中标准 LD_PRELOAD 功能无法正常工作。 看起来像 构造函数未被调用 由动态加载器! 我有一个示例 go 应用程序(get
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求提供代码的问题必须表现出对所解决问题的最低限度的了解。包括尝试的解决方案、为什么它们不起作用以及预期结果
我在下面写这段代码,发现了这个奇怪的行为: #include #include #include using namespace std; int main() { map map1;
我对 JS 的 .sort() 函数理解得很好,对多维数组的理解也比较松散,但我有点卡住了。这是我得到的: var player1 = ["bob", 20]; var player2 = ["jon
在 python 中有更好的方法吗?: ((w.endswith('<') or w.endswith('')) 也许可以使用任何 最佳答案 字符串上的 endswith 方法可以将元组作为参数:
在 Javascript 中,有没有一种方法可以从数组中选择包含某些内容的单词。例如,["swimming", "basketball", "chess", "rowing"],我只想选择包含“-in
我是一名优秀的程序员,十分优秀!