関東GPGPU勉強会 LLVM meets GPU

6,863 views
6,615 views

Published on

4 Comments
17 Likes
Statistics
Notes
No Downloads
Views
Total views
6,863
On SlideShare
0
From Embeds
0
Number of Embeds
78
Actions
Shares
0
Downloads
65
Comments
4
Likes
17
Embeds 0
No embeds

No notes for slide
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • 関東GPGPU勉強会 LLVM meets GPU

    1. 1. LLVM meets GPU twitter : iitaku
    2. 2. LLVMってなによ?
    3. 3. LowL e ve lVi r t ua lM a c hi ne
    4. 4. ろーれべる・・・ばーちゃるましん?
    5. 5. 高級 低級 低級な空想上の機械?
    6. 6. ちがいます
    7. 7. 説明しよう!CV:富山敬
    8. 8. LLVMとは!コンパイル時、リンク時、実行時などあらゆる時点で プログラムを最適化するように設計された、 任意のプログラミング言語に対応可能な コンパイラ基盤である! by wikipedia
    9. 9. That’s it!
    10. 10. なんか・・・よくわからないけど?
    11. 11. LLVMの仕事 C X86 Lexer Optimize Parser Generate Asm Generate IR C++ ARM LLVM IR Obj-C Power JIT Yet AnotherProgramming Language Program Yet Another Hardware Platform
    12. 12. ようするに• ククク・・・俺の最強言語(ことだま)で世界を書き換えてやるよ• やれやれ・・この程度の最適化、奴にまかせておけ• いつの間にこんな速く・・・?!動的コード生成・・だとッ・・・・?• ああ・・どうやら新たなチップらしい。・・・わかっ
    13. 13. なんてことができます
    14. 14. さて、そろそろGPUの話を
    15. 15. 去年あたりから、LLVMにはNVIDIA GPU向けの実装が入っています
    16. 16. CUDA Frontend PTX Backendなど。しかしこれとは別に・・・
    17. 17. May, 2012 @GTC2012CUDA Compiler SDK Preview Launched !
    18. 18. なにができるの? CUDA Compiler SDK Preview NVVM IR PTX Optimize, Codegen Yet Another NVIDIAProgramming Language GPU
    19. 19. ・・・んん?
    20. 20. なにができるの? CUDA Compiler SDK Preview NVVM IR PTX Optimize, Codegen Yet Another NVIDIAProgramming Language GPU
    21. 21. 誤植ではありません
    22. 22. 説明しよう!(2回目)
    23. 23. NVVM IRとは!GPUのカーネルを表現するためにデザインされた、 LLVM IRのサブセットである!LLVM IRにwell-formedなため、既存のツールチェインからはLLVM IRとして取り扱うことが可能である!
    24. 24. 細かい話• __device__、 __constant__などはLLVMのaddress space number という概念で表される• __global__関数、__device__関数などの種別はmetadataという 仕組みで表される• 追加の組み込み関数が幾つか(nvvm.*) • 同期、テクスチャ/サーフェス、特殊レジスタ、etc..
    25. 25. NVVM Library API• Start and Shutdown• Create Compiler Unit• Verify• Compile To PTX• Get Result
    26. 26. おや、いいところに・・・
    27. 27.
    28. 28. ・・・しつれいしました
    29. 29. PyCUDA
    30. 30. 1 import pycuda.driver as drv 2 import pycuda.tools 3 import pycuda.autoinit 4 import numpy 5 import numpy.linalg as la 6 from pycuda.compiler import SourceModule 7 8 mod = SourceModule(""" 9 __global__ void multiply_them(float *dest, float *a, float *b) 10 { 11 const int i = threadIdx.x; 12 dest[i] = a[i] * b[i]; 13 } 14 """) 15 16 multiply_them = mod.get_function("multiply_them") 17 18 a = numpy.random.randn(400).astype(numpy.float32) 19 b = numpy.random.randn(400).astype(numpy.float32) 20 21 dest = numpy.zeros_like(a) 22 multiply_them( 23 drv.Out(dest), drv.In(a), drv.In(b), 24 block=(400,1,1)) 25 26 print dest-a*bPythonからGPUプログラミングが簡単にできる!
    31. 31. でも・・・
    32. 32. 4 import numpy 5 import numpy.linalg as la 6 from pycuda.compiler import SourceModule 7 8 mod = SourceModule(""" 9 __global__ void multiply_them(float *dest, float *a, float *b)10 {11 const int i = threadIdx.x;12 dest[i] = a[i] * b[i];13 }14 """)1516 multiply_them = mod.get_function("multiply_them")1718 a = numpy.random.randn(400).astype(numpy.float32)19 b = numpy.random.randn(400).astype(numpy.float32)2021 dest = numpy.zeros_like(a)22 multiply_them(23 drv.Out(dest), drv.In(a), drv.In(b),24 block=(400,1,1))
    33. 33. 8 mod = SourceModule(""" 9 __global__ void multiply_them(float *dest, float *a,float *b)10 {11 const int i = threadIdx.x;12 dest[i] = a[i] * b[i];13 }14 """)
    34. 34. ダサッ☆
    35. 35. 1 import pycuda.driver as drv 2 import pycuda.tools 3 import pycuda.autoinit 4 import numpy 5 import numpy.linalg as la 6 from pycuda.compiler import SourceModule 7 8 @kernel 9 def multiply_them(dest, a, b):10 i = threadIdx.x11 dest[i] = a[i] * b[i];12 こんなかんじで書きたい13 a = numpy.random.randn(400).astype(numpy.float32)14 b = numpy.random.randn(400).astype(numpy.float32)1516 dest = numpy.zeros_like(a)17 multiply_them(18 drv.Out(dest), drv.In(a), drv.In(b),19 block=(400,1,1))2021 print dest-a*b
    36. 36. 実装してみた pynvvm
    37. 37. @kernelデコレータで 1 import numpy as np 2 3 from pynvvm.kernel import kernel コード生成 4 from pynvvm.nvtype import array, float32, int32 5 6 @kernel(array(float32), array(float32), array(float32), float32(), int32(), int32()) 7 def saxpy(z, x, y, a, w, h): 8 xidx = pynvvm_ctaid_x() * pynvvm_ntid_x() + pynvvm_tid_x() 9 yidx = pynvvm_ctaid_y() * pynvvm_ntid_y() + pynvvm_tid_y()1011 if yidx < h and xidx < w: 専用のintrinsic12 i = yidx * w + xidx13 z[i] = a * x[i] + y[i]1415 return1617 n = 10241819 x = np.random.randn(n*n).astype(np.float32)20 y = np.random.randn(n*n).astype(np.float32)21 a = np.float32(2.71828183)2223 z = np.zeros_like(x)2425 bsz = (16, 16, 1) In, Outはコード生成時に26 gsz = ((n+16-1)/16, (n+16-1)/16, 1)2728 saxpy(bsz, gsz)(z, x, y, a, np.int32(n), np.int32(n)) 解析して自動転送2930 print(z)
    38. 38. ast.parse() @kernel decorator AST inspect.getsource() 型推論 kernel function Typed AST NVVM CodegenGO GPU! PTX Codegen PTX NVVM IR
    39. 39. こんなのがサクッとできるので、NVVMはえらいとおもいます!
    40. 40. つくったもの• LLVM LibraryのPython Binding • boost::pythonすばらしい• NVVM LibraryのPython Binding • CTypesすばらしい• Python AST -> NVVM IRのトランスレータ
    41. 41. で、速いの?• saxpy • numpy : 0.052 • pynvvm : 0.051 • python : 10.88
    42. 42. 結論:numpyすげえ
    43. 43. • saxpyだと計算量少なすぎる• じゃあsgemmでも実装しよう
    44. 44. ast.Forのトランスレータ書いてないから 実装できないやんけ!
    45. 45. pynvvm current status• 対応していない構文いっぱい• 対応していない命令いっぱい• 対応していない関数いっぱい• バグも(たぶん)いっぱい
    46. 46. http://bitbucket.org/iitaku/pynvvm
    47. 47. まとめ• NVVM IRはLLVM IR Builderで作れるので オレオレ言語をGPUで動かすのもカンタン!• アホなIR作っても色々最適化してくれるのでハッピー• みんなもCUDA Compiler SDKであそぼう
    48. 48. Related Works• py2llvm • python -> LLVM IR • http://code.google.com/p/py2llvm/• copperhead • 自動並列化 • http://code.google.com/p/copperhead/
    49. 49. Any Question?

    ×