GPUコンピューティングの歴史とCUDAの誕生

2010年7月2日(金)
平野 幸彦

CUDAによるプログラミング

図9は、CUDAによるプログラミングの例です。CUDAがサポートする言語の1つである"CUDA C"では、いくつかのCUDA特有のユニークな記述が必要にはなるものの、元のC言語に近い、シンプルで分かりやすいものになっています。

図9: CUDA Cによるプログラミング例(サブルーチン)

ただ、これは、あくまでもGPUが計算を行うサブルーチンの部分だけであり、CPUからこのルーチンを起動するためには、以下のような、いくつかの前設定や手続きが必要になります。

  1. GPUメモリー領域の確保
  2. DMA転送によるCPUからGPUへの元データのコピー
  3. GPUのサブルーチンを呼び出し、GPU上で計算を実行
  4. DMA転送により、計算結果をGPUからCPUに戻す

図10: CUDA Cによるプログラミング例(メインルーチン)

GPUコンピューティングでは、CPUのマルチコアを有効に並列的に使用する場合と同じようなレベルでアルゴリズムを考える必要があります。GPUの構造やCUDAの機能を理解したうえでアルゴリズムを考えることが、GPUプログラミングの前提条件になります。

GPUプログラムのコンパイル方法の一例として、Linux上でCUDA C言語を使用する場合について簡単に説明します。以下のようなプロセスを経て、自動的にコンパイルされます。

  1. "nvcc"(NVIDIA C compiler)によるGPUコードとCPUコードの分離
  2. GPUコード、CPUコードそれぞれのコンパイル
    1. GPUコードは、"nvcc"によっていったん中間言語PTX(Parallel Thread Execution)コードになり、最終的にターゲットのバイナリ・コードを生成
    2. CPUコードは、標準GCC(GNU Compiler Collection)によりコンパイル
  3. GPUとCPUそれぞれのバイナリ・コードがリンクされ最終実行ファイルを生成

図11: CUDA CコンパイラによるGPU/CPU混在コードのコンパイル

CUDAによる複合並列計算プログラミング

CUDAによるGPUコンピューティングは、CPUとGPUの共存の上に成り立つものであり、GPUがCPUを置き換えるといった類のものではありません。

かつて、コンピュータの画面出力はCPUが主役でしたが、GPUの登場によってCPUの大幅な負荷軽減と高品質リアルタイム3Dグラフィックスが実現しました。このように、CUDA GPUコンピューティングも、CPUとGPUがそれぞれの得意分野を受け持ちます。こうした連携によって、ハイ・パフォーマンスな複合並列計算環境の実現を目指しています。

NVIDIA Tesla Quadro事業部 GPUコンピューティング担当 シニア・エンジニア

外資系コンピュータ・メーカーにてPCグラフィックス・サブシステムやASICの設計開発、経営企画部門、製品開発プロジェクト・マネージャなどを経験し、2007年NVIDIA入社。現在、GPUコンピューティングの技術的なサポートを担当。
 

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています