diff options
author | Aleksandar Pokopec <aleksandar.prokopec@epfl.ch> | 2010-12-09 10:08:20 +0000 |
---|---|---|
committer | Aleksandar Pokopec <aleksandar.prokopec@epfl.ch> | 2010-12-09 10:08:20 +0000 |
commit | f2ecbd04691b1914e2f77c60afc2b296aa6826ae (patch) | |
tree | 539b543eb173cfc7b0bbde4ca5f2c5bb187297df /test | |
parent | 492b22576f2ad46b300ce8dc31c5b672aaf517e4 (diff) | |
download | scala-f2ecbd04691b1914e2f77c60afc2b296aa6826ae.tar.gz scala-f2ecbd04691b1914e2f77c60afc2b296aa6826ae.tar.bz2 scala-f2ecbd04691b1914e2f77c60afc2b296aa6826ae.zip |
Array combiners implementation changed from arr...
Array combiners implementation changed from array buffers to doubling
unrolled buffers to avoid excessive copying. Still evaluating the
benefits of this.
No review.
Diffstat (limited to 'test')
9 files changed, 118 insertions, 41 deletions
diff --git a/test/benchmarks/source.list b/test/benchmarks/source.list index dffd5ef4ea..9382e996dc 100644 --- a/test/benchmarks/source.list +++ b/test/benchmarks/source.list @@ -35,6 +35,7 @@ src/scala/collection/parallel/benchmarks/parallel_array/ReducePrime.scala src/scala/collection/parallel/benchmarks/parallel_array/DropMany.scala src/scala/collection/parallel/benchmarks/parallel_array/ReduceList.scala src/scala/collection/parallel/benchmarks/parallel_array/ForeachLight.scala +src/scala/collection/parallel/benchmarks/parallel_array/ScanMedium.scala src/scala/collection/parallel/benchmarks/parallel_array/MatrixMultiplication.scala src/scala/collection/parallel/benchmarks/parallel_array/SliceMedium.scala src/scala/collection/parallel/benchmarks/parallel_array/ReverseMap.scala diff --git a/test/benchmarks/src/scala/collection/parallel/Benchmarking.scala b/test/benchmarks/src/scala/collection/parallel/Benchmarking.scala index 32c3ca154f..9eacc7ff1f 100644 --- a/test/benchmarks/src/scala/collection/parallel/Benchmarking.scala +++ b/test/benchmarks/src/scala/collection/parallel/Benchmarking.scala @@ -65,6 +65,7 @@ trait BenchmarkRegister { register(parallel_array.PadToDouble) register(parallel_array.AggregateLight) register(parallel_array.ScanLight) + register(parallel_array.ScanMedium) register(parallel_array.MatrixMultiplication) // parallel views diff --git a/test/benchmarks/src/scala/collection/parallel/benchmarks/parallel_array/ForeachHeavy.scala b/test/benchmarks/src/scala/collection/parallel/benchmarks/parallel_array/ForeachHeavy.scala index b5dcfca872..f151158ad9 100644 --- a/test/benchmarks/src/scala/collection/parallel/benchmarks/parallel_array/ForeachHeavy.scala +++ b/test/benchmarks/src/scala/collection/parallel/benchmarks/parallel_array/ForeachHeavy.scala @@ -9,6 +9,8 @@ object ForeachHeavy extends Companion { override def comparisons = List("jsr") override def defaultSize = 2048 + @volatile var z = 0 + val fun = (a: Cont) => heavyOperation(a) val funjsr = new extra166y.Ops.Procedure[Cont] { def op(a: Cont) = heavyOperation(a) @@ -26,6 +28,7 @@ object ForeachHeavy extends Companion { if (n % i == 0) isPrime = false i += 1 } + if (isPrime && (n.toString == z)) z += 1 isPrime } } diff --git a/test/benchmarks/src/scala/collection/parallel/benchmarks/parallel_array/ScanMedium.scala b/test/benchmarks/src/scala/collection/parallel/benchmarks/parallel_array/ScanMedium.scala new file mode 100644 index 0000000000..73a237189f --- /dev/null +++ b/test/benchmarks/src/scala/collection/parallel/benchmarks/parallel_array/ScanMedium.scala @@ -0,0 +1,55 @@ +package scala.collection.parallel.benchmarks.parallel_array + + +import scala.collection.parallel.benchmarks._ +import scala.collection.parallel.mutable.ParArray + + +object ScanMedium extends Companion { + def benchName = "scan-medium"; + def apply(sz: Int, parallelism: Int, what: String) = new ScanMedium(sz, parallelism, what) + override def comparisons = List("jsr") + override def defaultSize = 5000 + + val op = (a: Cont, b: Cont) => { + operation(a, b) + } + def operation(a: Cont, b: Cont) = { + val m = if (a.in < 0) 1 else 0 + val k = calc(a.in, b.in, m) + new Cont(a.in + b.in + k * m * (0 until 2).reduceLeft(_ + _)) + } + private def calc(x: Int, y: Int, n: Int) = { + var sum = x + for (i <- 0 until 500) { + sum += y + (if (sum % 2 == 0) n * x else y) + if (sum % 5 == 0) sum -= x * y - n * (x + y) + } + sum + } +} + + +class ScanMedium(sz: Int, p: Int, what: String) +extends Resettable[Cont](sz, p, what, new Cont(_), new Array[Any](_), classOf[Cont]) { + def companion = ScanMedium + override def repetitionsPerRun = 50 + override val runs = 12 + + def runpar = pa.scan(new Cont(0))(ScanMedium.op) + def runseq = sequentialScan(new Cont(0), ScanMedium.op, sz) + def runjsr = jsrarr.cumulate(new extra166y.Ops.Reducer[Cont] { + def op(a: Cont, b: Cont) = ScanMedium.operation(a, b) + }, new Cont(0)) + override def comparisonMap = collection.Map("jsr" -> runjsr _) +} + + + + + + + + + + diff --git a/test/files/scalacheck/parallel-collections/IntOperators.scala b/test/files/scalacheck/parallel-collections/IntOperators.scala index 690ee34cca..24330d7670 100644 --- a/test/files/scalacheck/parallel-collections/IntOperators.scala +++ b/test/files/scalacheck/parallel-collections/IntOperators.scala @@ -49,7 +49,8 @@ trait IntOperators extends Operators[Int] { def foldArguments = List( (0, _ + _), (1, _ * _), - (Int.MinValue, math.max(_, _)) + (Int.MinValue, math.max(_, _)), + (Int.MaxValue, math.min(_, _)) ) def addAllTraversables = List( List[Int](), diff --git a/test/files/scalacheck/parallel-collections/Operators.scala b/test/files/scalacheck/parallel-collections/Operators.scala index 538cc23325..b4321cf805 100644 --- a/test/files/scalacheck/parallel-collections/Operators.scala +++ b/test/files/scalacheck/parallel-collections/Operators.scala @@ -32,4 +32,4 @@ trait SeqOperators[T] extends Operators[T] { def reverseMapFunctions: List[T => T] def sameElementsSeqs: List[Seq[T]] def startEndSeqs: List[Seq[T]] -}
\ No newline at end of file +} diff --git a/test/files/scalacheck/parallel-collections/ParallelHashMapCheck.scala b/test/files/scalacheck/parallel-collections/ParallelHashMapCheck.scala index 061bb08d9b..9299a201a1 100644 --- a/test/files/scalacheck/parallel-collections/ParallelHashMapCheck.scala +++ b/test/files/scalacheck/parallel-collections/ParallelHashMapCheck.scala @@ -64,23 +64,23 @@ with PairValues[Int, Int] } override def checkDataStructureInvariants(orig: Traversable[(Int, Int)], ds: AnyRef) = ds match { - case pm: ParHashMap[k, v] if 1 == 0 => // disabled this to make tests faster - val invs = pm.brokenInvariants - - val containsall = (for ((k, v) <- orig) yield { - if (pm.asInstanceOf[ParHashMap[Int, Int]].get(k) == Some(v)) true - else { - println("Does not contain original element: " + (k, v)) - false - } - }).foldLeft(true)(_ && _) - - - if (invs.isEmpty) containsall - else { - println("Invariants broken:\n" + invs.mkString("\n")) - false - } + // case pm: ParHashMap[k, v] if 1 == 0 => // disabled this to make tests faster + // val invs = pm.brokenInvariants + + // val containsall = (for ((k, v) <- orig) yield { + // if (pm.asInstanceOf[ParHashMap[Int, Int]].get(k) == Some(v)) true + // else { + // println("Does not contain original element: " + (k, v)) + // false + // } + // }).foldLeft(true)(_ && _) + + + // if (invs.isEmpty) containsall + // else { + // println("Invariants broken:\n" + invs.mkString("\n")) + // false + // } case _ => true } diff --git a/test/files/scalacheck/parallel-collections/ParallelHashSetCheck.scala b/test/files/scalacheck/parallel-collections/ParallelHashSetCheck.scala index be70a7c7a3..8b41908a26 100644 --- a/test/files/scalacheck/parallel-collections/ParallelHashSetCheck.scala +++ b/test/files/scalacheck/parallel-collections/ParallelHashSetCheck.scala @@ -56,28 +56,28 @@ with IntValues } override def checkDataStructureInvariants(orig: Traversable[Int], ds: AnyRef) = ds match { - case pm: ParHashSet[t] => - // for an example of how not to write code proceed below - val invs = pm.brokenInvariants - - val containsall = (for (elem <- orig) yield { - if (pm.asInstanceOf[ParHashSet[Int]](elem) == true) true - else { - println("Does not contain original element: " + elem) - println(pm.hashTableContents.table.find(_ == elem)) - println(pm.hashTableContents.table.indexOf(elem)) - false - } - }).foldLeft(true)(_ && _) - - - if (invs.isEmpty) { - if (!containsall) println(pm.debugInformation) - containsall - } else { - println("Invariants broken:\n" + invs.mkString("\n")) - false - } + // case pm: ParHashSet[t] if 1 == 0 => + // // for an example of how not to write code proceed below + // val invs = pm.brokenInvariants + + // val containsall = (for (elem <- orig) yield { + // if (pm.asInstanceOf[ParHashSet[Int]](elem) == true) true + // else { + // println("Does not contain original element: " + elem) + // println(pm.hashTableContents.table.find(_ == elem)) + // println(pm.hashTableContents.table.indexOf(elem)) + // false + // } + // }).foldLeft(true)(_ && _) + + + // if (invs.isEmpty) { + // if (!containsall) println(pm.debugInformation) + // containsall + // } else { + // println("Invariants broken:\n" + invs.mkString("\n")) + // false + // } case _ => true } diff --git a/test/files/scalacheck/parallel-collections/ParallelIterableCheck.scala b/test/files/scalacheck/parallel-collections/ParallelIterableCheck.scala index 8b5d72ea01..0dcd877ecb 100644 --- a/test/files/scalacheck/parallel-collections/ParallelIterableCheck.scala +++ b/test/files/scalacheck/parallel-collections/ParallelIterableCheck.scala @@ -398,6 +398,22 @@ abstract class ParallelIterableCheck[T](collName: String) extends Properties(col tarr.toSeq == collarr.toSeq } + if (hasStrictOrder) property("scans must be equal") = forAll(collectionPairs) { + case (t, coll) => + (for (((first, op), ind) <- foldArguments.zipWithIndex) yield { + val tscan = t.scanLeft(first)(op) + val cscan = coll.scan(first)(op) + if (tscan != cscan || cscan != tscan) { + println("from: " + t) + println("and: " + coll) + println("scans are: ") + println(tscan) + println(cscan) + } + ("operator " + ind) |: tscan == cscan && cscan == tscan + }).reduceLeft(_ && _) + } + } |