GPGPUによるパーソナルスーパーコンピュータの可能性

16
GPGPU にににににににににににににににににににににに <にに 2010/03/23> にに にに 1

Transcript of GPGPUによるパーソナルスーパーコンピュータの可能性

Page 1: GPGPUによるパーソナルスーパーコンピュータの可能性

GPGPU によるパーソナルスーパーコンピュータの可能性

<日付 2010/03/23> 渡辺 雄作

1

Page 2: GPGPUによるパーソナルスーパーコンピュータの可能性

概要......................................................................................................................3

NVIDIA CUDA について........................................................................................4

機能、特徴..........................................................................................................4

アーキテクチャ...................................................................................................5

CPU との性能比較...................................................................................................6

開発環境................................................................................................................7

コンパイル、及びオプション...................................................................................8

デバッグ................................................................................................................9

環境構築..............................................................................................................10

Linux..................................................................................................................10

MacOS................................................................................................................10

環境の確認...........................................................................................................11

演算パフォーマンス..............................................................................................12

考察....................................................................................................................14

2

Page 3: GPGPUによるパーソナルスーパーコンピュータの可能性

概要現在の CPU はムーアの法則と呼ばれる経験則の通り処理能力を上げてきたが、トランジス

タの集積率の限界、発熱問題などにより限界に達しつつある。

そのため各ベンダーは Intel Core シリーズ、AMD Athlon64 などマルチコア化の道へ踏み

出している。

その流れに対して、GPU は座標変換や光源処理などに使う比較的単純な演算を大量に行う

ことでグラフィックス性能を今もなお大幅に上げ続けている。

単純な演算であるが故に演算処理をソフトウェアで処理せずに、ハードウェア化し高速化を

図っていることや、ハードウェアによるメニーコアによる処理が可能なことがその下支え

となっている。

GPGPU はそのメニーコア技術を汎用的に利用できるようにする仕組み(General Purpose

Computation on Graphics Processing Unit)、汎用 GPU の 略である。」GPU に搭載されているメニーコアによる演算能力をグラフィックス以外にも利用する技術

として近年注目を集めている。

長崎大学では GPU を 760 個並列し 158TFLOPS の演算性能をたたき出し、地球シミュレー

タの 122TFLOPS を上回る性能を出した。

ちなみに発表された開発費は 3800 万円である。(※地球シミュレータは 400 億円)

3

Page 4: GPGPUによるパーソナルスーパーコンピュータの可能性

NVIDIA CUDA について

NVIDIA が提供する GPU を利用した並列コンピューティングアーキテクチャ。

機能、特徴

GPU で並列アプリケーション開発を行うための標準 C 言語 FFT (高速フーリエ変換) および BLAS (線形代数の基本サブルーチ

ン)用標準数値ライブラリ GPU と CPU 間での高速データ転送パスを使用したコンピューティング専

用 CUDA ドライバ OpenGL および DirectX グラフィックスドライバと CUDA ドライバを同

時使用可能 Linux 32/64 ビット、Windows XP 32/64 ビット、および Mac の

OS をサポート

4

Page 5: GPGPUによるパーソナルスーパーコンピュータの可能性

アーキテクチャ

実行される 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

Page 6: GPGPUによるパーソナルスーパーコンピュータの可能性

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

Page 7: GPGPUによるパーソナルスーパーコンピュータの可能性

開発環境

CUDA ドライバ

CUDAツールキット一式

CUDA SDK コードサンプル

が NVIDIAからダウンロード可能。

SDK には以下の内容が含まれる

nvcc C コンパイラ GPU のための CUDA FFT および BLAS ライブラリ プロファイラ GPU のための gdb デバッガ CUDA ランダムドライバ(標準 NVIDIA GPU ドライバでも使用可能) CUDA プログラミングマニュアル

7

Page 8: GPGPUによるパーソナルスーパーコンピュータの可能性

コンパイル、及びオプション

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

Page 9: GPGPUによるパーソナルスーパーコンピュータの可能性

デバッグ

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

Page 10: GPGPUによるパーソナルスーパーコンピュータの可能性

環境構築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

Page 11: GPGPUによるパーソナルスーパーコンピュータの可能性

環境の確認

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

Page 12: GPGPUによるパーソナルスーパーコンピュータの可能性

simultaneously)

12

Page 13: GPGPUによるパーソナルスーパーコンピュータの可能性

演算パフォーマンス行列同士を積算させるプログラムをコンパイルして実行を行い検証する。

環境: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

Page 14: GPGPUによるパーソナルスーパーコンピュータの可能性

※あまりに差が開きすぎて 1024 行列積算以降は棒グラフには表示されず。

上記実行結果から今回利用している GPU の場合は 100倍〰200倍の性能が出ていること

がわかる。

考察今回は NVIDIAから提供されている CUDA を利用した。

今後は ATIから提供されている ATI Stream などもあることから、統合フレームワークの

OpenCL を利用した開発が効率的かと思われる。

基本的には演算処理を文字通り桁違いに速くできる(並列化できる)ので、大量の計算処理

が必要な R&D向きかと思われる。

実際、NVIDIA(CUDA)の採用事例としても物理シミュレーションから石油・ガス探査、

製品設計、医療用画像などが挙げられている。

しかし、今回の検証で得られたことは

・ 並列処理を意識したプログラミングスキルを習得することによって個人でも新たな可能

性を生み出すことができる。

・ 「演算のみ速くできても、(フロントエンドとしての)Web サービスでは利用シーン

がない」ではなく「常識を覆すほどの演算能力を手に入れることにより、常識を覆す

Web サービスを作ることができる可能性がある」ということを意識できる。

という点になる。

14

Page 15: GPGPUによるパーソナルスーパーコンピュータの可能性

プログラマはハードウェアのスケールアップに依存した逐一的なプログラミングから、ハ

ードウェアの性能を完全に引き出し、スケールする並列プログラミングの技術を習得する

ことが重要になると予測する。

引用:日経 BP社

上記の Microsoft ソフトウエアアーキテクトのハーブ・サッター氏による Fall Processor

Forum 2005 の基調講演の資料ではハードウェアが提供してくれるスケールアップによる

性能向上(フリーランチ:無料の食事)の時代は終わったと宣言している。

1 コアあたりの性能限界を迎えつつある今、プログラマの技術転換の時代が来ているのかも

しれない。

15

Page 16: GPGPUによるパーソナルスーパーコンピュータの可能性

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