Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

ScalaCL in ScalaKaigi

4,808 views

Published on

Scala会議のLT
ScalaからOpenCLを簡単に利用できるScalaCL Pluginとかのお話

Published in: Technology, Business
  • Be the first to comment

ScalaCL in ScalaKaigi

  1. 1. ScalaからGPUを使ってみるScalaCLPlugin<br />@chimerast<br />たけうちひでゆき<br />
  2. 2. 自己紹介<br />たけうちひでゆき<br />Twitter: @chimerast<br />Blog: http://chimera.st/<br />#wicket-ja, #mongotokyo, #rpscala<br />Seasarの端っこでS2Wicketのメンテナンスしています<br />永遠のNEET<br />株式会社UZABASEというところの平社員に最近なりました<br />以前は社長とか個人事業主とかいろいろやってました<br />普段は(Java or Scala)+WicketでWebサービスを開発をしています<br />株式会社UZABASEでは一緒に働いてくれる人を募集中です<br />主に投資・金融機関向けに企業・業界の情報分析Webサービスを提供<br />ScalaとかWicketとかMongoDBとかを使った仕事もあります<br />http://www.uzabase.com/<br />2<br />
  3. 3. お題のGPUって何?<br />グラフィックカードにくっついている演算装置<br />主に3Dグラフィック描画に使用される<br />ポリゴン頂点の座標変換(アフィン変換)<br />秒間約60億回の行列・ベクトルの乗加算(1頂点あたり単精度浮動小数 x (16 + 4) 回の演算)<br />ピクセルごとの色の合成処理<br />秒間約600億ピクセルの処理(1ピクセルは単精度浮動小数 x 4)<br />浮動小数点の並列演算が超得意<br />3072ユニット(コア)/ 5.1TeraFLOPS(単精度)/ 1.27TeraFLOPS(倍精度)<br />Core i7 3.5GHz : 4コア / 112GigaFLOPS(AVX命令使用単精度)<br />旧地球シミュレータ(2002年段階): 実効性能35.86TeraFLOPS 600億円<br />ベクトル演算が得意<br />三角関数・指数関数も得意(のはず?)<br />3<br />AMD Radeon HD 6990 スペックより<br />7万円くらいのグラボ<br />
  4. 4. 4<br />旧型地球シミュレータ<br />=<br />600億円<br />注: 極端な表現です<br />実際には考慮すべきことがたくさんあります<br />7万円 x 7 = 49万円<br />
  5. 5. 5<br />このあほみたいな能力を<br />普通の計算で使えないの?<br />GPGPU<br />
  6. 6. GPGPU<br />General-purpose computing on graphics processing units<br />GPUを汎用計算処理に利用する技術<br />データ並列に特化(タスク並列は不得意)<br />専用言語でカーネルプログラムを記述しホストプログラムからAPIで実行<br />CUDA, ATI Stream, OpenCL<br />サーバ用のGPGPU専用ボードも販売されている: NVIDIA Tesla<br />最近ではスパコンを作るにもGPUがよく使われている<br />東工大: TSUBAME (TOP 5)<br />長崎大: DEGIMA (TOP 430 3700万でスパコンを作ったとかで話題に)<br />中国: 天河一号A (TOP 2)<br />中国: Nebulea (TOP 4)<br />6<br />
  7. 7. OpenCL ①<br />マルチコアCPU、GPU等の計算資源を使用した並列コンピューティング用のフレームワーク<br />GPUに限ったものではなく、CPU、Cell、DSPなども扱う<br />携帯電話や組み込み向けのProfileもある<br />専用のOpenCL C言語で記述<br />ベクトル演算が拡張されたC言語<br />再起ができないとかいろいろ制限もある<br />OpenCL APIを通してソースコードをコンパイル&実行<br />7<br />__kernel void dataParallel(__global float4* a,<br /> __global float4* b, __global float4* c) {<br />inti = get_global_id(0);<br />c[i].xyz = a[i].xyz + b[i].xyz;<br />c[i].w = a[i].w * b[i].w;<br />}<br />
  8. 8. OpenCL ②<br />難点<br />初期化処理やバッファの確保など本質以外のコードが非常に多い<br />JavaCL<br />OpenCLのAPIを比較的高レベルに抽象化<br />それでもバッファ確保とかイベントの管理のコードが必要<br />OpenCL Cの関数を呼び出すラッパクラスのジェネレータとかある<br />もっと簡単に使えないの?<br />8<br />そんなあなたに<br />ScalaCL<br />
  9. 9. ScalaCL Compiler Plugin ①<br />ScalaからOpenCLを簡単に使えるようにするコンパイラプラグイン<br />http://code.google.com/p/scalacl/<br />JavaCLをベースに使用<br />OpenCLを使ってメソッドが高速化された専用の配列/Rangeクラス<br />要素はプリミティブ型およびそのTupleのみ(8要素まで)<br />map, filter, zip, zipWithIndex, toArray, sum, product, min, max<br />Scalaコードをコンパイル時にOpenCLC言語に変換<br />CLArray, CLRangeのmap, filterの引数の関数ブロックをOpenCL C に変換<br />ブロックから外部の変数、メソッドにアクセスできないなど制限はある<br />ちゃんとコンパイルエラーになります<br />三角関数などscala.mathの関数で使えるものがある<br />使えない演算・関数も多い(ベクトル演算とか)<br />9<br />
  10. 10. ScalaCL Compiler Plugin ②<br />Scalaの標準Collectionのメソッドをコンパイル時にwhile文に変換して高速化<br />reduce/scan/fold|Left/Right<br />forall, exists, count<br />foreach, map, filter, filterNot,<br />takeWhile, dropWhile<br />Array.tabulate<br />個人的にはどっちかというとおまけだと思う<br />Warning :ScalaCL might still have (unknown) bugs, it's currently far from being finished (especially on the OpenCL side).<br />ScalaCL is not production-ready !<br />実際Scala -> OpenCL Cの変換がかなり不安定です<br />10<br />今後に期待!!<br />
  11. 11. ScalaCLの使い方<br />インストール(OpenCLが使える前提で)<br />sbaz update<br />sbaz install scalacl<br />サンプルコード<br />コンパイル/実行<br />scalacTest.scala<br />scala Test<br />特にオプションは必要ない(sbazでインストールすると勝手に使われるので注意)<br />export SCALACL_VERBOSE=1<br />コンパイル時および実行時に変換前と変換後のコードを標準出力に出力<br />11<br />import scalacl._<br />implicit val context = Context.best<br />(0 until 100).cl.map(cos(_)).sum<br />
  12. 12. 性能評価/プログラム<br />単純なmap<br />cos x 100<br />Tupleの配列<br />12<br />ScalaCLの<br />map等は非同期実行されるため最後に<br />sumで確実に同期<br />Val range = (0 until 100000)<br />val tuples = Array.fill(100) {<br /> ((1, 2, 3, 4), (5, 6, 7, 8)) }<br />range.map(_ * 2).zipWithIndex.map(p => p._1 * p._2).sum<br />range.map{ x =><br /> var total = 0.0<br /> for (i <- 0 until 100) { total += cos(x * i) }<br />total<br />}.sum<br />tuples.map {<br /> case (a, b) =><br /> a._1 * b._1 + a._2 * b._2 + a._3 * b._3 + a._4 * b._4<br />}.sum<br />https://github.com/chimerast/scala-scalacl<br />
  13. 13. 性能評価/結果<br />13<br />単位は全てマイクロ秒<br />System.nanoTimeを使用して100回計測し、結果の上位下位20%ずつを排除して平均<br />JAVA_OPTS=“-server -Xms2g -Xmx2g -verbose:gc -XX:CompileThreshold=10<br /> -XX:NewSize=1g -XX:MaxNewSize=1g -XX:SurvivorRatio=200000”<br />環境<br />iMac 27-inch, Mid 2011 / MacOSX 10.7<br />3.1 GHz Intel Core i5 (Sandy Bridge) / 12 GB 1333 MHz DDR3<br />AMD Radeon HD 6970M 1024 MB / 960ユニット<br />Java 1.6.0_26 64bit / Scala2.9.0.1<br />
  14. 14. おまけ(GPUつながり的な意味で)<br />ScalaでMikuMikuDanceのローダ&レンダラを作ってみた<br />OpenGL with GLSL<br />OpenGLライブラリとしてLWJGLを使用<br />実装できている部分<br />モデルのロード<br />IKボーン、物理演算以外のアニメーション<br />IKボーンのプログラムの仕方がよくわからなくてここから進まない<br />Scala成分 1600行ぐらい<br />GLSL成分 70行ぐらい<br />14<br />
  15. 15. おしまい<br />ご清聴ありがとうございました<br />株式会社UZABASEでは一緒に働いてくれる人を募集中です<br />フリーダムな環境です<br />主に投資・金融機関向けに企業・業界の情報分析Webサービスを提供<br />基本JavaですがScalaとかWicketとかMongoDBとかを使った仕事もあります<br />http://www.uzabase.com/<br />15<br />

×