PyOpenCLによるGPGPU入門 Tokyo.SciPy#4 編

3,771 views

Published on

Published in: Technology
0 Comments
8 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
3,771
On SlideShare
0
From Embeds
0
Number of Embeds
139
Actions
Shares
0
Downloads
50
Comments
0
Likes
8
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
  • PyOpenCLによるGPGPU入門 Tokyo.SciPy#4 編

    1. 1. PyOpenCLによるGPGPU入門 Tokyo.SciPy#4 編 @_likr
    2. 2. お前、誰よ尾上 洋介(@_likr)関西大学大学院 総合情報学研究科M2 ナップザック問題とかやってるPythonとかOCamlが好き
    3. 3. 数理最適化とPythonCPLEX Python用ライブラリの提供Gurobi インタラクティブシェルベースのUIPyomo モデリング用ライブラリ
    4. 4. 発表概要OpenCL / GPGPUの概要を解説numpy.ndarrayライクのインタフェースで細部を意識することなくGPGPUを利用対応PyOpenCLのバージョンは現行最新の2011.2と次期リリースの2012.1
    5. 5. GPGPUの基礎
    6. 6. GPGPUとはGPGPU : General Purpose Computing on GPU GPUによる汎目的計算スパコンなどでも利用今後モバイルにも普及が進む(?)
    7. 7. GPU処理の特徴数百∼数千のコア高速なメモリアクセス高い費用対効果演算性能向上率が高い
    8. 8. OpenCLとはヘテロジニアス並列環境のためのフレームワークマルチコアCPU、GPU、DSP、FPGA Host Device CPU Processor Bus Memory Memory
    9. 9. OpenCLを使う利点各社のGPUが対応 NVIDIA、AMD、Intel(Ivy Bridge)CPUでも並列計算可能非プラットフォーム依存ピュアなC/C++
    10. 10. PyOpenCLAndreas Klöckner 氏が開発したPythonからOpenCL APIにアクセスするためのライブラリPyCUDAと同様のインタフェース
    11. 11. PyOpenCLを使う利点ソースコードが簡潔コンパイル不要カーネルコードは通常のOpenCLと共通Pythonの各種ライブラリを利用可能GPGPU概念の習得、アプリケーション開発に最適
    12. 12. PyOpenCLの利用
    13. 13. インストール 1OpenCLのインストール NVIDIA OpenCL AMD OpenCL Intel OpenCL Apple OpenCL
    14. 14. インストール 2pip install numpypip install makopip install pyopenclOpenCLのインストール先が標準以外の場合、OpenGL連携を有効にするなどの場合は~/.aksetup-defaults.py を作成http://d.hatena.ne.jp/likr/20120604#1338786247
    15. 15. ContextとCommandQueuecreate_some_context() 1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*-実行時にデバイスと 3 4 import pyopencl as clプラットフォームを 5 import numpy 6選択 7 # Contextの作成 8 ctx = cl.create_some_context()CommandQueue 9 10 # CommandQueueの作成 host - device間の制御 11 queue = cl.CommandQueue(ctx) [onoue@localhost test]$ python sample.py Choose device(s): [0] <pyopencl.Device Tesla C2050 on NVIDIA CUDA at 0xfd4000> [1] <pyopencl.Device GeForce GT 240 on NVIDIA CUDA at 0xc85df0> Choice, comma-separated [0]:0
    16. 16. Arrayオブジェクトdevice上のメモリ空間に確保されるnumpy.ndarrayを経由してやり取り # host側メモリ host_a = numpy.random.rand(100) host_b = numpy.random.rand(100) # ndarrayからArrayオブジェクトを作成 dev_a = clarray.to_device(queue, host_a) # hostからdeviceへデータ転送 dev_a.set(host_b) # deviceからホストへデータ転送 host_c = dev_a.get()
    17. 17. Arrayを直接生成する host - device間のデータ転送はコストがかかる 簡単なデータ生成はdeviceで行うのが効率的a = clarray.empty(queue, 100, numpy.float32)b = clarray.zeros(queue, 100, numpy.float32)c = clarray.arange(queue, 0, 1000, 10, dtype=numpy.float32)d = clrandom.rand(queue, 100, numpy.float32)
    18. 18. 同じ型のArrayを作るsize, shape, dtypeが同じArrayを作る e = clarray.empty_like(a) f = clarray.zeros_like(a)
    19. 19. fillemptyで作成したArrayの初期化などに利用 a.fill(2.0) clrandom.fill_rand(e)
    20. 20. 演算子のサポート二項演算はArray同士、 a+b -aArrayとスカラー値で可能 a-b abs(a)** は浮動小数点数のみ a*b a ** bbit演算は未対応 a/b len(a)
    21. 21. リダクション sumGPU上で効率よく計算するにはテクニックが必要な処理が min関数として提供 max
    22. 22. 性能比較
    23. 23. n = 100000 numpy Core i7 920 GTX 465 a+b 0.0001 0.0004 0.0002 a+s 0.0001 0.0004 0.0002 a*b 0.0001 0.0004 0.0002 a*s 0.0001 0.0002 0.0002 sin(a) 0.0012 0.0004 0.0002 sum(a) 0.0001 0.0027 0.0005 dot(a) 0.0001 0.0027 0.0005 rand 0.0016 0.0001 0.0008
    24. 24. n = 1000000 numpy Core i7 920 GTX 465 a+b 0.0013 0.0004 0.0004 a+s 0.0011 0.0004 0.0003 a*b 0.0013 0.0004 0.0003 a*s 0.0011 0.0002 0.0003 sin(a) 0.0124 0.0004 0.0003 sum(a) 0.0011 0.0028 0.0005 dot(a) 0.0012 0.0026 0.0005 rand 0.0158 0.0001 0.0041
    25. 25. 傾向データサイズが十分に大きければOpenCLが速い、n < 1000000ぐらいではnumpyが速いOpenCLではまだスケールしそう数学関数、乱数生成はGPUが高速
    26. 26. チューニングtips
    27. 27. 複合代入演算a = a + bはa += bと書くとメモリが節約される__idiv__は未実装なので、スカラー値による除算はa *= 1./sなどで対応 a = clarray.zeros(queue, 1000000, numpy.float32) start = time() for _ in range(10000): a += 2.0 stop = time() print stop - start # 0.942986965179 a = clarray.zeros(queue, 1000000, numpy.float32) start = time() for _ in range(10000): a = a + 2.0 stop = time() print stop - start # 3.3877761364
    28. 28. 数学関数の場合clmathの関数は新しいメモリを確保するインプレースに演算するにはElementwiseKernel from pyopencl.elementwise import ElementwiseKernel k = ElementwiseKernel(ctx, float* a, a[i] = sin(a[i]);) a = clarray.zeros(queue, 1000000, numpy.float32) start = time() for _ in range(10000): k(a) stop = time() print stop - start # 0.979743003845 a = clarray.zeros(queue, 1000000, numpy.float32) start = time() for _ in range(10000): a = clmath.sin(a) stop = time() print stop - start # 3.34474182129
    29. 29. カーネル関数の適用dataメソッドでBufferオブジェクトを取得 import pyopencl as cl from pyopencl import clrandom import numpy ctx = cl.create_some_context(False) queue = cl.CommandQueue(ctx) prg = cl.Program(ctx, //CL// __kernel void add2(__global float* a) { const int i = get_global_id(0); a[i] += 2; } ).build() a = clrandom.rand(queue, 1000, numpy.float32) prg.add2(queue, a.shape, None, a.data)
    30. 30. 参考情報
    31. 31. kyoto.pyPythonの勉強会京都を中心とした関西圏で活動活動予定 8月4日 OSC Kyoto 8月末頃 勉強会(予定)https://groups.google.com/forum/#!forum/kyotopy
    32. 32. GPGPU勉強会GPGPU関連技術、事例に関する情報共有を目的次回開催予定 関東 夏頃 関西 秋頃
    33. 33. 参考資料 1CUDA プログラミング入門(白山工業 森野編)http://www.youtube.com/user/NVIDIAJapanはじめてのCUDAプログラミングー脅威の開発環境[GPU+CUDA]を使いこなす!http://www.amazon.co.jp/dp/4777514773PyCUDAの紹介 - PythonとAWSですぐ始めるGPUコンピューティングhttp://www.slideshare.net/likr/pycuda
    34. 34. 参考資料 2改訂新版 OpenCL入門 1.2対応マルチコアCPU・GPUのための並列プログラミングhttp://www.amazon.co.jp/dp/4844331728The OpenCL Specification Version 1.2http://www.khronos.org/registry/cl/specs/opencl-1.2.pdfPyOpenCLhttp://mathema.tician.de/software/pyopenclPyOpenCLハンズオン in kyoto.py 資料http://pykyoto201109-pyopencl.s3-website-ap-northeast-1.amazonaws.com/pyopencl.html
    35. 35. ご清聴ありがとございました

    ×