Pythonによる並列プログラミング -GPGPUも-

  • 3,319 views
Uploaded on

 

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

Views

Total Views
3,319
On Slideshare
0
From Embeds
0
Number of Embeds
4

Actions

Shares
Downloads
27
Comments
0
Likes
2

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

Transcript

  • 1. Python による並列プログラミング -GPGPU も- <日付 2011/08/31> 渡辺 雄作 1
  • 2. 目次概要 ....................................................................................................................................... 3 検証内容 ................................................................................................................................ 3 検証環境 ................................................................................................................................ 3シングルスレッドによる実行 ...................................................................................................... 3Threading による並列化 ........................................................................................................ 3Multiprocessing による並列化 ............................................................................................... 4GPGPU を使った並列化 ........................................................................................................ 5 セットアップ.............................................................................................................................. 6 Numpy インストール ............................................................................................................ 6 Boost インストール ............................................................................................................... 7 pyCUDA インストール ......................................................................................................... 8 実行 ........................................................................................................................................ 8考察 ....................................................................................................................................... 8 2
  • 3. 概要検証内容256 * 256 の行列計算について各並列化手法を試行する検証環境OS CentOS release 5.6CPU Intel(R) Core(TM) i3 CPU 540 3.07GHzmemory 8GB(DDR3 1333)シングルスレッドによる実行ソースコードは single_thread_execute.py に示す。実行結果は以下の通り1 回目:22.2145290375(sec)2 回目:23.1715860367(sec)3 回目:23.1783339977(sec)Threading による並列化Threading モジュールを使用し、Thread を 4 つ生成し並列で行列計算処理を行う。ソースコードは multi_thread_execute.py に示す。python の threading モジュールはインタプリタによる擬似スレッドとなっており、グローバルインタープリターロック(GIL)を取得したスレッドが実行する機構になっている。そのため速度は特に速度の改善は見られなかった。(むしろやや遅くなった)1 回目:26.9206619263(sec)2 回目:25.2392418385(sec)3 回目:23.6878399849(sec)top コマンドで見る限り python の 1 プロセス自体はコアスケールはしているのが確認できた。top - 19:22:32 up 22:44, 2 users, load average: 1.13, 0.49, 0.19Tasks: 133 total, 1 running, 132 sleeping, 0 stopped, 0 zombieCpu0 : 12.6%us, 4.0%sy, 0.0%ni, 83.4%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%stCpu1 : 13.7%us, 3.7%sy, 0.0%ni, 82.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%stCpu2 : 32.3%us, 3.3%sy, 0.0%ni, 64.3%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%stCpu3 : 24.9%us, 2.7%sy, 0.0%ni, 72.4%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st 4コアを使い切れてはいない。 3
  • 4. Multiprocessing による並列化multiprocessing モジュールを使用し、4 プロセスを生成し、並列で行列計算処理を行うソースコードは multi_process_execute.py に示す。Python2.6 で導入されたプロセス並列モジュール。インターフェースは threading モジュールとよく似ているため、移行しやすい。実行するとその名のとおりプロセスが 4 つ起動している事が確認できる(ひとつは親プロセス) PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+COMMAND12974 root 18 0 181m 14m 1276 R 100.2 0.4 0:07.05 python12976 root 18 0 181m 14m 1280 R 99.9 0.4 0:07.05 python12975 root 19 0 181m 14m 1276 R 99.6 0.4 0:07.04 python12972 root 25 0 181m 17m 4412 R 76.3 0.4 0:05.33 python12977 root 25 0 181m 13m 1136 R 23.3 0.4 0:01.90 pythonpython プロセスをそのまま 4 つで並列計算しているため速度は改善が見られた。1 回目:8.53098917007(sec)2 回目:8.3674018383(sec)3 回目:8.23075914383(sec) おおよそ 3 倍ぐらいになっているCPU も 4 コアを使い切っていることが確認できた。top - 14:42:16 up 2 days, 18:04, 2 users, load average: 1.25, 0.54, 0.22Tasks: 138 total, 6 running, 132 sleeping, 0 stopped, 0 zombieCpu0 : 73.8%us, 26.2%sy, 0.0%ni, 0.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%stCpu1 : 99.3%us, 0.3%sy, 0.0%ni, 0.3%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%stCpu2 :100.0%us, 0.0%sy, 0.0%ni, 0.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%stCpu3 : 99.7%us, 0.0%sy, 0.0%ni, 0.3%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st 4
  • 5. GPGPU を使った並列化GPGPU の説明については【再掲】【研究課題レポート抜粋】GPGPU によるパーソナルスーパーコンピュータの可能性http://ameblo.jp/principia-ca/entry-10736425646.htmlにて説明されているので割愛。通常 C/C++から利用される NVidia CUDA の API を python から利用する。python の CUDA バインディングとして pyCUDA が発表されているので、今回はこれを利用するhttp://mathema.tician.de/software/pycuda 5
  • 6. セットアップ Numpy インストールconfigure オプションはpython configure.py--boost-inc-dir=/usr/local/include/boost/--boost-lib-dir=/usr/local/lib/--boost-python-libname=boost_python-xgcc42-mt--cuda-root=/usr/local/cuda/で指定した後にmakemake installを行う。 Mac にセットアップする場合は export MACOSX_DEPLOYMENT_TARGET=10.6 を環境変数にセットする必要あり 6
  • 7. Boost インストール./bootstrap.sh --prefix=/usr/local/./b2 installboost.python コンポーネントのインストールも必要なので、オプションを指定してから再ビルドをかける./bootstrap.sh --prefix=/usr/local/ --with-libraries=python./b2 install Component configuration: - chrono : not building - date_time : not building - exception : not building - filesystem : not building - graph : not building - graph_parallel : not building - iostreams : not building - math : not building - mpi : not building - program_options : not building - python : building - random : not building - regex : not building - serialization : not building - signals : not building - system : not building - test : not buildingと出れば/usr/local/lib/libboost_python.a に出力されているのが確認できる - thread : not building - wave : not building pyCUDA インストール./configure.py --cuda-root=/home/x/cuda --cudadrv-lib-dir=/usr/lib64/nvidia--boost-python-libname=boost_python-mt --boost-thread-libname=boost_thread-mtmake 7
  • 8. make installインストール完了後にmake testsを実行してテストをパスすれば OK.実行pycuda モジュールを使用し、CUDA Thread を 64 * 64Thread 生成し並列で行列計算処理を行う。ソースコードは pycuda_execute.py に示す。考察C/C++を使う必要がある CUDA プログラミングにおいて、HOST 側のメモリやデバイス側のメモリ確保など実際の計算処理の準備段階が非常に煩雑になりがちだが、pycuda を使うことによりかなり簡単に(スクリプトっぽく)CUDA 計算処理が利用できるようになった。CPU を使った計算処理(大規模なソートなど)をとりあえずの処理として行いたい場合は python +CUDA で書くというのも選択肢だと感じた。今後は pyOpenCL などの動向に注視していきたい。 8