9. ScalaCL Compiler Plugin ① ScalaからOpenCLを簡単に使えるようにするコンパイラプラグイン http://code.google.com/p/scalacl/ JavaCLをベースに使用 OpenCLを使ってメソッドが高速化された専用の配列/Rangeクラス 要素はプリミティブ型およびそのTupleのみ(8要素まで) map, filter, zip, zipWithIndex, toArray, sum, product, min, max Scalaコードをコンパイル時にOpenCLC言語に変換 CLArray, CLRangeのmap, filterの引数の関数ブロックをOpenCL C に変換 ブロックから外部の変数、メソッドにアクセスできないなど制限はある ちゃんとコンパイルエラーになります 三角関数などscala.mathの関数で使えるものがある 使えない演算・関数も多い(ベクトル演算とか) 9
10. ScalaCL Compiler Plugin ② Scalaの標準Collectionのメソッドをコンパイル時にwhile文に変換して高速化 reduce/scan/fold|Left/Right forall, exists, count foreach, map, filter, filterNot, takeWhile, dropWhile Array.tabulate 個人的にはどっちかというとおまけだと思う Warning :ScalaCL might still have (unknown) bugs, it's currently far from being finished (especially on the OpenCL side). ScalaCL is not production-ready ! 実際Scala -> OpenCL Cの変換がかなり不安定です 10 今後に期待!!
11. ScalaCLの使い方 インストール(OpenCLが使える前提で) sbaz update sbaz install scalacl サンプルコード コンパイル/実行 scalacTest.scala scala Test 特にオプションは必要ない(sbazでインストールすると勝手に使われるので注意) export SCALACL_VERBOSE=1 コンパイル時および実行時に変換前と変換後のコードを標準出力に出力 11 import scalacl._ implicit val context = Context.best (0 until 100).cl.map(cos(_)).sum
12. 性能評価/プログラム 単純なmap cos x 100 Tupleの配列 12 ScalaCLの map等は非同期実行されるため最後に sumで確実に同期 Val range = (0 until 100000) val tuples = Array.fill(100) { ((1, 2, 3, 4), (5, 6, 7, 8)) } range.map(_ * 2).zipWithIndex.map(p => p._1 * p._2).sum range.map{ x => var total = 0.0 for (i <- 0 until 100) { total += cos(x * i) } total }.sum tuples.map { case (a, b) => a._1 * b._1 + a._2 * b._2 + a._3 * b._3 + a._4 * b._4 }.sum https://github.com/chimerast/scala-scalacl