这是我的一本CS教科书中的一个问题.我很茫然.我不明白为什么它必然会导致并行计算.有人想指出我正确的方向吗?
"并行和并发编程"中的这个图表:http://chimera.labs.oreilly.com/books/1230000000929/ch03.html#fig_kmeans-granularity起初似乎表明存在严重的开销,引发太多.但是如果仔细观察y轴,你会发现它已被放大到有趣的部分.事实上,最佳和最差案例表现之间的比例约为80%,这也不算太糟糕.
一般来说,确定块的方式和数量是困难的,容易出错,极其特定于应用程序,并且明年当您购买具有更强处理能力的新计算机时可能会发生变化.我更倾向于总是使用rpar来获得最细粒度的物品并以25%的开销生活.
引发的开销通常会产生比此图所示更糟糕的成本吗?(特别是如果我总是折叠二叉树而不是列表,那么关于"顺序工作量"的第二个要点不适用)
针对Don Stewart的回答更新了问题:
火花池是否只包含一个所有处理器都难以访问的队列?还是有很多?
例如,如果我有一台具有无限处理器和二叉树的计算机,我想在所有叶子上取总和,如:
data Node = Leaf Int | Branch Node Node
sumL (Leaf x) = x
sumL (Branch n1 n2) = let (x,y) = (sumL n1, sumL n2) in (x `par` y) `seq` (x + y)
Run Code Online (Sandbox Code Playgroud)
这个程序会在O(#leaves)时间运行吗?或O(深度)时间?有没有更好的方法来写这个?
如果我抽出太多东西以获得满意的答案,请告诉我.我对haskell并行性如何工作的心理模型仍然非常模糊.
parallel-processing multithreading haskell overhead moores-law
如果摩尔定律成立,并且CPU/GPU变得越来越快,那么软件(以及协会,您的软件开发人员)是否仍然会在您仍然需要优化代码的范围内突破界限?或者一个天真的因子解决方案是否足以满足您的代码(等)?
我不知道有多少人面临这个问题.如果我用python,php,javascript之类的弱/动态类型语言进行编程几天,我会失去与c ++,Java,.net等强类型语言的联系.我最近听过人们喜欢编程的python和ruby等语言.
在弱/动态类型语言中编程非常简单,但存在与c ++,Java等语言失去联系的危险.处理器现在变得非常强大,根据摩尔定律,它将随着时间呈指数增长速度.因此,当我们从嵌入式语言转换为高级语言(如c ++,java)时,效率可能不会出现问题.
moores-law ×5
cpu-speed ×1
gpu ×1
haskell ×1
optimization ×1
overhead ×1
performance ×1
weakly-typed ×1