ScalaCL in ScalaKaigi

4,738 views

Published on

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

Published in: Technology, Business
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
4,738
On SlideShare
0
From Embeds
0
Number of Embeds
2,109
Actions
Shares
0
Downloads
12
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

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 />

×