我明白如何地图很容易并行化的。 - 每个计算机/ CPU可以在阵列的一小部分刚好操作

时缩小/与foldl并行?这似乎是每个计算依赖于前一个。难道仅仅是并行对于某些类型的功能是什么?

有帮助吗?

解决方案

如果您减少潜在的操作是联想*,您可以用操作和本地的顺序播放。因此你经常在“收集”相类似树的结构,这样就可以在对数时间几次通过做到这一点:

a  +  b  +  c  +  d
 \   /       \   /
 (a+b)       (c+d)
     \       /
   ((a+b)+(c+d))

代替(((A + B)+ C)+ d)

如果您的操作是可交换的,进一步优化是可能的,你可以以不同的顺序收集(当这些操作例如为向量操作它可以是用于数据对齐是重要的)

[*]的真实期望的数学运算,而不是那些在有效类型,如当然浮动。

其他提示

是,如果操作者是关联的。例如,您可以parallelise合计数值的清单:

step 1: 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8
step 2:   3   +   7   +   11  +   15
step 3:       10      +       26
step 4:               36

此工作,因为(A + B)+ C = A +(B + C),即,其中所述添加是进行无关紧要的顺序。

不知道什么平台/语言你想的,但你可以并行减少这样的运营商:

// Original
result = null;
foreach(item in map) {
    result += item;
}

// Parallel
resultArray = array();
mapParts = map.split(numThreads);
foreach(thread) {
    result = null;
    foreach(item in mapParts[thread]) {
        result += item;
    }
    resultArray += result;    // Lock this!
}
waitForThreads();
reduce(resultArray);

可以看到,一个并行实现是容易递归的。你分割地图了,就在自己的线程每一个部分进行操作,然后执行另一个减少,一旦这些线程完成带来的拼凑。

(这是后面彼得Lesnick的回答中的编程的推理。)

技术上一个降低是不一样的,为与foldl(倍左),其也可以被描述为一个累加。

儒勒给出的例子示出了降低操作非常好:

step 1: 1 + 2 + 3 + 4 
step 2:   3   +   7   
step 3:       10      

请注意,在每个步骤中,结果是一个数组,包括最后的结果是一个项目的阵列。

一个折叠式左边是这样的:

step 0: a = 0
step 1: a = a + 1 
step 2: a = a + 2 
step 3: a = a + 3
step 4: a = a + 4
step 5: a

现在显然这些都产生相同的结果,但与foldl具有定义良好的结果给出当非结合运算符(如减)而减少操作员不。

这取决于你减少一步。在Hadoop的风格MapReduce实现,你减速获取调用一次的每个键,的所有相关到关键的行。

因此,例如,你的映射器可能会采取了很多无序的Web服务器的日志,加入一些元数据(例如,地理编码),并发射与一个cookie ID作为键[键,记录]对。你减速然后将每个Cookie ID调用一次,并会喂所有数据该cookie,并可以计算汇总信息,如访问次数或者每次访问浏览网页的平均。或者你可以在地理编码数据的密钥,并且收集基于地理的汇总统计。

即使你不是每个键进行综合分析做的 - 事实上,即使你的东西计算在整个集 - 有可能打破你的计算成块,其中的每一个可以反馈到减速

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top