15
ScalaからGPUを使ってみる ScalaCL Plugin @chimerast たけうちひでゆき

ScalaCL in ScalaKaigi

Embed Size (px)

DESCRIPTION

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

Citation preview

Page 1: ScalaCL in ScalaKaigi

ScalaからGPUを使ってみるScalaCL Plugin

@chimerast

たけうちひでゆき

Page 2: ScalaCL in ScalaKaigi

自己紹介

たけうちひでゆき

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

Page 3: ScalaCL in ScalaKaigi

お題の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万円くらいのグラボ

Page 4: ScalaCL in ScalaKaigi

4

=

旧型地球シミュレータ

600億円

7万円 x 7 = 49万円注: 極端な表現です実際には考慮すべきことがたくさんあります

Page 5: ScalaCL in ScalaKaigi

5

このあほみたいな能力を

普通の計算で使えないの?

GPGPU

Page 6: ScalaCL in ScalaKaigi

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

Page 7: ScalaCL in ScalaKaigi

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;

}

Page 8: ScalaCL in ScalaKaigi

OpenCL ②

難点

初期化処理やバッファの確保など本質以外のコードが非常に多い

JavaCL

OpenCLのAPIを比較的高レベルに抽象化

それでもバッファ確保とかイベントの管理のコードが必要

OpenCL Cの関数を呼び出すラッパクラスのジェネレータとかある

もっと簡単に使えないの?

8

ScalaCLそんなあなたに

Page 9: ScalaCL in ScalaKaigi

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

Page 10: ScalaCL in ScalaKaigi

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

今後に期待!!

Page 11: ScalaCL in ScalaKaigi

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

Page 12: ScalaCL in ScalaKaigi

性能評価/プログラム

単純な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で確実に同期

Page 13: ScalaCL in ScalaKaigi

性能評価/結果

単純な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

Page 14: ScalaCL in ScalaKaigi

おまけ(GPUつながり的な意味で)

ScalaでMikuMikuDanceのローダ&レンダラを作ってみた

OpenGL with GLSL

OpenGLライブラリとしてLWJGLを使用

実装できている部分

モデルのロード

IKボーン、物理演算以外のアニメーション

IKボーンのプログラムの仕方がよくわからなくてここから進まない

Scala成分 1600行ぐらい

GLSL成分 70行ぐらい

14

Page 15: ScalaCL in ScalaKaigi

おしまい

ご清聴ありがとうございました

株式会社UZABASEでは一緒に働いてくれる人を募集中です

フリーダムな環境です

主に投資・金融機関向けに企業・業界の情報分析Webサービスを提供

基本JavaですがScalaとかWicketとかMongoDBとかを使った仕事もあり

ます

http://www.uzabase.com/

15