More Related Content
Git workflows presentation GPUをJavaで使う話(Java Casual Talks #1) Maxwell と Java CUDAプログラミング GPU Programming with Java Javaはどのように動くのか~スライドでわかるJVMの仕組み Introduction to OpenCL (Japanese, OpenCLの基礎) Similar to Javaで簡単にgpgpu aparapi (20)
20130228 Goノススメ(BPStudy #66) Kink: invokedynamic on a prototype-based language Apacheの展望とmod_perlの超絶技巧 #yapcasia 関東GPGPU勉強会 LLVM meets GPU もしも… Javaでヘテロジニアスコアが使えたら… 【関東GPGPU勉強会#3】OpenCVの新機能 UMatを先取りしよう Getting Started GraalVM (再アップロード) Getting Started GraalVM / GraalVM超入門 #jjug_ccc #ccc_c2 node-gypを使ったネイティブモジュールの作成 JavaOne2015報告またはこれからのJava 研究者のための Python による FPGA 入門 OpenCV4Androidで画像処理アプリのススメ Javaで簡単にgpgpu aparapi
- 2. 自己紹介
• 先山 賢一
– @ksakiyama134
• 同志社大学大学院 工学研究科 M2
– 研究: 人工社会 + GPGPU みたいなこと
– T研ではないです
• バイクとOpenCLが好き
– 最近はRubyとか興味あり
2
- 3. GPGPU歴
• 2010年10月
– OpenCLを勉強するも難しくて諦める
• 2011年1月
– CUDAを勉強
• 2011年9月
– OpenCLを再勉強(OpenGLも少し)
• 2012年3月
– GPGPU関連で論文発表
3
- 4. 発表の流れ
• GPGPU
– OpenCL
• Aparapi
– プログラミング
– パフォーマンス・チューニング
– デモ
• まとめ
4
- 5. GPGPU
• General Purpose computing on GPU
– GPUのパワーを画像処理以外に応用
• GPGPUを使うためには
– CUDA
– OpenCL
– C++ AMP
– OpenACC etc…
5
- 10. 2.もっと簡単にできない?
Host
• 残念ながら…
最低限の知識は必要 CommandQueue
– context
– command-queue Context
Device
– buffer
– kernel Buffer Kernel
10
- 11. 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
- 13. Aparapi
• A Parallel API
– http://code.google.com/p/aparapi/
• Javaで並列アルゴリズムが書ける
– OpenCL Cを書かなくてよい!
• AMDが開発
– NVIDIA GPUでも動きます
13
- 18. kernel.execute(size);
Yes No
最初の実行?
No
OpenCLが入ってる? OpenCLが入ってる?
Yes Yes
バイトコードを No
OpenCL Cに変換できた?
Yes
Java Thread Poolで実行
OpenCLで実行!
18
- 19. バイトコードって?
• Wikipediaより
– 仮想マシンによる実行のために設計された、
実行可能なプログラムのバイナリ表現である
• Javaバイトコード
– Javaのコンパイラが生成するコード
– JVMのインタプリタによって
ネイティブコードに変換されて実行される
19
- 20. Aparapiの主な制限
• 1次元配列のみ
– finalをつける
– Primitiveなデータ型のみ
• Float, Double, Integerなど使用不可
• ArrayListなど使用不可
• switch, break, continueなど使用不可
– JTPで実行される
• run()内でnewできない
※詳しく知りたい方はJavaKernelGuidelinesを参照
20
- 21. パフォーマンス・チューニング
• ローカルメモリ
– @Local修飾子
– 1次元配列のみ
• 同期
– localBarrier(), globalBarrier()
• Range class
– NDRangeのサイズを細かく指定
– execute( Range.create2D(w,h,16,16) )
21
- 23. 自動でデータ転送される
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
- 25. まとめ
• Aparapiで簡単に並列プログラミング
– 深くOpenCLを学ぶ必要がない
• データ転送に注意する
– setExplicit(true), put(arr[]), get(arr[])
• もっと詳しく知りたい人は
– http://code.google.com/p/aparapi/
25