GPGPUによるパーソナルスーパーコンピュータの可能性
-
Upload
yusaku-watanabe -
Category
Documents
-
view
3.458 -
download
4
Transcript of GPGPUによるパーソナルスーパーコンピュータの可能性
GPGPU によるパーソナルスーパーコンピュータの可能性
<日付 2010/03/23> 渡辺 雄作
1
概要......................................................................................................................3
NVIDIA CUDA について........................................................................................4
機能、特徴..........................................................................................................4
アーキテクチャ...................................................................................................5
CPU との性能比較...................................................................................................6
開発環境................................................................................................................7
コンパイル、及びオプション...................................................................................8
デバッグ................................................................................................................9
環境構築..............................................................................................................10
Linux..................................................................................................................10
MacOS................................................................................................................10
環境の確認...........................................................................................................11
演算パフォーマンス..............................................................................................12
考察....................................................................................................................14
2
概要現在の CPU はムーアの法則と呼ばれる経験則の通り処理能力を上げてきたが、トランジス
タの集積率の限界、発熱問題などにより限界に達しつつある。
そのため各ベンダーは Intel Core シリーズ、AMD Athlon64 などマルチコア化の道へ踏み
出している。
その流れに対して、GPU は座標変換や光源処理などに使う比較的単純な演算を大量に行う
ことでグラフィックス性能を今もなお大幅に上げ続けている。
単純な演算であるが故に演算処理をソフトウェアで処理せずに、ハードウェア化し高速化を
図っていることや、ハードウェアによるメニーコアによる処理が可能なことがその下支え
となっている。
GPGPU はそのメニーコア技術を汎用的に利用できるようにする仕組み(General Purpose
Computation on Graphics Processing Unit)、汎用 GPU の 略である。」GPU に搭載されているメニーコアによる演算能力をグラフィックス以外にも利用する技術
として近年注目を集めている。
長崎大学では GPU を 760 個並列し 158TFLOPS の演算性能をたたき出し、地球シミュレー
タの 122TFLOPS を上回る性能を出した。
ちなみに発表された開発費は 3800 万円である。(※地球シミュレータは 400 億円)
3
NVIDIA CUDA について
NVIDIA が提供する GPU を利用した並列コンピューティングアーキテクチャ。
機能、特徴
GPU で並列アプリケーション開発を行うための標準 C 言語 FFT (高速フーリエ変換) および BLAS (線形代数の基本サブルーチ
ン)用標準数値ライブラリ GPU と CPU 間での高速データ転送パスを使用したコンピューティング専
用 CUDA ドライバ OpenGL および DirectX グラフィックスドライバと CUDA ドライバを同
時使用可能 Linux 32/64 ビット、Windows XP 32/64 ビット、および Mac の
OS をサポート
4
アーキテクチャ
実行される thread は Block という単位で束ねられ、それぞれの Block は共有のメモリを持
つ(Shared Memory)。
Block を束ねるものとして Grid という概念があるが、GPU カーネル上で動作する Grid は
一つだけである。
Block は最大で 65536 個生成可能、1Block あたりの最大スレッド数は 512 となっている。
※ ハードウェア的には Block に対応する Processor(StreamingMultiprocessor)と
thread に対応する Processor(ScalarProcessor)の搭載数が違うので、実行順に各
Pocessor に割り当てられる。
ちなみに各 thread の生成コストは非常に少ない(1 クロック)ので、ソフトウェアで生成
するスレッドのようにあまり生成コストをあまり気にかける必要はない。
メモリは thread ローカルメモリ→SharedMemory→GlobalMemory の順でレイテンシが
大きくなるので注意が必要。
基本的に read/write 共に 1clock で完了するが、GlobalMemory に関しては 400〰600 ク
ロックのレイテンシが加わる。
Grid
Block
Shared Memory
thread
thread
thread
thread
thread
thread
thread
thread
Block
Shared Memory
thread
thread
thread
thread
thread
thread
thread
thread
Block
Shared Memory
thread
thread
thread
thread
thread
thread
thread
thread
Block
Shared Memory
thread
thread
thread
thread
thread
thread
thread
thread
Global MemoryConstant/Texture Memory
5
CPU との性能比較
演算装置製品
クロック周波
数core 数 TDP
メモリクロッ
ク
メモリバンド
幅
CPU
Corei7
(-975
Extreme
Edition)
3.33GHz8
(HT を含む)130W
266MHz(DD
R3-2133 の場
合)
17.067GB/
sec
GPU
GeForce
9800
GT
1.35 GHz 112 105W 900MHz 57.6GB/sec
GPU(Fel
mi
Tesla
20701.40GHz 512 225W 2048MHz 170GB/sec
GPU は CPU に比べて、クロック周波数が低いものの core 数が文字通り桁違いに多く搭載
されていることがわかる。
またメモリ性能についても 3倍~10倍の性能差がある。
※Felmi は NVIDIA の次世代 GPU アーキテクチャ
6
開発環境
CUDA ドライバ
CUDAツールキット一式
CUDA SDK コードサンプル
が NVIDIAからダウンロード可能。
SDK には以下の内容が含まれる
nvcc C コンパイラ GPU のための CUDA FFT および BLAS ライブラリ プロファイラ GPU のための gdb デバッガ CUDA ランダムドライバ(標準 NVIDIA GPU ドライバでも使用可能) CUDA プログラミングマニュアル
7
コンパイル、及びオプション
C 言語で記載されたソースコード(cuda 用には拡張子.cu 使う)を nvcc を使ってコンパイ
ルを行う。
主な(よく使う)オプションは
--output-file <file> (-o)
ファイル出力先の指定をする
--pre-include <include-file> (-include)
include ファイルの指定を行う。
Cuda 用のユーティリティとして cutil が提供されているので、そのヘッダーファイル
(cutil.h)の指定を行う
--library <library> (-l)
ライブラリの指定を行う。
--device-debug <level> (-G)
デバッグ時はこのオプションをつけてコンパイルする必要がある。
--device-emulation (-deviceemu)
GPU が搭載されていない環境で実行する際はエミュレーションモードで起動する必要
があるので、このオプションを付加する。
例)
nvcc –g –G -o /home/hoge/cudaDev/affineConvertOnCuda –include /home/hoge/
/NVIDIA_GPU_Computing_SDK/C/common/inc/cutil.h
/home/hoge/cudaDev/affineConvertOnCuda.cu
8
デバッグ
cuda-gdb を利用する。
基本的な使い方は GDB を踏襲するが以下の拡張機能がある。
デバイス(GPU)メモリ上の変数を参照可能
スレッド間の切り替え可能(thread <<<(BX,BY),(TX,TY,TZ)>>>)
CUDA 上のブロック数、スレッド数を参照可能(info cuda threads)
上記機能拡張によりスレッドを切り替えて、ステップ実行というような細かいデバッグが
可能である。
[yuhsaku@localhost cudaDev]$ cuda-gdb affineConvertOnCuda ←cuda-gdb をプログラム指定で
起動
(cuda-gdb) break affineConvertOnCuda.cu :73 ←73 行目にブレイクポイントを設
定
(cuda-gdb) run ←実行
[Current CUDA Thread <<<(0,0),(0,0,0)>>>] ←現在のスレッドが表示される
Breakpoint 1, convert () at /home/yuhsaku/cudaDev/affineConvertOnCuda.cu:73
73 to_matrix_p[to_counter] = matrix_p[counter];←73 行目のコードが表示される
Current language: auto; currently c++
(cuda-gdb) print counter ←現在のスレッドの変数 counter を表示す
る
$1 = 0
(cuda-gdb) info cuda threads ←現在の全スレッドを確認する
<<<(0,0),(0,0,0)>>> ... <<<(15,0),(23,0,0)>>> convert ()
at /home/yuhsaku/cudaDev/affineConvertOnCuda.cu:73
(cuda-gdb) thread <<<(1,0),(1,0,0)>>> ←ブロック 1 の中のスレッド 1 に
切り替える
(cuda-gdb) print counter ←切り替えたスレッドの変数 counter を表
示する
$1 = 1
(cuda-gdb) cont ←次のブレイクポイントまで実行する
9
環境構築Linux
OS:CentOS 5.4
cudadriver_2.3_linux_64_190.18.run
cudatoolkit_2.3_linux_64_rhel5.3.run
cudasdk_2.3_linux.run
の順番でインストール。
ホームディレクトリに NVIDIA_GPU_Computing_SDK というディレクトリが作成される。
libXmu-devel.x86_64
libXi-devel.x86_64
が必要になるのでインストールする。
MacOS
drivers/cudadriver_2.3.1a_macos.pkg
toolkit/cudatoolkit_2.3a_macos_32.pkg
gpucomputingsdk_2.3a_macos_32.pkg
の順番でインストール。
/Developer/GPU Computing というディレクトリにインストールされる。
※ Linux、MAC ともに以下の環境変数をセットする。
C_INCLUDE_PATH="/Developer/GPU
Computing/C/common/inc":/usr/local/cuda/include:$C_INCLUDE_PATH
LIBRARY_PATH="/Developer/GPU Computing/C/common/lib":"/Developer/GPU
Computing/C/lib":/usr/local/lib:$LIBRARY_PATH
10
環境の確認
deviceQuery を実行し、CUDA が利用可能か確認する
※ GPU が対応していない、認識されない場合は以下の Device の箇所が
Device 0: "Device Emulation (CPU)"と表示される。
以下に主要な情報について記載する
[yuhsaku@localhost release]$ ./deviceQuery
CUDA Device Query (Runtime API) version (CUDART static linking)
There is 1 device supporting CUDA
Device 0: "GeForce 9800 GT"
CUDA Driver Version: 2.30
CUDA Runtime Version: 2.30
CUDA Capability Major revision number: 1
CUDA Capability Minor revision number: 1
Total amount of global memory: 1073020928 bytes ←グローバルメモリ
Number of multiprocessors: 14
Number of cores: 112 ←コア数
Total amount of constant memory: 65536 bytes
Total amount of shared memory per block: 16384 bytes ←ブロック別の shared メモリ
Total number of registers available per block: 8192
Warp size: 32
Maximum number of threads per block: 512 ←1 ブ ロ ッ ク内に設定で き る
thread 数
Maximum sizes of each dimension of a block: 512 x 512 x 64
Maximum sizes of each dimension of a grid: 65535 x 65535 x 1
Maximum memory pitch: 262144 bytes
Texture alignment: 256 bytes
Clock rate: 1.35 GHz ←クロック
Concurrent copy and execution: Yes
Run time limit on kernels: No
Integrated: No
Support host page-locked memory mapping: No
Compute mode: Default (multiple host threads can use this device
11
simultaneously)
12
演算パフォーマンス行列同士を積算させるプログラムをコンパイルして実行を行い検証する。
環境:CentOS5.4, Corei3、 mem4G, GeForce 9800GT
※ サンプルコードは別途参照
※CPU での処理はシングルスレッドのため、1 コアしか利用していない
512*512 の行列同士の積算
処理方法 計算時間(sec) 計算結果
CUDA(GPU) 0.005285024642944335937500000
000
17614889811968.000000
CPU 0.988089084625244140625000000
000
17614889811968.000000
1024*1024 の行列同士の演算
処理方法 計算時間(sec) 計算結果
CUDA(GPU) 0.032414913177490234375000000
000
563314824314880.00000
0
CPU 32.76087808609008789062500000
0000
563314824314880.00000
0
2048*2048 の行列同士の演算
処理方法 計算時間(sec) 計算結果
CUDA(GPU) 0.254090070724487304687500000
000
18020237517520896.000
000
CPU 279.3873720169067382812500000
00000
18020239665004544.000
000
13
※あまりに差が開きすぎて 1024 行列積算以降は棒グラフには表示されず。
上記実行結果から今回利用している GPU の場合は 100倍〰200倍の性能が出ていること
がわかる。
考察今回は NVIDIAから提供されている CUDA を利用した。
今後は ATIから提供されている ATI Stream などもあることから、統合フレームワークの
OpenCL を利用した開発が効率的かと思われる。
基本的には演算処理を文字通り桁違いに速くできる(並列化できる)ので、大量の計算処理
が必要な R&D向きかと思われる。
実際、NVIDIA(CUDA)の採用事例としても物理シミュレーションから石油・ガス探査、
製品設計、医療用画像などが挙げられている。
しかし、今回の検証で得られたことは
・ 並列処理を意識したプログラミングスキルを習得することによって個人でも新たな可能
性を生み出すことができる。
・ 「演算のみ速くできても、(フロントエンドとしての)Web サービスでは利用シーン
がない」ではなく「常識を覆すほどの演算能力を手に入れることにより、常識を覆す
Web サービスを作ることができる可能性がある」ということを意識できる。
という点になる。
14
プログラマはハードウェアのスケールアップに依存した逐一的なプログラミングから、ハ
ードウェアの性能を完全に引き出し、スケールする並列プログラミングの技術を習得する
ことが重要になると予測する。
引用:日経 BP社
上記の Microsoft ソフトウエアアーキテクトのハーブ・サッター氏による Fall Processor
Forum 2005 の基調講演の資料ではハードウェアが提供してくれるスケールアップによる
性能向上(フリーランチ:無料の食事)の時代は終わったと宣言している。
1 コアあたりの性能限界を迎えつつある今、プログラマの技術転換の時代が来ているのかも
しれない。
15
Cell の最大演算性能
http://todotani.cocolog-nifty.com/blog/2008/02/cell_1b22.html
Telsa
http://www.nvidia.com/docs/IO/43395/BD-04983-001_v01_New.pdf
Cuda ZONE
http://www.nvidia.co.jp/object/cuda_home_new_jp.html
CUDA-GDB
http://developer.download.nvidia.com/compute/cuda/2_1/cudagdb/
CUDA_GDB_User_Manual.pdf
GPU コンピューティングの現状
http://www.slideshare.net/pfi/20091210-gpu
マルチコア CPU でプログラミング言語が変わる?
http://pc.nikkeibp.co.jp/article/trend/20080528/1003620/
16