【发布时间】:2016-02-06 22:09:08
【问题描述】:
在函数式编程中,map 函数的一个好处是它可以实现为并行执行。
因此,在 4 核硬件上,此代码和map 的并行实现将允许同时处理 4 个值。
let numbers = [0,1,2,3]
let increasedNumbers = numbers.map { $0 + 1 }
好的,现在让我们谈谈reduce 函数。
返回重复调用 combine 的结果和一个累积的值 依次初始化为 initial 和 self 的每个元素的值,即 return combine(combine(...combine(combine(initial, self[0])), self[1]),...self[count-2]), self[count-1]).
我的问题:可以实现reduce 函数以便并行执行吗?
或者,根据定义,它是只能按顺序执行?
例子:
let sum = numbers.reduce(0) { $0 + $1 }
【问题讨论】:
-
这取决于操作...如果你有一个关联的,那么是的,你可以做
(a % b) % (c % d)而不是((a%b)%c)%d例如(并且在外部之前并行执行内部操作(如果%是操作) -
有时您可以分解操作本身 - 一个很好的示例是排序,您可以执行诸如合并排序(可以并行)之类的操作,而不是插入排序;)
-
您可以认为
map是reduce的一个特例。现在这对您的问题意味着什么? :-) -
@Bergi:嗨,Bergi,我很难将
map视为reduce的特例,因为map确实由其他元素独立处理数组的每个元素。事实上,map中的闭包仅接收数组的i-th元素。所以在这里我认为并行化没有问题。另一方面,reduce中的闭包,当应用于第 i 个时,确实需要将reduce应用于(i-1)-th元素(这可能是并行化的问题)+ 当前元素的结果。跨度> -
@appzYourLife:所以你正在处理数组,而不是列表?并有热切的评价?理论上,
reduce可以产生一个结果,其部分可以并行评估。这在实践中是如何实现的,以及它以何种方式等同于您想到的map调用的并行评估,是另一回事。
标签: parallel-processing functional-programming simd