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