Your SlideShare is downloading. ×
  • Like
関東GPGPU勉強会 LLVM meets GPU
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Now you can save presentations on your phone or tablet

Available for both IPhone and Android

Text the download link to your phone

Standard text messaging rates apply

関東GPGPU勉強会 LLVM meets GPU

  • 5,502 views
Published

 

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
No Downloads

Views

Total Views
5,502
On SlideShare
0
From Embeds
0
Number of Embeds
2

Actions

Shares
Downloads
51
Comments
4
Likes
15

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    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

Transcript

  • 1. LLVM meets GPU twitter : iitaku
  • 2. LLVMってなによ?
  • 3. LowL e ve lVi r t ua lM a c hi ne
  • 4. ろーれべる・・・ばーちゃるましん?
  • 5. 高級 低級 低級な空想上の機械?
  • 6. ちがいます
  • 7. 説明しよう!CV:富山敬
  • 8. LLVMとは!コンパイル時、リンク時、実行時などあらゆる時点で プログラムを最適化するように設計された、 任意のプログラミング言語に対応可能な コンパイラ基盤である! by wikipedia
  • 9. That’s it!
  • 10. なんか・・・よくわからないけど?
  • 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. ようするに• ククク・・・俺の最強言語(ことだま)で世界を書き換えてやるよ• やれやれ・・この程度の最適化、奴にまかせておけ• いつの間にこんな速く・・・?!動的コード生成・・だとッ・・・・?• ああ・・どうやら新たなチップらしい。・・・わかっ
  • 13. なんてことができます
  • 14. さて、そろそろGPUの話を
  • 15. 去年あたりから、LLVMにはNVIDIA GPU向けの実装が入っています
  • 16. CUDA Frontend PTX Backendなど。しかしこれとは別に・・・
  • 17. May, 2012 @GTC2012CUDA Compiler SDK Preview Launched !
  • 18. なにができるの? CUDA Compiler SDK Preview NVVM IR PTX Optimize, Codegen Yet Another NVIDIAProgramming Language GPU
  • 19. ・・・んん?
  • 20. なにができるの? CUDA Compiler SDK Preview NVVM IR PTX Optimize, Codegen Yet Another NVIDIAProgramming Language GPU
  • 21. 誤植ではありません
  • 22. 説明しよう!(2回目)
  • 23. NVVM IRとは!GPUのカーネルを表現するためにデザインされた、 LLVM IRのサブセットである!LLVM IRにwell-formedなため、既存のツールチェインからはLLVM IRとして取り扱うことが可能である!
  • 24. 細かい話• __device__、 __constant__などはLLVMのaddress space number という概念で表される• __global__関数、__device__関数などの種別はmetadataという 仕組みで表される• 追加の組み込み関数が幾つか(nvvm.*) • 同期、テクスチャ/サーフェス、特殊レジスタ、etc..
  • 25. NVVM Library API• Start and Shutdown• Create Compiler Unit• Verify• Compile To PTX• Get Result
  • 26. おや、いいところに・・・
  • 27.
  • 28. ・・・しつれいしました
  • 29. PyCUDA
  • 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. でも・・・
  • 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. 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. ダサッ☆
  • 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. 実装してみた pynvvm
  • 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. ast.parse() @kernel decorator AST inspect.getsource() 型推論 kernel function Typed AST NVVM CodegenGO GPU! PTX Codegen PTX NVVM IR
  • 39. こんなのがサクッとできるので、NVVMはえらいとおもいます!
  • 40. つくったもの• LLVM LibraryのPython Binding • boost::pythonすばらしい• NVVM LibraryのPython Binding • CTypesすばらしい• Python AST -> NVVM IRのトランスレータ
  • 41. で、速いの?• saxpy • numpy : 0.052 • pynvvm : 0.051 • python : 10.88
  • 42. 結論:numpyすげえ
  • 43. • saxpyだと計算量少なすぎる• じゃあsgemmでも実装しよう
  • 44. ast.Forのトランスレータ書いてないから 実装できないやんけ!
  • 45. pynvvm current status• 対応していない構文いっぱい• 対応していない命令いっぱい• 対応していない関数いっぱい• バグも(たぶん)いっぱい
  • 46. http://bitbucket.org/iitaku/pynvvm
  • 47. まとめ• NVVM IRはLLVM IR Builderで作れるので オレオレ言語をGPUで動かすのもカンタン!• アホなIR作っても色々最適化してくれるのでハッピー• みんなもCUDA Compiler SDKであそぼう
  • 48. Related Works• py2llvm • python -> LLVM IR • http://code.google.com/p/py2llvm/• copperhead • 自動並列化 • http://code.google.com/p/copperhead/
  • 49. Any Question?