17.4 並列計算

次の例では、関数 par は計算のペアをパラメータとしてとり、計算結果を別のペアで返します。2つの計算は並列実行されます。

この関数はオブジェクト scala.concurrent.ops において、次のように定義されています。

def par[A, B](xp: => A, yp: => B): (A, B) = { val y = new SyncVar[B] spawn { y set yp } (xp, y.get) }

同じ場所で replicate 関数が定義されていて、多数の計算の複製を並列実行しま す。各複製インスタンスには、それを識別する整数値が渡されます。

def replicate(start: Int, end: Int)(p: Int => Unit) { if (start == end) () else if (start + 1 == end) p(start) else { val mid = (start + end) / 2 spawn { replicate(start, mid)(p) } replicate(mid, end)(p) } }

次の関数は、配列のすべての要素について並列計算を実行するために、replicate を使っています。

def parMap[A,B](f: A => B, xs: Array[A]): Array[B] = { val results = new Array[B](xs.length) replicate(0, xs.length) { i => results(i) = f(xs(i)) } results }