summaryrefslogtreecommitdiff
path: root/test/benchmarks/src/scala/collection/parallel/benchmarks/parallel_array/ScanLight.scala
blob: d0ddf9f70e96035e5b53baeb7cc399aa61df24b9 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
package scala.collection.parallel.benchmarks.parallel_array


import scala.collection.parallel.benchmarks._
import scala.collection.parallel.mutable.ParArray


object ScanLight extends Companion {
  def benchName = "scan-light";
  def apply(sz: Int, parallelism: Int, what: String) = new ScanLight(sz, parallelism, what)
  override def comparisons = List("jsr")
  override def defaultSize = 40000
  
  val op = (a: Cont, b: Cont) => {
    operation(a, b)
  }
  def operation(a: Cont, b: Cont) = {
    val m = if (a.in < 0) 1 else 0
    new Cont(a.in + b.in + m * (0 until 2).reduceLeft(_ + _))
  }
}


class ScanLight(sz: Int, p: Int, what: String)
extends Resettable[Cont](sz, p, what, new Cont(_), new Array[Any](_), classOf[Cont]) {
  def companion = ScanLight
  override def repetitionsPerRun = 50
  override val runs = 12
  
  def runpar = pa.scan(new Cont(0))(ScanLight.op)
  def runseq = sequentialScan(new Cont(0), ScanLight.op, sz)
  def runjsr = jsrarr.cumulate(new extra166y.Ops.Reducer[Cont] {
    def op(a: Cont, b: Cont) = ScanLight.operation(a, b)
  }, new Cont(0))
  override def comparisonMap = collection.Map("jsr" -> runjsr _)
}