Ce diaporama a bien été signalé.
Nous utilisons votre profil LinkedIn et vos données d’activité pour vous proposer des publicités personnalisées et pertinentes. Vous pouvez changer vos préférences de publicités à tout moment.
Javaで簡単にGPGPU    -Aparapi-   2012/10/13  関西GPGPU勉強会                1
自己紹介• 先山 賢一 – @ksakiyama134• 同志社大学大学院 工学研究科 M2 – 研究: 人工社会 + GPGPU みたいなこと – T研ではないです• バイクとOpenCLが好き – 最近はRubyとか興味あり        ...
GPGPU歴• 2010年10月 – OpenCLを勉強するも難しくて諦める• 2011年1月 – CUDAを勉強• 2011年9月 – OpenCLを再勉強(OpenGLも少し)• 2012年3月 – GPGPU関連で論文発表        ...
発表の流れ• GPGPU  – OpenCL• Aparapi  – プログラミング  – パフォーマンス・チューニング  – デモ• まとめ                     4
GPGPU• General Purpose computing on GPU  – GPUのパワーを画像処理以外に応用• GPGPUを使うためには  –   CUDA  –   OpenCL  –   C++ AMP  –   OpenACC...
OpenCL• 並列計算の標準フレームワーク – Open Computing Language• OpenCL C言語 – 並列アルゴリズムを記述するための言語• C/C++ – APIを使用してOpenCL Cのコードを実行        ...
OpenCLを勉強したいが…1. C++とかいやなんですけど… – 他の言語を使いたい2. 並列アルゴリズム, データ転送   以外の部分でコード数が多い – もっと簡単に書きたい                     7
1.他の言語でできない?• 賢い方々がつくったラッパーを使おう!!   • PyOpenCL   • Ruby-OpenCL   • PHP OpenCL など• もちろんJavaでもあります!   • JavaCL   • JOCL     ...
た便そく利、さなそんもん のな が      9
2.もっと簡単にできない?                         Host• 残念ながら…  最低限の知識は必要          CommandQueue  – context  – command-queue     Contex...
OpenCL Cコードは文字列    ホストコード                例:Rubykernel_source = <<EOF__kernel                                            Op...
そこでAparapi!              12
Aparapi• A Parallel API  – http://code.google.com/p/aparapi/• Javaで並列アルゴリズムが書ける  – OpenCL Cを書かなくてよい!• AMDが開発  – NVIDIA GPU...
JavaとOpenCL• Aparapi以外にも – JavaCL – JOCL• しかしAparapiはこれら2つより    圧倒的にコード数が短くて済む 感覚:Aparapi >>> JavaCL > JOCL               ...
使い方import com.amd.aparapi.Kernel;new Kernel() {    @Override public void run() {        int gid = getGlobalId();        c[...
すごくシンプル          16
Aparapi, JavaCL, JOCL,  実装してコード数を   比較してみました                         17
kernel.execute(size);       Yes                           No                  最初の実行?                      No OpenCLが入ってる? ...
バイトコードって?• Wikipediaより – 仮想マシンによる実行のために設計された、   実行可能なプログラムのバイナリ表現である• Javaバイトコード – Javaのコンパイラが生成するコード – JVMのインタプリタによって   ネ...
Aparapiの主な制限• 1次元配列のみ – finalをつける – Primitiveなデータ型のみ   • Float, Double, Integerなど使用不可   • ArrayListなど使用不可• switch, break, ...
パフォーマンス・チューニング• ローカルメモリ  – @Local修飾子  – 1次元配列のみ• 同期  – localBarrier(), globalBarrier()• Range class  – NDRangeのサイズを細かく指定  ...
デモ• 正方行列の乗算• バイトニックソート• GUIとの連動                 22
自動でデータ転送されるfor (stage = 0; stage < numStages; stage++) {    execute( Range.create(size, 256) );}for (stage = 0; stage < nu...
データ転送を操作するsetExplicit(true);put(array_a).put(array_b).put(array_dst);for (stage = 0; stage < numStages; stage++) {    exec...
まとめ• Aparapiで簡単に並列プログラミング – 深くOpenCLを学ぶ必要がない• データ転送に注意する – setExplicit(true), put(arr[]), get(arr[])• もっと詳しく知りたい人は – http:...
ご清聴ありがとうございました                 26
Prochain SlideShare
Chargement dans…5
×

Javaで簡単にgpgpu aparapi

Javaで簡単にgpgpu aparapi

  1. 1. Javaで簡単にGPGPU -Aparapi- 2012/10/13 関西GPGPU勉強会 1
  2. 2. 自己紹介• 先山 賢一 – @ksakiyama134• 同志社大学大学院 工学研究科 M2 – 研究: 人工社会 + GPGPU みたいなこと – T研ではないです• バイクとOpenCLが好き – 最近はRubyとか興味あり 2
  3. 3. GPGPU歴• 2010年10月 – OpenCLを勉強するも難しくて諦める• 2011年1月 – CUDAを勉強• 2011年9月 – OpenCLを再勉強(OpenGLも少し)• 2012年3月 – GPGPU関連で論文発表 3
  4. 4. 発表の流れ• GPGPU – OpenCL• Aparapi – プログラミング – パフォーマンス・チューニング – デモ• まとめ 4
  5. 5. GPGPU• General Purpose computing on GPU – GPUのパワーを画像処理以外に応用• GPGPUを使うためには – CUDA – OpenCL – C++ AMP – OpenACC etc… 5
  6. 6. OpenCL• 並列計算の標準フレームワーク – Open Computing Language• OpenCL C言語 – 並列アルゴリズムを記述するための言語• C/C++ – APIを使用してOpenCL Cのコードを実行 6
  7. 7. OpenCLを勉強したいが…1. C++とかいやなんですけど… – 他の言語を使いたい2. 並列アルゴリズム, データ転送 以外の部分でコード数が多い – もっと簡単に書きたい 7
  8. 8. 1.他の言語でできない?• 賢い方々がつくったラッパーを使おう!! • PyOpenCL • Ruby-OpenCL • PHP OpenCL など• もちろんJavaでもあります! • JavaCL • JOCL 8
  9. 9. た便そく利、さなそんもん のな が 9
  10. 10. 2.もっと簡単にできない? Host• 残念ながら… 最低限の知識は必要 CommandQueue – context – command-queue Context Device – buffer – kernel Buffer Kernel 10
  11. 11. OpenCL Cコードは文字列 ホストコード 例:Rubykernel_source = <<EOF__kernel OpenCL Cvoid 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
  12. 12. そこでAparapi! 12
  13. 13. Aparapi• A Parallel API – http://code.google.com/p/aparapi/• Javaで並列アルゴリズムが書ける – OpenCL Cを書かなくてよい!• AMDが開発 – NVIDIA GPUでも動きます 13
  14. 14. JavaとOpenCL• Aparapi以外にも – JavaCL – JOCL• しかしAparapiはこれら2つより 圧倒的にコード数が短くて済む 感覚:Aparapi >>> JavaCL > JOCL 14
  15. 15. 使い方import com.amd.aparapi.Kernel;new Kernel() { @Override public void run() { int gid = getGlobalId(); c[gid] = a[gid] + b[gid]; }}.execute(size); 15
  16. 16. すごくシンプル 16
  17. 17. Aparapi, JavaCL, JOCL, 実装してコード数を 比較してみました 17
  18. 18. kernel.execute(size); Yes No 最初の実行? No OpenCLが入ってる? OpenCLが入ってる? Yes Yes バイトコードを NoOpenCL Cに変換できた? Yes Java Thread Poolで実行 OpenCLで実行! 18
  19. 19. バイトコードって?• Wikipediaより – 仮想マシンによる実行のために設計された、 実行可能なプログラムのバイナリ表現である• Javaバイトコード – Javaのコンパイラが生成するコード – JVMのインタプリタによって ネイティブコードに変換されて実行される 19
  20. 20. Aparapiの主な制限• 1次元配列のみ – finalをつける – Primitiveなデータ型のみ • Float, Double, Integerなど使用不可 • ArrayListなど使用不可• switch, break, continueなど使用不可 – JTPで実行される• run()内でnewできない ※詳しく知りたい方はJavaKernelGuidelinesを参照 20
  21. 21. パフォーマンス・チューニング• ローカルメモリ – @Local修飾子 – 1次元配列のみ• 同期 – localBarrier(), globalBarrier()• Range class – NDRangeのサイズを細かく指定 – execute( Range.create2D(w,h,16,16) ) 21
  22. 22. デモ• 正方行列の乗算• バイトニックソート• GUIとの連動 22
  23. 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
  24. 24. データ転送を操作する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
  25. 25. まとめ• Aparapiで簡単に並列プログラミング – 深くOpenCLを学ぶ必要がない• データ転送に注意する – setExplicit(true), put(arr[]), get(arr[])• もっと詳しく知りたい人は – http://code.google.com/p/aparapi/ 25
  26. 26. ご清聴ありがとうございました 26

×