summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksandar Pokopec <aleksandar.prokopec@epfl.ch>2010-06-30 15:16:49 +0000
committerAleksandar Pokopec <aleksandar.prokopec@epfl.ch>2010-06-30 15:16:49 +0000
commit846040bdd1f7ce7d82fc2036b0497f0e69ed510b (patch)
treed0802dc31bfb287d34c6eac9b8a22bd7064227ee
parent9d5bc93142ce74a7e1881becef5a9c4fd21e5979 (diff)
downloadscala-846040bdd1f7ce7d82fc2036b0497f0e69ed510b.tar.gz
scala-846040bdd1f7ce7d82fc2036b0497f0e69ed510b.tar.bz2
scala-846040bdd1f7ce7d82fc2036b0497f0e69ed510b.zip
Parallel array `map` optimisation. No review.
-rw-r--r--src/library/scala/collection/parallel/mutable/ParallelArray.scala37
-rw-r--r--test/benchmarks/src/scala/collection/parallel/benchmarks/hashtries/ParallelHashTries.scala2
2 files changed, 38 insertions, 1 deletions
diff --git a/src/library/scala/collection/parallel/mutable/ParallelArray.scala b/src/library/scala/collection/parallel/mutable/ParallelArray.scala
index 3331c2dfd2..c16cc6da15 100644
--- a/src/library/scala/collection/parallel/mutable/ParallelArray.scala
+++ b/src/library/scala/collection/parallel/mutable/ParallelArray.scala
@@ -6,6 +6,7 @@ import scala.collection.generic.GenericParallelTemplate
import scala.collection.generic.GenericCompanion
import scala.collection.generic.GenericParallelCompanion
import scala.collection.generic.CanCombineFrom
+import scala.collection.generic.CanBuildFrom
import scala.collection.generic.ParallelFactory
import scala.collection.generic.Sizing
import scala.collection.parallel.Combiner
@@ -511,6 +512,42 @@ extends ParallelSeq[T]
}
+ /* operations */
+
+ private def buildsArray[S, That](c: Builder[S, That]) = c.isInstanceOf[ParallelArrayCombiner[_]]
+
+ override def map[S, That](f: T => S)(implicit bf: CanBuildFrom[ParallelArray[T], S, That]) = if (buildsArray(bf(repr))) {
+ // reserve array
+ val targetarr = new Array[Any](length)
+
+ // fill it in parallel
+ executeAndWait(new Map[S](f, targetarr, 0, length))
+
+ // wrap it into a parallel array
+ (new ParallelArray[S](new ExposedArraySeq[S](targetarr.asInstanceOf[Array[AnyRef]], length))).asInstanceOf[That]
+ } else super.map(f)(bf)
+
+ /* tasks */
+
+ class Map[S](f: T => S, targetarr: Array[Any], offset: Int, howmany: Int) extends super.Task[Unit, Map[S]] {
+ var result = ();
+ def leaf(prev: Option[Unit]) = {
+ val tarr = targetarr
+ val sarr = array
+ var i = offset
+ val until = offset + howmany
+ while (i < until) {
+ tarr(i) = f(sarr(i).asInstanceOf[T])
+ i += 1
+ }
+ }
+ def split = {
+ val fp = howmany / 2
+ List(new Map(f, targetarr, offset, fp), new Map(f, targetarr, offset + fp, howmany - fp))
+ }
+ def shouldSplitFurther = howmany > collection.parallel.thresholdFromSize(length, parallelismLevel)
+ }
+
}
diff --git a/test/benchmarks/src/scala/collection/parallel/benchmarks/hashtries/ParallelHashTries.scala b/test/benchmarks/src/scala/collection/parallel/benchmarks/hashtries/ParallelHashTries.scala
index fd6e1a8559..c617f69161 100644
--- a/test/benchmarks/src/scala/collection/parallel/benchmarks/hashtries/ParallelHashTries.scala
+++ b/test/benchmarks/src/scala/collection/parallel/benchmarks/hashtries/ParallelHashTries.scala
@@ -73,7 +73,7 @@ object RefParallelHashTrieBenches extends ParallelHashTrieBenches[Dummy, Dummy]
sum
}
val reducer = (x: DPair, y: DPair) => {
- y._2.num = x._2.in + y._2.in
+ //y._2.num = x._2.in + y._2.in
y
}
val mediumreducer = (x: DPair, y: DPair) => {