diff options
author | Aleksandar Pokopec <aleksandar.prokopec@epfl.ch> | 2010-09-13 16:07:33 +0000 |
---|---|---|
committer | Aleksandar Pokopec <aleksandar.prokopec@epfl.ch> | 2010-09-13 16:07:33 +0000 |
commit | cfb6168dc5eef906b2552c7b40765db1d6720652 (patch) | |
tree | 4ba1ffd338f7dac34a7c08ac29a03e005b2ca34f /src/library/scala/collection/parallel/mutable/ParArray.scala | |
parent | f7a6c8823b39c622a1f96f9aaafb828427d4edda (diff) | |
download | scala-cfb6168dc5eef906b2552c7b40765db1d6720652.tar.gz scala-cfb6168dc5eef906b2552c7b40765db1d6720652.tar.bz2 scala-cfb6168dc5eef906b2552c7b40765db1d6720652.zip |
Improving parallel scan. No review
Diffstat (limited to 'src/library/scala/collection/parallel/mutable/ParArray.scala')
-rw-r--r-- | src/library/scala/collection/parallel/mutable/ParArray.scala | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/src/library/scala/collection/parallel/mutable/ParArray.scala b/src/library/scala/collection/parallel/mutable/ParArray.scala index 0d0b045912..aa0eb03365 100644 --- a/src/library/scala/collection/parallel/mutable/ParArray.scala +++ b/src/library/scala/collection/parallel/mutable/ParArray.scala @@ -535,25 +535,33 @@ extends ParSeq[T] override def map[S, That](f: T => S)(implicit bf: CanBuildFrom[ParArray[T], S, That]) = if (buildsArray(bf(repr))) { // reserve an array - val targetarr = new Array[Any](length) + val targarrseq = new ArraySeq[S](length) + val targetarr = targarrseq.array.asInstanceOf[Array[Any]] // fill it in parallel executeAndWait(new Map[S](f, targetarr, 0, length)) // wrap it into a parallel array - (new ParArray[S](new ExposedArraySeq[S](targetarr.asInstanceOf[Array[AnyRef]], length))).asInstanceOf[That] + (new ParArray[S](targarrseq)).asInstanceOf[That] } else super.map(f)(bf) override def scan[U >: T, That](z: U)(op: (U, U) => U)(implicit cbf: CanCombineFrom[ParArray[T], U, That]): That = if (buildsArray(cbf(repr))) { // reserve an array - val targetarr = new Array[Any](length + 1) + val targarrseq = new ArraySeq[U](length + 1) + val targetarr = targarrseq.array.asInstanceOf[Array[Any]] targetarr(0) = z // do a parallel prefix scan - executeAndWait(new ScanToArray[U, Any](z, op, 1, size, targetarr, parallelIterator)) + executeAndWait(new PartialScan[U, Any](z, op, 1, size, targetarr, parallelIterator) mapResult { st => + //println("-----------------------") + //println(targetarr.toList) + //st.printTree + executeAndWaitResult(new ApplyScanTree[U, Any](None, op, st, targetarr)) + }) + //println(targetarr.toList) // wrap the array into a parallel array - (new ParArray[U](new ExposedArraySeq[U](targetarr.asInstanceOf[Array[AnyRef]], length + 1))).asInstanceOf[That] + (new ParArray[U](targarrseq)).asInstanceOf[That] } else super.scan(z)(op)(cbf) /* tasks */ |