summaryrefslogtreecommitdiff
path: root/src
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 /src
parent9d5bc93142ce74a7e1881becef5a9c4fd21e5979 (diff)
downloadscala-846040bdd1f7ce7d82fc2036b0497f0e69ed510b.tar.gz
scala-846040bdd1f7ce7d82fc2036b0497f0e69ed510b.tar.bz2
scala-846040bdd1f7ce7d82fc2036b0497f0e69ed510b.zip
Parallel array `map` optimisation. No review.
Diffstat (limited to 'src')
-rw-r--r--src/library/scala/collection/parallel/mutable/ParallelArray.scala37
1 files changed, 37 insertions, 0 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)
+ }
+
}