Saturday, November 6, 2010

scalaでactor使ってparallel map その1

-----------
これ、シングルスレッドだ。パラレルじゃない。Futureを使わないFork-Joinは再チャレンジする(11/8追記)
----------

試しに書いてみた。

pmapの結果型がList[T]だと型チェックエラーでコンパイルできない。
replyすると型情報が消えちまうのか?

パラレルマップの正解はこれとかこれかもしれない。
また今度試す。

  1. import scala.actors.Actor._  
  2.   
  3. def pmap[T](xs: List[T], n: Int)(fun: T => T): List[Any] = {  
  4.   
  5.   def divide(n: Int, xs: List[T]): List[List[T]] = {  
  6.     val size = xs.size / n  
  7.     def r(ys: List[T], acc: List[List[T]]): List[List[T]] = {  
  8.       if(ys.size < size) (acc.head ::: ys) :: acc.tail  
  9.       else{  
  10.         val splitted = ys.splitAt(size)  
  11.         r(splitted._2, splitted._1 :: acc)  
  12.       }  
  13.     }  
  14.     r(xs, Nil).reverse  
  15.   }  
  16.   
  17.   divide(n, xs).map{ l =>  
  18.     val a = actor { receive { case _ => reply(l.map(fun(_))) } }  
  19.     a !? "s"  
  20.   }  
  21. }  
  22.   
  23. val l = (1 to 100).toList  
  24. val result = pmap(l, 4)(_ + 1)  
  25.   
  26. println(result)  

実行結果
List(List(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), List(27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51), List(52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101))

scalaでactor使ってparallel map その2に続く。

No comments:

Post a Comment