はじめに
現在のCPUはムーアの法則と呼ばれる経験則の通り処理能力を上げてきたが、トランジスタの集積率の限界、発熱問題などにより限界に達しつつある。
そのため各ベンダーはIntel Coreシリーズ、AMD Athlon64などマルチコア化の道へ踏み出している。
その流れに対して、GPUは座標変換や光源処理などに使う比較的単純な演算を大量に行うことでグラフィックス性能を今もなお大幅に上げ続けている。
単純な演算であるが故に演算処理をソフトウェアで処理せずに、ハードウェア化し高速化を図っていることや、ハードウェアによるメニーコアによる処理が可能なことがその下支えとなっている。
GPGPUは、そのメニーコア技術を汎用的に利用できるようにする仕組み「(General Purpose Computation on Graphics Processing Unit)汎用GPU」の略である。
GPUに搭載されているメニーコアによる演算能力をグラフィックス以外にも利用する技術として近年注目を集めている。
長崎大学ではGPUを760個並列し158TFLOPSの演算性能をたたき出し、地球シミュレータの122TFLOPSを上回る性能を出した。
ちなみに発表された開発費は3800万円である。(※地球シミュレータは400億円)
NVIDIA CUDA
NVIDIAが提供するGPUを利用した並列コンピューティングアーキテクチャ。
GPUとCPUの性能比較
演算装置 | 製品 | クロック周波数 | core数 | TDP | メモリクロック | メモリバンド幅 |
---|---|---|---|---|---|---|
CPU | Corei7(-975 Extreme Edition) | 3.3GHz | 8(HT含む) | 130W | 266MHz(DDR3-2133の場合) | 17.067GB/sec |
GPU | GeForce9800 GT | 1.35GHz | 112 | 105W | 900MHz | 57.6GB/sec |
GPU(Felmi) | Tesla2070 | 1.40GHz | 512 | 225W | 2048MHz | 170GB/sec |
GPUは、CPUに比べてクロック周波数が低いものの、core数が文字通り桁違いに多く搭載されていることが分かる。また、メモリ性能についても3倍~10倍の差がある。
※FelmiはNVIDIAの次世代アーキテクチャ。
開発環境
- CUDAドライバ
- CUDAツールキット一式
- CUDA SDKコードサンプル
SDKには、以下の内容が含まれる。
- nvcc Cコンパイラ
- GPUのためのCUDA FFT及びBLASライブラリ
- プロファイラ
- GPUのためのgdbデバッガ
- CUDAランダムドライバ(標準NVIDIA GPUドライバでも使用可能)
- CUDAプログラミングマニュアル
コンパイル及びオプション
C言語で記載されたソースコード(cuda酔うには、拡張子.cuを使う)をnvccを使ってコンパイラを行う。
よく使うオプションは、
- --output-file
(-o) - --pre-include
(-include) - --library
(-l) - --device-debug
(-G) - --device-emulation (-deviceemu)
ファイルの出力先を指定する。
includeファイルの指定を行う。CUDA用のユーティリティとしてcutilが提供されているので、そのヘッダーファイル(cutil.h)の指定を行う。
ライブラリの指定を行う。
デバッグ時は、このオプションをつけてコンパイルする必要がある。
GPUが搭載されていない環境で実行する際は、エミュレーションモードで起動する必要があるので、このオプションをつける。
例:
デバッグ
cuda-gdbを利用する。
基本的な使い方はGDBを踏襲するが以下の拡張機能がある。
- デバイス(GPU)メモリ上の変数を参照可能
- スレッド間の切り替え可能(thread<<<(BX,BY),(TX,TY,TZ)>>>)
- CUDA上のブロック数、スレッド数を参照可能(info cuda threads)
環境構築
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ともに以下の環境変数をセットする。
環境の確認
deviceQueryを実行し、CUDAが利用可能か確認する。
※GPUが対応していない、認識されない場合は、以下のDeviceの箇所が
と表示される。
以下に、主要な情報について記載する。
演算パフォーマンス
行列同士を積算させるプログラムをコンパイルして実行を行い、検証する。
環境:CentOS 5.4, Corei3, mem4G, GeForce 9800 GT
※CPUでの処理はシングルスレッドのため、1コアしか利用していない。
処理方法 | 計算時間(sec) | 計算結果 |
---|---|---|
CUDA(GPU) | 0.005285024642944335937500000000 | 17614889811968.000000 |
CPU | 0.988089084625244140625000000000 | 17614889811968.000000 |
処理方法 | 計算時間(sec) | 計算結果 |
---|---|---|
CUDA(GPU) | 0.032414913177490234375000000000 | 563314824314880.000000 |
CPU | 32.760878086090087890625000000000 | 563314824314880.000000 |
処理方法 | 計算時間(sec) | 計算結果 |
---|---|---|
CUDA(GPU) | 0.254090070724487304687500000000 | 18020237517520896.000000 |
CPU | 279.387372016906738281250000000000 | 18020239665004544.000000 |
上記実行結果から、今回利用しているGPUの場合は、100倍~200倍の性能が出ていることが分かる。
考察
今回は、NVIDIAから提供されているCUDAを利用した。
今後は、ATIから提供されているATI Streamなどもあることから、統合フレームワークのOpenCLを利用した開発が効率的かと思われる。
基本的には演算処理を文字通り桁違いに速くできる(並列化できる)ので、大量の計算処理が必要なR&D向きかと思われる。
実際、NVIDIA(CUDA)の採用事例としても物理シミュレーションから石油・ガス探査、製品設計、医療用画像などが挙げられている。
しかし、今回の検証で得られたことは、
- 並列処理を意識したプログラミングスキルを習得することによって個人でも新たな可能性を生み出すことができる。
- 「演算のみ速くできても、(フロントエンドとしての)Webサービスでは利用シーンがない」ではなく「常識を覆すほどの演算能力を手に入れることにより、常識を覆すWebサービスを作ることができる可能性がある」ということを意識できる。
プログラマは、ハードウエアのスケールアップに依存した逐一的なプログラミングから、ハードウエアの性能を完全に引き出し、スケールする並列プログラミングの技術を習得することが重要になると予測する。
1コアあたりの性能限界を迎えつつある今、プログラマの技術転換の時代が来ているのかもしれない。
参考文献
【1】Cellの最大演算性能 http://todotani.cocolog-nifty.com/blog/2008/02/cell_1b22.html
【2】Cuda ZONE http://www.nvidia.co.jp/object/cuda_home_new_jp.html
【3】CUDA-GDB http://developer.download.nvidia.com/compute/cuda/2_1/cudagdb/CUDA_GDB_User_Manual.pdf
【4】GPUコンピューティングの現状 http://www.slideshare.net/pfi/20091210-gpu
【5】マルチコアCPUでプログラミング言語が変わる? http://pc.nikkeibp.co.jp/article/trend/20080528/1003620/