PyOpenCLによるGPGPU入門

10,684 views

Published on

0 Comments
21 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
10,684
On SlideShare
0
From Embeds
0
Number of Embeds
161
Actions
Shares
0
Downloads
62
Comments
0
Likes
21
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
  • PyOpenCLによるGPGPU入門

    1. 1. PyOpenCLによる GPGPU入門
    2. 2. お前、誰よ尾上 洋介(@_likr)関西大学大学院 総合情報学研究科 M2 ナップザック問題とかやってるPythonとかOCamlも好き
    3. 3. おのうえとGPGPU2010年夏 卒研のためGPGPUに取り組む2010年冬 GPGPUで論文投稿2011年夏 某社でGPGPU関係のインターンに参加2011年冬 kyoto.pyでPyOpenCLの布教活動2012年春 修論のためのGPUプログラムを開発中?
    4. 4. GPGPUとはGPGPU : General Purpose Computing on GPU GPUによる汎目的計算2003年頃から利用が開始スパコンなどでも利用今後モバイルにも普及が進む(?)
    5. 5. GPU処理の特徴数百∼数千のコア高速なメモリアクセス高い費用対効果演算性能向上率が高い
    6. 6. OpenCLとはヘテロジニアス並列環境のためのフレームワークマルチコアCPU、GPU、DSP、FPGA Host Device CPU Processor Bus Memory Memory
    7. 7. Why OpenCL ?各社のGPUが対応 NVIDIA、AMD、Intel (Ivy Bridge)非プラットフォーム依存(建前上は)ピュアなC/C++
    8. 8. Why Python ?ソースコードが簡潔コンパイル不要カーネルコードは通常のOpenCLと共通Pythonの各種ライブラリを利用可能GPGPU概念の習得、アプリケーション開発に最適
    9. 9. Agenda1. 概要2. GPGPUの基礎3. PyOpenCLによるGPGPU入門4. PyOpenCLのArray5. PythonによるOpenCLアプリケーション開発
    10. 10. GPGPUの基礎
    11. 11. ヘテロジニアス環境異なる種類のプロセッサを組み合わせたハイブリッドシステム独立したメモリ領域 Host GPU CPU SM PCIe Memory Memory
    12. 12. GPUのアーキテクチャStreaming Multiprocessor(SM) GPU GPUの処理実行単位 SMStreaming Processor(SP) Shared Memory CUDAコア SP RegistersGPU全体のリソースと Global MemorySM毎のリソース NVIDIA GPUの構成(簡易)
    13. 13. GPUのメモリ階層 SP毎 SM毎 全体高速 Register Shared Memory Constant Memory低速 Local Memory Global Memory
    14. 14. ワークグループとワークアイテムワークアイテムが処理の最小単位(≒スレッド)ワークグループはワークアイテムの集まりワークグループごとにSMで処理されるワークアイテム、ワークグループは OpenCL Specification 1.1より3次元のIDを持つ
    15. 15. 高速なGPU処理のためにデータ並列 スレッド間の同期を減 らすメモリ転送を減らす 条件分岐を減らすグローバルメモリアクセスを減らす …アクセスが高速なメモリを使う 処理特性の理解が重要
    16. 16. GPGPUの適用分野行列・ベクトルの演算画像処理、音声処理流体計算、天文計算線形計画問題、ナップザック問題、スケジューリング問題、金融工学
    17. 17. PyOpenCLによるGPGPU入門
    18. 18. プラットフォームとデバイス各社から提供される NVIDIA OpenCLOpenCLプラットフォームは GPU 11台のマシンに同居可能 GPU 2各プラットフォームには1個以上のデバイス Intel OpenCL実行時にプラットフォームと CPUデバイスを選択 GPU
    19. 19. インストール1. OpenCL環境のインストール NVIDIA、AMD、Intel、Apple…2. 依存ライブラリのインストール $ easy_install numpy $ easy_install mako3. PyOpenCLのインストール $ easy_install pyopencl
    20. 20. OpenCLプログラムの登場人物Context ContextCommandQueue Host デバイスの制御 Command QueueBuffer GPU上のメモリ GPUKernel GPUで実行されるプログラム Program BufferProgram Kernelの集まり Kernel
    21. 21. 基本手順1. Context、CommandQueue、 Programの作成 Host GPU2. GPUのメモリ確保 CPU SM3. GPUへのデータ転送 PCIe Memory Memory4. GPUでの計算5. GPUからのデータ転送
    22. 22. Contextの作成 1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3create_some_context() 4 5 import pyopencl as cl import numpy実行時にデバイスと 6 7 # Contextの作成プラットフォームを 8 ctx = cl.create_some_context() 9選択 10 # CommandQueueの作成 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
    23. 23. Programの作成 13 # Programの作成カーネル関数は 14 prg = cl.Program(ctx, """//CL// 15 __kernel void sum(OpenCL C言語で実装 16 __global const float *a, 17 __global const float *b, 18 __global float *cPythonソース内に 19 20 ) { 21 int gid = get_global_id(0);カーネル関数を 22 c[gid] = a[gid] + b[gid]; 23 }文字列で埋め込む 24 """).build()
    24. 24. デバイス側メモリの確保ホストとデバイス 26 # ホスト側メモリ確保それぞれでメモリ 27 a = numpy.random.rand(50000).astype(numpy.float32) 28 b = numpy.random.rand(50000).astype(numpy.float32) 29 a_plus_b = numpy.empty_like(a) 30領域を確保 31 # デバイス側メモリ確保 32 mf = cl.mem_flags 33 size = a.nbytes 34 a_buf = cl.Buffer(ctx, mf.READ_ONLY, size)ホスト側には 35 36 b_buf = cl.Buffer(ctx, mf.READ_ONLY, size) dest_buf = cl.Buffer(ctx, mf.WRITE_ONLY, size)numpy.ndarrayを使用
    25. 25. メモリ転送とカーネル呼び出しホストのメモリはデバイスから直接操作不可デバイスのメモリはホストから直接操作不可カーネル関数呼び出し時にワークアイテム、ワークグループのサイズを指定 38 # デバイスへのメモリ転送 39 cl.enqueue_copy(queue, a_buf, a) 40 cl.enqueue_copy(queue, b_buf, b) 41 42 # カーネル呼び出し 43 prg.sum(queue, a.shape, None, a_buf, b_buf, dest_buf) 44 45 # デバイスからのメモリ転送 46 cl.enqueue_copy(queue, a_plus_b, dest_buf)
    26. 26. PyOpenCLのArray
    27. 27. pyopencl.arraynumpyライクなインタフェースベクトル、行列演算乱数列生成リダクション、スキャンのショートカットデバイスを意識せずに演算の高速化が可能
    28. 28. サンプルコード11 # numpyのarrayをpyopenclのarrayに変換12 a_host = numpy.random.rand(5000).astype(numpy.float32)13 a = pyopencl.array.to_device(queue, a_host)1415 # ゼロクリアされたarrayの生成16 b = pyopencl.array.zeros(queue, (5000,), numpy.float32)1718 # 値がランダムなarrayの生成19 c = clrandom.rand(queue, (5000,), numpy.float32)2021 # 演算22 a += 223 a /= 324 a += c25 print a.get()2627 # 数学関数28 print clmath.sin(c).get()2930 # リダクション31 print pyopencl.array.sum(b)
    29. 29. リダクション 10 1 8 -1 0 -2 3 5総和 10 -1 11 4最小値最大値 21 3… 24
    30. 30. Reductionの高速化共有メモリの使用warpダイバージェントを減らす多段リダクション…考慮する要因がたくさん!
    31. 31. カスタムリダクション チューニングされたカーネルを必要な部分 の実装のみで利用可能 9 sum_square_expr = +.join(x{0}[i] * x{0}[i].format(i) for i in range(n))10 arguments = , .join(__global float* x{0}.format(i) for i in range(n))11 kernel = ReductionKernel(12 context,13 numpy.int32,14 neutral=0,15 reduce_expr=a + b,16 map_expr=({0} <= 1.f) ? 1 : 0.format(sum_square_expr),17 arguments=arguments)
    32. 32. PythonによるOpenCLアプリケーション開発
    33. 33. PyOpenCLアプリケーションPythonのWebフレームワーク、GUIツールキット、その他ライブラリなどとシームレスに統合可能
    34. 34. デモ1 OpenGL連携PyOpenGL / PyOpenCL による流体シミュレーション
    35. 35. デモ2 PyQt4Gaussian FIlter
    36. 36. ソースコードデモ1 https://bitbucket.org/likr/pyopencl_rungekuttaデモ2 https://bitbucket.org/likr/gaussian
    37. 37. 最後に
    38. 38. まとめOpenCLで非プラットフォーム依存なGPUコンピューティングを習得PyOpenCLによる簡潔なコーディングでOpenCLの概念を素早く吸収Pythonの各種ライブラリを使ったアプリケーション開発
    39. 39. 参考資料CUDA プログラミング入門(白山工業 森野編)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
    40. 40. 参考資料改訂新版 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
    41. 41. ご清聴ありがとうございました

    ×