SlideShare a Scribd company logo
Javaで簡単にGPGPU
    -Aparapi-

   2012/10/13
  関西GPGPU勉強会

                1
自己紹介
• 先山 賢一
 – @ksakiyama134


• 同志社大学大学院 工学研究科 M2
 – 研究: 人工社会 + GPGPU みたいなこと
 – T研ではないです


• バイクとOpenCLが好き
 – 最近はRubyとか興味あり

                             2
GPGPU歴
• 2010年10月
 – OpenCLを勉強するも難しくて諦める

• 2011年1月
 – CUDAを勉強

• 2011年9月
 – OpenCLを再勉強(OpenGLも少し)

• 2012年3月
 – GPGPU関連で論文発表

                           3
発表の流れ
• GPGPU
  – OpenCL

• Aparapi
  – プログラミング
  – パフォーマンス・チューニング
  – デモ

• まとめ
                     4
GPGPU
• General Purpose computing on GPU
  – GPUのパワーを画像処理以外に応用


• GPGPUを使うためには
  –   CUDA
  –   OpenCL
  –   C++ AMP
  –   OpenACC etc…

                                     5
OpenCL
• 並列計算の標準フレームワーク
 – Open Computing Language


• OpenCL C言語
 – 並列アルゴリズムを記述するための言語


• C/C++
 – APIを使用してOpenCL Cのコードを実行

                             6
OpenCLを勉強したいが…

1. C++とかいやなんですけど…
 – 他の言語を使いたい


2. 並列アルゴリズム, データ転送
   以外の部分でコード数が多い
 – もっと簡単に書きたい


                     7
1.他の言語でできない?
• 賢い方々がつくったラッパーを使おう!!
   • PyOpenCL
   • Ruby-OpenCL
   • PHP OpenCL など




• もちろんJavaでもあります!
   • JavaCL
   • JOCL
                        8
た便そ
く利、
さなそ
んもん
 のな
 が




      9
2.もっと簡単にできない?
                         Host
• 残念ながら…
  最低限の知識は必要          CommandQueue

  – context
  – command-queue     Context
                        Device
  – buffer
  – kernel          Buffer       Kernel



                                          10
OpenCL Cコードは文字列
    ホストコード                例:Ruby
kernel_source = <<EOF
__kernel
                                            OpenCL C
void square(__global float *dst,   __kernel
            __global float *src)   void square(__global float *dst,
{                                              __global float *src)
 int gid = get_global_id(0);       {
 dst[gid] = src[gid] * src[gid];    int gid = get_global_id(0);
}                                   dst[gid] = src[gid] * src[gid];
EOF                                }

....省略



         結局はCみたいなコードを書く
                                                                11
そこでAparapi!
              12
Aparapi
• A Parallel API
  – http://code.google.com/p/aparapi/


• Javaで並列アルゴリズムが書ける
  – OpenCL Cを書かなくてよい!


• AMDが開発
  – NVIDIA GPUでも動きます

                                        13
JavaとOpenCL
• Aparapi以外にも
 – JavaCL
 – JOCL

• しかしAparapiはこれら2つより
    圧倒的にコード数が短くて済む

 感覚:Aparapi >>> JavaCL > JOCL

                                14
使い方
import com.amd.aparapi.Kernel;

new Kernel() {
    @Override public void run() {
        int gid = getGlobalId();
        c[gid] = a[gid] + b[gid];
    }
}.execute(size);

                                    15
すごくシンプル




          16
Aparapi, JavaCL, JOCL,
  実装してコード数を
   比較してみました



                         17
kernel.execute(size);

       Yes                           No
                  最初の実行?

                      No
 OpenCLが入ってる?                OpenCLが入ってる?
     Yes                              Yes

    バイトコードを          No

OpenCL Cに変換できた?
     Yes

             Java Thread Poolで実行


                OpenCLで実行!
                                            18
バイトコードって?
• Wikipediaより
 – 仮想マシンによる実行のために設計された、
   実行可能なプログラムのバイナリ表現である


• Javaバイトコード
 – Javaのコンパイラが生成するコード
 – JVMのインタプリタによって
   ネイティブコードに変換されて実行される

                         19
Aparapiの主な制限
• 1次元配列のみ
 – finalをつける
 – Primitiveなデータ型のみ
   • Float, Double, Integerなど使用不可
   • ArrayListなど使用不可

• switch, break, continueなど使用不可
 – JTPで実行される

• run()内でnewできない

 ※詳しく知りたい方はJavaKernelGuidelinesを参照
                                     20
パフォーマンス・チューニング
• ローカルメモリ
  – @Local修飾子
  – 1次元配列のみ

• 同期
  – localBarrier(), globalBarrier()

• Range class
  – NDRangeのサイズを細かく指定
  – execute( Range.create2D(w,h,16,16) )

                                           21
デモ

• 正方行列の乗算

• バイトニックソート

• GUIとの連動


                 22
自動でデータ転送される
for (stage = 0; stage < numStages; stage++) {
    execute( Range.create(size, 256) );
}



for (stage = 0; stage < numStages; stage++) {
    // memcpy: Host -> Device
    execute( Range.create(size, 256) );
    // memcpy: Device -> Host
}

                                                23
データ転送を操作する

setExplicit(true);
put(array_a).put(array_b).put(array_dst);

for (stage = 0; stage < numStages; stage++) {
    execute( Range.create(size, 256) );
}

get.(array_dst);


                                                24
まとめ
• Aparapiで簡単に並列プログラミング
 – 深くOpenCLを学ぶ必要がない


• データ転送に注意する
 – setExplicit(true), put(arr[]), get(arr[])


• もっと詳しく知りたい人は
 – http://code.google.com/p/aparapi/

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




                 26

More Related Content

PPT
Git workflows presentation
PDF
GPUをJavaで使う話(Java Casual Talks #1)
PDF
Maxwell と Java CUDAプログラミング
PDF
GPU Programming with Java
PDF
Llvm Talk 社内LT大会資料
PDF
Javaはどのように動くのか~スライドでわかるJVMの仕組み
PDF
Introduction to OpenCL (Japanese, OpenCLの基礎)
PPTX
Php in ruby
Git workflows presentation
GPUをJavaで使う話(Java Casual Talks #1)
Maxwell と Java CUDAプログラミング
GPU Programming with Java
Llvm Talk 社内LT大会資料
Javaはどのように動くのか~スライドでわかるJVMの仕組み
Introduction to OpenCL (Japanese, OpenCLの基礎)
Php in ruby

Similar to Javaで簡単にgpgpu aparapi (20)

PPTX
20130228 Goノススメ(BPStudy #66)
PDF
Kink: invokedynamic on a prototype-based language
PDF
Apacheの展望とmod_perlの超絶技巧 #yapcasia
PDF
OpenCLに触れてみよう
PDF
Web技術勉強会 第31回
KEY
関東GPGPU勉強会 LLVM meets GPU
PDF
OpenStack + Common Lisp
PDF
20130126 sc12-reading
PPTX
もしも… Javaでヘテロジニアスコアが使えたら…
PPTX
Open modeler
PPTX
つぶLT20121215
PDF
【関東GPGPU勉強会#3】OpenCVの新機能 UMatを先取りしよう
PDF
MoteMote Compiler Plugin
PDF
Scala + Finagleの魅力
PDF
Getting Started GraalVM (再アップロード)
PDF
Getting Started GraalVM / GraalVM超入門 #jjug_ccc #ccc_c2
PPTX
node-gypを使ったネイティブモジュールの作成
PDF
JavaOne2015報告またはこれからのJava
PPTX
研究者のための Python による FPGA 入門
PDF
OpenCV4Androidで画像処理アプリのススメ
20130228 Goノススメ(BPStudy #66)
Kink: invokedynamic on a prototype-based language
Apacheの展望とmod_perlの超絶技巧 #yapcasia
OpenCLに触れてみよう
Web技術勉強会 第31回
関東GPGPU勉強会 LLVM meets GPU
OpenStack + Common Lisp
20130126 sc12-reading
もしも… Javaでヘテロジニアスコアが使えたら…
Open modeler
つぶLT20121215
【関東GPGPU勉強会#3】OpenCVの新機能 UMatを先取りしよう
MoteMote Compiler Plugin
Scala + Finagleの魅力
Getting Started GraalVM (再アップロード)
Getting Started GraalVM / GraalVM超入門 #jjug_ccc #ccc_c2
node-gypを使ったネイティブモジュールの作成
JavaOne2015報告またはこれからのJava
研究者のための Python による FPGA 入門
OpenCV4Androidで画像処理アプリのススメ
Ad

Javaで簡単にgpgpu aparapi