如何并行输入序列中的所有值?

时间:2016-02-04 06:42:20

标签: scala

我正在研究这个函数,它应该以并行的方式对输入序列中的所有值进行求和,以利用多个核心。

代码:

def paraSum(list: scala.collection.parallel.ParSeq[Int]): Int = ???

2 个答案:

答案 0 :(得分:3)

您可以使用sum

val source = (1 to 2000000).par
source.sum

如果您需要使用parallelSum,则应在访问accumulator时锁定map,以保护代码免受运行def parallelSum(list: scala.collection.parallel.ParSeq[Int]): Int = { var accumulator = 0 list.foreach(x => synchronized(accumulator += x)) accumulator } 的线程之间的竞争条件的影响:

int x= 56

但我不认为这是最好的方法。

答案 1 :(得分:1)

在集合的并行版本上使用aggregate,并将合并操作定义为中间总和的总和,例如像这样,

xs.par.aggregate(0)(_+_,_+_)

注意+上的Int是关联的和可交换的,因此我们可以并行地合并(总结)中间求和。在上面的表达式中,第一个+产生中间加法,第二个组合然后(并行)。