我正在研究这个函数,它应该以并行的方式对输入序列中的所有值进行求和,以利用多个核心。
代码:
def paraSum(list: scala.collection.parallel.ParSeq[Int]): Int = ???
答案 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
是关联的和可交换的,因此我们可以并行地合并(总结)中间求和。在上面的表达式中,第一个+
产生中间加法,第二个组合然后(并行)。