SlideShare a Scribd company logo
PyOpenCLによる
 GPGPU入門
お前、誰よ

尾上 洋介(@_likr)

関西大学大学院 総合情報学研究科 M2

 ナップザック問題とかやってる

PythonとかOCamlも好き
おのうえとGPGPU
2010年夏 卒研のためGPGPUに取り組む

2010年冬 GPGPUで論文投稿

2011年夏 某社でGPGPU関係のインターンに参加

2011年冬 kyoto.pyでPyOpenCLの布教活動

2012年春 修論のためのGPUプログラムを開発中?
GPGPUとは
GPGPU : General Purpose Computing on GPU
  GPUによる汎目的計算

2003年頃から利用が開始

スパコンなどでも利用

今後モバイルにも普及が進む(?)
GPU処理の特徴

数百∼数千のコア

高速なメモリアクセス

高い費用対効果

演算性能向上率が高い
OpenCLとは
ヘテロジニアス並列環境のためのフレームワーク

マルチコアCPU、GPU、DSP、FPGA

    Host            Device
    CPU            Processor
            Bus
   Memory          Memory
Why OpenCL ?

各社のGPUが対応

 NVIDIA、AMD、Intel (Ivy Bridge)

非プラットフォーム依存(建前上は)

ピュアなC/C++
Why Python ?
ソースコードが簡潔

コンパイル不要

カーネルコードは通常のOpenCLと共通

Pythonの各種ライブラリを利用可能

GPGPU概念の習得、アプリケーション開発に最適
Agenda
1.   概要

2.   GPGPUの基礎

3.   PyOpenCLによるGPGPU入門

4.   PyOpenCLのArray

5.   PythonによるOpenCLアプリケーション開発
GPGPUの基礎
ヘテロジニアス環境
異なる種類のプロセッサを組み合わせた
ハイブリッドシステム

独立したメモリ領域

    Host            GPU
    CPU              SM
            PCIe
   Memory          Memory
GPUのアーキテクチャ

Streaming Multiprocessor(SM)
                                     GPU
  GPUの処理実行単位
                                         SM
Streaming Processor(SP)                       Shared Memory

  CUDAコア                            SP          Registers



GPU全体のリソースと                      Global Memory
SM毎のリソース
                               NVIDIA GPUの構成(簡易)
GPUのメモリ階層

       SP毎             SM毎            全体

高速     Register     Shared Memory Constant Memory


低速   Local Memory                  Global Memory
ワークグループとワークアイテム

ワークアイテムが処理の
最小単位(≒スレッド)

ワークグループは
ワークアイテムの集まり

ワークグループごとに
SMで処理される

ワークアイテム、
ワークグループは      OpenCL Specification 1.1より

3次元のIDを持つ
高速なGPU処理のために
データ並列          スレッド間の同期を減
               らす
メモリ転送を減らす
               条件分岐を減らす
グローバルメモリアク
セスを減らす         …

アクセスが高速なメモ
リを使う         処理特性の理解が重要
GPGPUの適用分野
行列・ベクトルの演算

画像処理、音声処理

流体計算、天文計算

線形計画問題、ナップザック問題、
スケジューリング問題、金融工学
PyOpenCLによるGPGPU入門
プラットフォームとデバイス

各社から提供される         NVIDIA OpenCL
OpenCLプラットフォームは
                      GPU 1
1台のマシンに同居可能
                      GPU 2
各プラットフォームには
1個以上のデバイス          Intel OpenCL
実行時にプラットフォームと          CPU
デバイスを選択               GPU
インストール
1.   OpenCL環境のインストール

      NVIDIA、AMD、Intel、Apple…

2.   依存ライブラリのインストール

      $ easy_install numpy

      $ easy_install mako

3.   PyOpenCLのインストール

      $ easy_install pyopencl
OpenCLプログラムの登場人物

Context
                                 Context
CommandQueue                      Host
   デバイスの制御               Command Queue
Buffer GPU上のメモリ
                                  GPU
Kernel GPUで実行されるプログラム               Program
                        Buffer
Program Kernelの集まり                       Kernel
基本手順
1.   Context、CommandQueue、
     Programの作成
                              Host            GPU
2.   GPUのメモリ確保
                              CPU              SM
3.   GPUへのデータ転送                       PCIe
                             Memory          Memory
4.   GPUでの計算

5.   GPUからのデータ転送
Contextの作成
                                   1   #!/usr/bin/env python
                                   2   # -*- coding: utf-8 -*-
                                   3
create_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
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 *c
Pythonソース内に     19
                20
                     )
                     {
                21       int gid = get_global_id(0);
カーネル関数を         22       c[gid] = a[gid] + b[gid];
                23   }
文字列で埋め込む        24   """).build()
デバイス側メモリの確保

ホストとデバイス 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を使用
メモリ転送とカーネル呼び出し
ホストのメモリはデバイスから直接操作不可

デバイスのメモリはホストから直接操作不可

カーネル関数呼び出し時に
ワークアイテム、ワークグループのサイズを指定
 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)
PyOpenCLのArray
pyopencl.array
numpyライクなインタフェース

ベクトル、行列演算

乱数列生成

リダクション、スキャンのショートカット

デバイスを意識せずに演算の高速化が可能
サンプルコード
11 # numpyのarrayをpyopenclのarrayに変換
12 a_host = numpy.random.rand(5000).astype(numpy.float32)
13 a = pyopencl.array.to_device(queue, a_host)
14
15 # ゼロクリアされたarrayの生成
16 b = pyopencl.array.zeros(queue, (5000,), numpy.float32)
17
18 # 値がランダムなarrayの生成
19 c = clrandom.rand(queue, (5000,), numpy.float32)
20
21 # 演算
22   a += 2
23   a /= 3
24   a += c
25   print a.get()
26
27   # 数学関数
28 print clmath.sin(c).get()
29
30 # リダクション
31 print pyopencl.array.sum(b)
リダクション
      10 1 8 -1 0 -2 3 5
総和
      10 -1 11 4
最小値

最大値   21 3


…     24
Reductionの高速化
共有メモリの使用

warpダイバージェントを減らす

多段リダクション

…
考慮する要因がたくさん!
カスタムリダクション

      チューニングされたカーネルを必要な部分
      の実装のみで利用可能


 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)
Pythonによる
OpenCLアプリケーション開発
PyOpenCLアプリケーション




PythonのWebフレームワーク、GUIツールキット、そ
の他ライブラリなどとシームレスに統合可能
デモ1 OpenGL連携


PyOpenGL / PyOpenCL による流体シミュレーション
デモ2 PyQt4


Gaussian FIlter
ソースコード

デモ1

 https://bitbucket.org/likr/pyopencl_rungekutta
デモ2

 https://bitbucket.org/likr/gaussian
最後に
まとめ
OpenCLで非プラットフォーム依存な
GPUコンピューティングを習得

PyOpenCLによる簡潔なコーディングで
OpenCLの概念を素早く吸収

Pythonの各種ライブラリを使った
アプリケーション開発
参考資料
CUDA プログラミング入門(白山工業 森野編)
http://www.youtube.com/user/NVIDIAJapan

はじめてのCUDAプログラミング
ー脅威の開発環境[GPU+CUDA]を使いこなす!
http://www.amazon.co.jp/dp/4777514773

PyCUDAの紹介 - PythonとAWSですぐ始めるGPUコンピューティング
http://www.slideshare.net/likr/pycuda
参考資料
改訂新版 OpenCL入門 1.2対応
マルチコアCPU・GPUのための並列プログラミング
http://www.amazon.co.jp/dp/4844331728

The OpenCL Specification Version 1.2
http://www.khronos.org/registry/cl/specs/opencl-1.2.pdf

PyOpenCL
http://mathema.tician.de/software/pyopencl

PyOpenCLハンズオン in kyoto.py 資料
http://pykyoto201109-pyopencl.s3-website-ap-northeast-1.amazonaws.com/pyopencl.html
ご清聴ありがとうございました

More Related Content

PDF
ChatGPTは思ったほど賢くない
PDF
プログラムを高速化する話Ⅱ 〜GPGPU編〜
PDF
ARM CPUにおけるSIMDを用いた高速計算入門
PDF
研究効率化Tips Ver.2
PPTX
CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編
PDF
続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2
PDF
ゲーム開発者のための C++11/C++14
PDF
マルチレイヤコンパイラ基盤による、エッジ向けディープラーニングの実装と最適化について
ChatGPTは思ったほど賢くない
プログラムを高速化する話Ⅱ 〜GPGPU編〜
ARM CPUにおけるSIMDを用いた高速計算入門
研究効率化Tips Ver.2
CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編
続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2
ゲーム開発者のための C++11/C++14
マルチレイヤコンパイラ基盤による、エッジ向けディープラーニングの実装と最適化について

What's hot (20)

PDF
TensorFlow XLAは、 中で何をやっているのか?
PDF
Marp Tutorial
PDF
機械学習モデルのサービングとは?
PDF
機械学習で泣かないためのコード設計
PPTX
冬のLock free祭り safe
PDF
1076: CUDAデバッグ・プロファイリング入門
PPTX
backbone としての timm 入門
PDF
2015年度先端GPGPUシミュレーション工学特論 第5回 GPUのメモリ階層の詳細 (様々なメモリの利用)
PDF
関数型プログラミングのデザインパターンひとめぐり
PPTX
なぜなにリアルタイムレンダリング
PDF
テスト文字列に「うんこ」と入れるな
PDF
最適輸送の計算アルゴリズムの研究動向
PPTX
研究者のための Python による FPGA 入門
PDF
CUDAのアセンブリ言語基礎のまとめ PTXとSASSの概説
PPTX
初心者向けMongoDBのキホン!
PDF
サイバーエージェントにおけるMLOpsに関する取り組み at PyDataTokyo 23
PDF
正しいものを正しくつくる
PDF
ゼロから始める深層強化学習(NLP2018講演資料)/ Introduction of Deep Reinforcement Learning
PDF
C++ マルチスレッドプログラミング
PPTX
DXとかDevOpsとかのなんかいい感じのやつ 富士通TechLive
TensorFlow XLAは、 中で何をやっているのか?
Marp Tutorial
機械学習モデルのサービングとは?
機械学習で泣かないためのコード設計
冬のLock free祭り safe
1076: CUDAデバッグ・プロファイリング入門
backbone としての timm 入門
2015年度先端GPGPUシミュレーション工学特論 第5回 GPUのメモリ階層の詳細 (様々なメモリの利用)
関数型プログラミングのデザインパターンひとめぐり
なぜなにリアルタイムレンダリング
テスト文字列に「うんこ」と入れるな
最適輸送の計算アルゴリズムの研究動向
研究者のための Python による FPGA 入門
CUDAのアセンブリ言語基礎のまとめ PTXとSASSの概説
初心者向けMongoDBのキホン!
サイバーエージェントにおけるMLOpsに関する取り組み at PyDataTokyo 23
正しいものを正しくつくる
ゼロから始める深層強化学習(NLP2018講演資料)/ Introduction of Deep Reinforcement Learning
C++ マルチスレッドプログラミング
DXとかDevOpsとかのなんかいい感じのやつ 富士通TechLive
Ad

Viewers also liked (6)

PDF
CuPy解説
PDF
ディープラーニングフレームワーク とChainerの実装
PDF
GPU上でのNLP向け深層学習の実装について
PDF
深層学習フレームワーク Chainer の開発と今後の展開
PDF
Chainerチュートリアル -v1.5向け- ViEW2015
PDF
Introduction to DEEPstation the GUI Deep learning environment for chainer
CuPy解説
ディープラーニングフレームワーク とChainerの実装
GPU上でのNLP向け深層学習の実装について
深層学習フレームワーク Chainer の開発と今後の展開
Chainerチュートリアル -v1.5向け- ViEW2015
Introduction to DEEPstation the GUI Deep learning environment for chainer
Ad

Similar to PyOpenCLによるGPGPU入門 (20)

PDF
OpenCLに触れてみよう
PDF
PEZY-SC programming overview
KEY
関東GPGPU勉強会 LLVM meets GPU
PDF
Pythonによる並列プログラミング -GPGPUも-
KEY
PyOpenCLによるGPGPU入門 Tokyo.SciPy#4 編
PDF
Altera SDK for OpenCL解体新書 : ホストとデバイスの関係
PDF
Python で munin plugin を書いてみる
PDF
GTC Japan 2017
PDF
Kubernetes meetup-tokyo-13-customizing-kubernetes-for-ml-cluster
PDF
[GTCJ2018]CuPy -NumPy互換GPUライブラリによるPythonでの高速計算- PFN奥田遼介
PDF
2015年度GPGPU実践プログラミング 第3回 GPGPUプログラミング環境
PDF
C base design methodology with s dx and xilinx ml
PDF
GPU-FPGA 協調計算を記述するためのプログラミング環境に関する研究(HPC169 No.10)
PDF
Python physicalcomputing
PDF
C#, C/CLI と CUDAによる画像処理ことはじめ
PDF
Data Parallel C++ と OpenVINO で iGPU, NPU の計算速度とエネルギー効率を測ってみた
PDF
Anaconda & NumbaPro 使ってみた
PDF
Lisp Meet Up #19, cl-cuda: a library to use NVIDIA CUDA in Common Lisp
PDF
CMSI計算科学技術特論B(14) OpenACC・CUDAによるGPUコンピューティング
OpenCLに触れてみよう
PEZY-SC programming overview
関東GPGPU勉強会 LLVM meets GPU
Pythonによる並列プログラミング -GPGPUも-
PyOpenCLによるGPGPU入門 Tokyo.SciPy#4 編
Altera SDK for OpenCL解体新書 : ホストとデバイスの関係
Python で munin plugin を書いてみる
GTC Japan 2017
Kubernetes meetup-tokyo-13-customizing-kubernetes-for-ml-cluster
[GTCJ2018]CuPy -NumPy互換GPUライブラリによるPythonでの高速計算- PFN奥田遼介
2015年度GPGPU実践プログラミング 第3回 GPGPUプログラミング環境
C base design methodology with s dx and xilinx ml
GPU-FPGA 協調計算を記述するためのプログラミング環境に関する研究(HPC169 No.10)
Python physicalcomputing
C#, C/CLI と CUDAによる画像処理ことはじめ
Data Parallel C++ と OpenVINO で iGPU, NPU の計算速度とエネルギー効率を測ってみた
Anaconda & NumbaPro 使ってみた
Lisp Meet Up #19, cl-cuda: a library to use NVIDIA CUDA in Common Lisp
CMSI計算科学技術特論B(14) OpenACC・CUDAによるGPUコンピューティング

More from Yosuke Onoue (17)

PDF
Angular 2のRenderer
PDF
アニメーション(のためのパフォーマンス)の基礎知識
PDF
AngularJSでデータビジュアライゼーションがしたい
PDF
GDG DevFest Kobe Firebaseハンズオン勉強会
PDF
Polymerやってみた
PDF
asm.jsとWebAssemblyって実際なんなの?
PDF
AngularFireで楽々バックエンド
PDF
AngularJSとD3.jsによるインタラクティブデータビジュアライゼーション
PDF
AngularJSでの非同期処理の話
PDF
社会的決定とAHP
PDF
CUDA 6の話@関西GPGPU勉強会#5
PDF
PythonistaがOCamlを実用する方法
KEY
What's New In Python 3.3をざっと眺める
PPTX
数理最適化とPython
PPTX
201010ksmap
PPTX
PyCUDAの紹介
PPT
Rsa暗号で彼女が出来るらしい
Angular 2のRenderer
アニメーション(のためのパフォーマンス)の基礎知識
AngularJSでデータビジュアライゼーションがしたい
GDG DevFest Kobe Firebaseハンズオン勉強会
Polymerやってみた
asm.jsとWebAssemblyって実際なんなの?
AngularFireで楽々バックエンド
AngularJSとD3.jsによるインタラクティブデータビジュアライゼーション
AngularJSでの非同期処理の話
社会的決定とAHP
CUDA 6の話@関西GPGPU勉強会#5
PythonistaがOCamlを実用する方法
What's New In Python 3.3をざっと眺める
数理最適化とPython
201010ksmap
PyCUDAの紹介
Rsa暗号で彼女が出来るらしい

PyOpenCLによるGPGPU入門

Editor's Notes