これからの並列計算のための GPGPU 連載講座 (I)GPU と GPGPU の歴史と特徴
大島聡史
東京大学情報基盤センター

1

はじめに高い演算性能を安価に得られる新たな並列計算ハードウェアとして GPU(Graphics ProcessingUnit) への注目が集まっている。GPU を用いた計算は「GPGPU(General-Purpose computing onGPUs)」や「GPU コ ン ピ ュ ー テ ィ ン グ 」と 呼 ば れ 、国 内 外 に お い て 様 々 な 研 究 が 行 わ れ て いる。今日では動画像処理ソフトウェアなどのソフトウェアパッケージにおいても GPGPU が活用され始めている。GPU は、一般の小売店 (家電量販店、PC パーツショップ等) で安価に購入で き る 製 品 が 多 く 存 在 す る こ と や 、既 存 の デ ス ク ト ッ プ 型 PC に 容 易 に 搭 載 で き る こ と か ら 、
自作 PC 市場を中心に利用が広がってきた。カスタマイズされた GPU を搭載したゲーム機の普及も進んでいる。今日ではノート PC を含む大手メーカー製 PC にも GPU を搭載したモデルが普及している。スーパーコンピューターにおける GPU の利用も始まっている。2008 年には東京工業大学が所有するスーパーコンピューター「TSUBAME」が NVIDIA の GPU(Tesla S1070)を追加搭載して TOP500 の 29 位となり [1] 注目を集めた。さらに 2009 年には中国の国防科学技術大学が所有するスーパーコンピューター「天河一号」が AMD の GPU(RadeonHD4870X2) を搭載して TOP500 の 5 位となり [2] 注目を集めている。
現 在 、東 京 大 学 情 報 基 盤 セ ン タ ー (以 下 、本 セ ン タ ー) が 所 有・提 供 し て い る ス ー パ ー コ ン
ピューターに GPGPU のための GPU を搭載したものは存在しない。しかしながら、GPU はスー
パーコ ンピュー ター使用者の多くが関わ る科学 技術 計算の分 野において 多く使わ れているため、また高性能コンピューティング (HPC) の分野における GPGPU の影響は年々大きくなっているため、本センターのユーザーに GPU の情報を提供することは重要であると考えられる。
さらに、GPGPU の正しい姿を伝えることも本連載の重要な目的である。今日では GPGPUの成果が強調されるあまり「どんなプログラムでも CPU の代わりに GPU を用いて実行すれば性能が上がるのではないか」「（既存のスーパーコンピューターを使わずに）全てのプログラム
を GPU を用いて実行すれば良いのではないか」という意見が散見される。しかしながら、これは誤りである。CPU と GPU にはそれぞれ得意不得意があり、最大の性能を得るには適切に使用する必要がある。現実的には世の中の (スーパーコンピューター上で実行されている) 全てのプログラムが、GPU によって CPU よりも高速に実行可能なわけではない。本連載では、GPUと GPGPU についての解説を行い、強力ではあるが万能ではない GPU の正しい姿を伝える。
本連載は今回を含めて 5 回で以下のような内容である：• 第 1 回 : GPU と GPGPU の歴史と特徴• 第 2 回、第 3 回 : GPU プログラミング環境 CUDA の基礎、CUDA を用いたプログラムの最適化• 第 4 回、第 5 回 : GPU に関する研究について1

第 1 回の今回は、GPU と GPGPU がどのように発展を遂げてきたのかや、GPU と CPU の特徴
および違いについて紹介する。

2

GPU の基礎と発展の歴史
2007 年 に NVIDIA 社 に よ っ て GPGPU 開 発 環 境 CUDA[3] が 一 般 公 開 さ れ る と 、そ れ ま で に

GPGPU を利用していたか否かに関わらず多くのユーザーが CUDA に興味を示し、GPGPU の研 究 が 広 く 注 目 を 集 め る こ と と な っ た 。こ こ で は CUDA が 一 般 公 開 さ れ る ま で の 、言 わ ば 初
期の GPGPU の時期における GPU の発展に注目し、GPU とはどのようなハードウェアなのか、何故高性能な並列計算ハードウェアとして注目されるようになったのかについて解説する。

GPU は Graphics Processing Unit の 名 が 示 す よ う に 画 像 処 理 の た め の ハ ー ド ウ ェ ア で あ り 、
具体的には画像処理用の LSI チップのことを指す。ただし、この LSI チップは CPU のようにチップ単体で店頭および消費者の手元に供給されることはなく、ビデオカード (グラフィックスカー
ド) の形をとる。そのうえ、ビデオカードにはビデオメモリと呼ばれる交換不可能な DRAM が搭載されており、GPU の性能に大きな影響を与えている。そのため、LSI チップ単体とビデオ
カードを区別せずに GPU と呼ぶことが多い。マザーボード上にオンボードグラフィックスチッ
プとして搭載される GPU 製品も非常に多く、さらに現在ではノート PC にも GPU が搭載されているため、GPU という独立した製品以外の形で販売されている GPU も多い。過去には 2D グラ
フィックス向けのビデオカードや 3D グラフィックス専用のビデオカードも多く存在していたが、現在の GPU は 2D グラフィックスと 3D グラフィックスを兼ねているのが普通である。

GPU の本来の主な役割は 、グ ラフィックス表 示 のため の様々 な処 理を行 い、処理の 結果 を
ディスプレイに表示することである。PC 上で 3D グラフィックスが使われるようになった当時
は、CPU が 3D 描画のための演算を行い、ビデオカードが結果を表示するという役割分担が行われていた。しかし 1999 年に Microsoft 社がリリースしたライブラリ DirectX 7.0 においてハードウェアによるポリゴンの座標変換およびライティング処理 (Transform&Lighting) がサポートされたのを機に、3D グラフィックス処理の多くの部分が GPU(ビデオカード) へと移って行った。現在では GPU がグラフィックス処理を担っており、CPU の仕事は描画内容の生成や生成したデータを GPU へ送ること、そして GPU の動作を制御することである (図 1)。

GPU を用いた 3D グラフィックス描画処理の基本的な流れを図 2 に示す。GPU によって 3D グ
ラフィックスが描画される際には、大きく分けて以下の 5 つの手順が必要である:

1. CPU から GPU へ描画情報 (頂点やピクセルに関する情報) が送られる
2. 座標変換が行われ、頂点やポリゴンの画面上での位置の決定や、頂点単位での照明計算などが行われる：頂点処理

3. 頂点やポリゴンと画面上のピクセルとの対応付けが行われる
4. テクスチャの参照やピクセル単位での照明計算などが行われ、画面上の各ピクセルの色が決まる：ピクセル処理

5. ピクセルの色情報がフレームバッファに書き込まれ、画面へと出力される
これらの処理はパイプライン処理されるため、グラフィックスパイプラインもしくはレンダリ
ングパイプラインと呼ばれる。3D グラフィックス処理におけるパイプライン内の処理は対象
プログラムによって異なる。例えば陰影の生成を行う処理だけ見ても、光源の種類や、投影先2

図 1 CPU と GPU の役割分担

図2

グラフィックス処理の基本的な流れ

3

の材質、陰影の元となる物体の形状をどれだけ細かく反映させるかなど、生成される陰影に影響を与えるパラメタは多岐に渡る。そのため陰影の生成方法は表現したい内容やハードウェアの性能によって様々な手法が用いられている。
描 画 処 理 技 術 が 発 展 す る に し た が い 様 々 な 描 画 手 法 が 提 案 さ れ る と 、提 案 さ れ た 描 画 手 法にあわせて GPU へのハードウェア実装が行われた。3D グラフィックスが使われ始めた当時のGPU に お い て は 、グ ラ フ ィ ッ ク ス パ イ プ ラ イ ン の 動 作 制 御 は グ ラ フ ィ ッ ク ス API(DirectX やOpenGL) を 介 し た 機 能 の ON/OFF お よ び い く つ か の 単 純 な パ ラ メ タ に よ っ て な さ れ て い た 。
しかし様々な描画技法が開発されるようになると、以下のような問題が生じるようになった：• 新たな描画手法を利用したいユーザー (ここでのユーザーにはプログラム作成者も含まれる) は最新の GPU を購入しなくてはならない。逆に、新たな描画手法を開発しても対象手法が GPU へ実装され製品としてリリースされるまで利用してもらえない。

• 最新の描 画手 法に 対応した GPU を持 つユー ザーとそ うでない ユーザー が存 在するこ とにより各ユーザーが持つ GPU の機能にばらつきが生じる。そのため、最新の描画手法を用いたプログラムをリリースしてもユーザーに利用してもらえない可能性が上昇する。

• GPU の回路規模が、対応する描画手法が増えるにしたがって大きくなる。しかし全ての手法を常に使うわけではないため、使用していない回路が増加し GPU の利用効率が低下する。
そ こ で 、グ ラ フ ィ ッ ク ス パ イ プ ラ イ ン を ソ フ ト ウ ェ ア レ ベ ル で 変 更 で き る GPU、す な わ ち
頂点処理とピクセル処理をユーザーが書き換えられる GPU が登場した。頂点処理に対応するプログラムは頂点シェーダ（VertexShader）、ピクセル処理に対応するプログラムはピクセル
シェーダ（PixelShader）もしくはフラグメントシェーダ（FragmentShader）と呼ばれ、それぞれ専用のシェーダユニットが処理を担当した。これらの機構はプログラマブルシェーダと呼ばれ、DirectX と OpenGL の 2 大グラフィックス API および多くの GPU 製品が対応したために広く
普 及 す る こ と と な っ た 。な お 、プ ロ グ ラ マ ブ ル シ ェ ー ダ に 対 し て 既 存 の シ ェ ー ダ は 固 定 機 能
シェーダと呼ばれる。
初期のプログラマブルシェーダはプログラミングの制限が厳しく、複雑なアルゴリズムを実装するのは困難であった。例えば、• 対応している命令の種類が少ない• 1 プログラム中に記述可能な命令数の制限が厳しい• 分岐を含むプログラムが記述できない• 扱えるデータ型の制限が厳しいなどの制限が存在した。しかしながら、より高度なシェーダへの要求が高まるにつれて、GPUの世代が進むたびに制限の緩和が進み、様々な描画手法が GPU 上で実現されることとなった。

GPU 内部で行われる処理をユーザーが自由に記述できるようになったことは、のちに GPU がGPGPU として汎用演算に使われるようになる上で重要である。
ところで、3D グラフィックス処理における頂点処理やピクセル処理は高い並列性を持った処理である (図 3)。頂点処理においては、多数のオブジェクトの座標変換をする場合でもオブ
ジェクト同士は互いに影響し合わない計算が多いため、オブジェクト単位で並列に座標変換処4

理を行うことができる。またピクセル処理においても、ピクセル単位で並列にピクセル処理を行えることが多い。そのため、GPU は内部の演算器 (シェーダユニット) の数を増やすこと、すなわちハードウェアレベルでの並列性を向上させることによって性能を大きく向上させた。

図3

グラフィックス処理における並列性

たとえば 2004 年に発表・発売された GPU GeForce6800 は自由度の高いシェーダユニットを並列に搭載 (最大 6 個の頂点シェーダユニットと最大 16 個のピクセルシェーダユニットを搭載、ユニット数を減らしたモデルがいくつか存在) することで高い性能を達成し、さらに従来より自由度の高いシェーダプログラムや精度の高い計算を扱えるようになったため、大いに注目を集めた。GPU がグラフィックス処理の高速化のために演算器の並列度を向上させたことは、の
ちに GPU が並列処理に強い計算ハードウェアとして注目される上で重要である。
ある程度のアルゴリズムが実装可能な演算の自由度や高いハードウェアの並列度といったGPU の特徴は、複雑で演算量の多い高度な画像処理に対応するためにもたらされたものであったものの、GPU が様々なアルゴリズムを実装できるだけのプログラマビリティと高い並列性を持ったことは、のちに GPGPU が大きく注目されることにつながったと言える。

2006 年以降、プログラマブルシェーダのユニファイドシェーダ化が進んだ。これは、従来のGPU では頂点処理とピクセル処理がそれぞれ専用の演算ユニットによって行われていたのに対して、共通のシェーダユニット (ユニファイドシェーダユニット) によって行われるものである。従来のシェーダユニット構成においては、頂点処理とピクセル処理の最適なバランスが対象となるプログラム (描画手法) によって違うために最適なユニット数を決めることが難しいと5いう問題が知られていた。例えば、頂点座標の変換や頂点色の計算には独創的で複雑な処理をし た い 一 方 で ピ ク セ ル 処 理 は 比 較 的 単 純 な プ ロ グ ラ ム で は 、頂 点 シ ェ ー ダ の 演 算 量 が 多 く なる。逆に頂点処理はシンプルだが複雑なピクセル単位の演算をしたいプログラムでは、ピクセ
ルシェーダの演算量が多くなる。これらのようなプログラムでは、いずれか一方のシェーダユ
ニットばかりに大きな負荷がかかり、もう一方のシェーダユニットにはほとんど負荷がかからない可能性がある (図 4-a)。しかし、GPU を作る (購入する) 時点ではどちらの処理ユニットに大きな負荷がかかるかは予測が困難なため、バランスの取れた GPU を作る (購入する) のは難しく、頂点シェーダユニットとピクセルシェーダユニットへの負荷の不均衡を避けることも難しい。
そこで、両方のシェーダユニットの役割を兼ね備えたユニファイドシェーダユニットが使われるようになった。ユニファイドシェーダユニットは単一のシェーダユニットが頂点処理とピクセル処理のどちらでも行うことが可能であり、状況に応じて頂点シェーダユニットもしくは
ピクセルシェーダユニットとして動作する。頂点処理を重視する描画処理では多くのシェーダ
ユ ニ ッ ト が 頂 点 シ ェ ー ダ ユ ニ ッ ト と し て 、ま た ピ ク セ ル 処 理 を 重 視 す る 描 画 処 理 で は 多 く のシェーダユニットがピクセルシェーダユニットとして働くことで、対象処理の内容に関わらず常にシェーダユニットの使用率を高くすることができる (図 4-b)。GPGPU においてはピクセル
シェーダの需要が大きい傾向があったため、GPU 上の多くのユニファイドシェーダユニット
がピクセルシェーダユニットとして動作をすることで高い性能が得られることになる。
そ の 後 2007 年 に か け て 、さ ら に 自 由 で 高 度 な 表 現 を 容 易 に 行 う た め に 、頂 点 シ ェ ー ダ と ピ
ク セ ル シ ェ ー ダ に 続 く 第 3 の シ ェ ー ダ で あ る ジ オ メ ト リ シ ェ ー ダ が 導 入 さ れ た 。ジ オ メ ト リ
シェーダは頂点シェーダが処理した頂点をさらに変化させるものであり、ポリゴンモデルの頂点を増減させるなどの処理が行えるようになった。
ちなみに、現在市販されている主な GPU 製品は以下の通りである:• NVIDIA 社の GeForce シリーズ、Quadro シリーズ、Tesla シリーズ
• AMD 社の Radeon シリーズ、FirePro シリーズ、FireStream シリーズ
• Intel 社の統合グラフィックスチップ
ただし、Intel 社の製品はビデオカードとして市販されておらず、マザーボード上に備え付けられたオンボードグラフィックスチップとしてのみ流通している。

3

初期の GPGPU
現在 GPGPU プログラミングに用いられるプログラミング環境としては CUDA が台頭しているが、CUDA が登場する以前の初期の GPGPU においてはグラフィックスプログラミングの手法が多く用いられていた。現在ではグラフィックスプログラミングの手法を用いて GPGPU を行うユーザは (高度なグラフィックス表現に GPGPU を利用するユーザを除いて) 少なくなっている。本章では GPGPU がどのように発展してきたのかを概観するために、初期の GPGPU では ど の よ う に グ ラ フ ィ ッ ク ス プ ロ グ ラ ミ ン グ を 用 い て 汎 用 演 算 を 行 っ て い た の か 、そ の ア イ
ディアと実装について紹介する。

GPU は高度なグラフィックス表現のために、プログラムの書き換え (プログラマブルシェーダ) により様々な処理が可能となり、演算器 (シェーダユニット) を並列化することで並列演算性能を向上させてきた。特に高度な陰影処理や照明処理には従来の画像処理と異なり汎用的な演6

図4

シェーダユニットの構成

算が含まれるようになった。さらに、従来の GPU では描画結果はフレームバッファに書き込
まれてディスプレイに表示されるものだったのに対して、GPU 上のメモリ (テクスチャ) に書き込んで再利用 (次のフレームを描画する際に参照) する使い方も可能となった。
ここで、2 枚のテクスチャ (入力テクスチャ) を参照し、それぞれの色 (RGBA 値*1 ) を足し合わせて別のテクスチャ (出力テクスチャ) に書き込む (テクスチャに対して描画する) という描画処理を考えてみることにする。これはグラフィックス処理の観点で見ればテクスチャのブレンドと呼ばれる非常に一般的な処理である。一方でこれを別の観点から見ると、2 つの入力配列のデータを入力テクスチャという形式で GPU に入力し、入力配列のデータを加算した新たな 1 つの出力配列を出力テクスチャという形で格納したとみなすことができる。入力テクスチャに配*1 Red,Green,Blue,Alpha の 4 値。RGB は光の三原色を、Alpha は透明度を意味する。

7

置するデータを CPU が生成し、出力テクスチャに格納されたデータを CPU が取得すれば、これは配列の加算という汎用的な演算と同じであると見なすことができる。(図 5)

図5

配列の加算

以 上 の よ う に 、CPU か ら GPU 上 の テ ク ス チ ャ へ の デ ー タ 配 置 を 入 力 、GPU 上 で の (テ ク ス
チャに対する) 描画処理を演算、GPU の描画結果 (テクスチャのデータ) を CPU へ書き戻す処理を出力とみなすことで、GPU による汎用演算が可能であることがわかった。特に、• GPU が本来行ってきたグラフィックス処理の並列性が高いため、GPU はハードウェア
レベルでの高い並列性を備えている• グ ラ フ ィ ッ ク ス 処 理 に は XYZW(座 標 計 算) お よ び ARGB(色 計 算) の 4 要 素 ベ ク ト ル 演 算が多用されるため、GPU はベクトル計算に強いという特徴があることから、GPU を用いることで対象問題によっては CPU を圧倒する性能が得られるのではないかと期待されるようになった。
なお、ここで例に挙げた描画処理はプログラマブルシェーダが必須な処理ではない。テクス
チャのブレンド自体はプログラマブルシェーダが登場する前から使われている技術である。テクスチャへの描画やテクスチャに格納されたデータの取得も、プログラマブルシェーダとは直接関係なく発展したグラフィックスプログラミングの技術である。
こ の よ う な 初 期 の GPGPU に お け る プ ロ グ ラ ミ ン グ 環 境 と し て は 、グ ラ フ ィ ッ ク ス API とシェーダ言語が使用された。グラフィックス API は画像処理を記述するための API であり、具体的には Microsoft の DirectX(Windows 専用) と The Khronos Group の OpenGL(マルチプラット
フォーム対応) が多く用いられた。GPU を用いたグラフィックスプログラミングにおけるグラ
フィックス API は、CPU が GPU にアクセスするためのインターフェースであり、頂点やポリ

8ゴンの設定、描画機能の選択、その他 GPU の制御などを担当する。一方シェーダ言語は GPUの動作を記述するための言語であり、DirectX 用の HLSL[4]、OpenGL 用の GLSL[5] が用いられた。DirectX と OpenGL 両方で利用可能な Cg[6] も一部では利用された。いずれのシェーダ言語も C 言語を拡張した高級言語であり、高級言語が使われる前には GPU 向けのアセンブラも使われていた。
しかし、グラフィックスプログラミング (グラフィックス API とシェーダ言語を用いたプログ
ラミング) を用い た GPGPU はユーザーにと って使 いや すい ものでは なかった。グラフィ ッ ク
スプログラミングは画像処理のために作られた仕組みである。そのため、描画処理とその他の処理とを組み合わせるような GPGPU プログラミングには適していたが、描画処理とは関係のない汎用処理を実装する際には描画処理と対象処理とが容易に対応づけられるとは限らなかった。さらに、グラフィックスプログラミングそのものの難しさも利用の妨げとなった。例えば数値計算を行っているユーザーが GPGPU に挑戦しようと思った場合には、専門外であるグラ
フィックスプログラミングの勉強をしたうえで、自分のプログラムと GPU との対応付け、たとえば数値データをどのようにテクスチャへ配置するかや限られた言語仕様の中でアルゴリズム
をどのように記述すれば良いのかについて検討し、実装する必要があった。さらに、GPU ベン
ダーが GPU の内部構造や詳細なアーキテクチャを公開していなかったことが最適化の妨げとなった。ユーザーは描画処理と対象問題との対応付けの工夫によって最適化を行ったが、グラフィックス API とシェーダ言語によって隠蔽された情報のみを用いて GPU の性能を最大限に引き出すことは容易ではなかった。こうした利用の難しさや手間が GPGPU が普及する上での課題となっていた。
こうした状況を踏まえて、GPGPU 専用の言語やライブラリに関する研究等も行われた。これに つ いて は次 章に て概 要を 紹介 し、さ ら に 、CUDA につい て は 本連 載の 第 2 回お よ び第 3 回で、その他のプログラミング環境については第 4 回および第 5 回において詳しく紹介する。
本章の最後に、グラフィックスプログラミングを用いた行列積の実装例を 2 つ簡単に紹介する。1 つ目はプログラマブルシェーダを用いずにグラフィックス API のみで行う行列積であり、2 つ目はプログラマブルシェーダ (実際に使うのはピクセルシェーダ) を用いた行列積である。
1 つ目の実装 例の 概要 を 図 6 に示す 。本 手法 は Larsen らに よっ て 2001 年に 実装さ れた ものである [7]。本手法の特徴は、加算ブレンド描画や乗算ブレンド描画を活用している点である。プ
ログラマブルシェーダが用いられる以前からテクスチャの色情報を加算したり乗算したりすることは可能だった。そこで、テクスチャ参照座標を調整した乗算描画を繰り返し行うことで行列積を実現した。図 6 には、大きさ 4×4 の正方行列に対する行列積の一部を示している。i 回目の描画では、各ピクセルにおいて行列 (テクスチャ)A の i 列目と行列 (テクスチャ)B の i 行目に該当するテクスチャ座標の色を参照し取得して乗算ブレンド描画する。この描画を 4 回繰り返し、各回の結果を加算ブレンド描画すると、行列積を行ったのと同等の結果が得られる。

2 つ目の実装例の概要を図 7 に示す。本手法はテクスチャを入出力の配列として、プログラマ
ブルシェーダ (ピクセルシェーダ) を計算内容として使用している。ピクセルシェーダでは、各ピクセルにどのような値を書き込めば (出力すれば) 良いかを記述する。スレッドプログラムに対応づけて例えるのであれば、描画されるピクセルの数すなわち行列の要素数分だけスレッドを生成し、各スレッドの動作をシェーダプログラムで指定しているのに近い。図の擬似コード
では posX,posY 関数を用いてピクセルの座標を取得しているが、これはスレッドプログラミン

9図6

グラフィックス API を用いた行列積

10

図7

プログラマブルシェーダ (ピクセルシェーダ) を用いた行列積

グにおけるスレッド ID の取得に相当する。ID を元に参照すべきデータのインデックス、すな
わちテクスチャ座標を計算して入力データを取得し、乗算と加算を行って行列積の結果を求めている。実際にグラフィックスプログラミングを行う場合にはプログラマブルシェーダを利用するための準備など手間がかかるコーディングが必要であるが、行列積のアルゴリズム自体は簡潔に記述することが可能である。プログラマブルシェーダを用いた行列積の研究は多数行われており、ブロック化やベクトル型の使用などの高速化手法が提案・実装された [8, 9]。

4

現在の GPU と GPGPUGPU の性能は CPU を超える勢いで向上し続けている。特に、グラフィックス性能の向上が行われ続けているのみならず、GPGPU を意識した性能向上も行われている。これは GPU ベン
ダーが GPGPU を一過性の流行以上の重要なものであると認識していることのあらわれであると考えられる。例えば、従来の GPU はポリゴンの描画速度や新たなグラフィックス機能を前面に出した製品開発や広告活動を行っていた。これにたいして、今日の GPU は理論浮動小数
点演算性能や GPGPU としての利用の成果も前面に出している。さらに HPC 分野からの要求に応えて、グラフィックス目的では不要と言われている倍精度浮動小数点演算性能の強化や ECC
メモリの搭載なども行われつつある。GPGPU 専用の、ディスプレイ出力を持たない GPU まで
もがリリースされている。

GPU ベンダーによる GPGPU プログラミング環境への注目も大きくなっている。NVIDIA は

11

表1

性能比較表

ベンダー

Intel

AMD

AMD

NVIDIA

型番

XeonX5570

Opteron8435

FireStream9270

TeslaC1060

計算コア数

4

6

800

240

コアクロック周波数

2.93GHz

2.6GHz

750MHz1.3GHz

メモリ帯域幅

25.6GB/sec

12.8GB/sec

108.0GB/sec

102GB/sec

対応するメモリの種類

DDR3

DDR2

GDDR5

GDDR3

最大メモリ容量

72GB

32GB

2GB

4GB

最高メモリクロック

1333MHz

800MHz

850MHz800MHz理論演算性能 (Float)

46.88GFlops

62.4GFlops

1.2TFlops

933GFlops

理論演算性能 (Double)

46.88GFlops

62.4GFlops

240GFlops

78GFlops

最大消費電力

85W

75W

220W

187.8W

電力あたり演算性能 †0.55GFlops/W

0.83GFlops/W

5.45GFlops/W

4.97GFlops/W† 最大消費電力 1W あたりの理論演算性能 (Float)
2007 年に GPU 向けの開発環境 CUDA(Cuda Uniﬁed Device Architecture、開発環境だけではな
くアーキテクチャの名前でもある) を、AMD も 2008 年に ATI Stream SDK(AMD Stream SDK)と Brook+ からなる開発環境の一般公開を開始した。特に CUDA は既存の C 言語により近い記述ができること、公式に提供するドキュメントやサンプルが充実していたこと、各種イベント
等でのアピールが効果的だったことなどが功を奏してか、2009 年までには多くの CUDA ユーザ
および CUDA に関する研究の事例を獲得するに至っている。
第 1 回の最後として、CPU と GPU との違いについて簡単にまとめる。最近の GPU のアーキ
テクチャについては次回以降にプログラミング環境と一緒に紹介することとし、今回はいくつかの性能指標についてのみ言及する。
表 1 は CPU と GPU の主な性能数値を並べて表にしたものである。CPU としてサーバ用の Intel

XeonX5570 および AMD Opteron8435、GPU として HPC 向けの NVIDIA TeslaC1060 および AMD
FireStream9270 を挙げている。CPU と GPU のアーキテクチャが異なるのみならず GPU 同士のアーキテクチャも大きく異なるものの、CPU と GPU の違いが明確に示されている項目がいく
つか見受けられる。
ま ず 、計 算 コ ア の 数 が 大 き く 異 な る こ と が わ か る 。CPU の コ ア 数 が た か だ か 6(Xeon のHyperThreading を含めても 8) であるのに対して、GPU は 800 コアないし 240 コアという極めて多 数 の コ ア を 搭 載 し て い る 。一 方 で コ ア ク ロ ッ ク 周 波 数 を 比 較 し て み る と 、CPU は 2GHz 以
上 の 高 い 周 波 数 で あ る の に た い し て 、GPU は た か だ か 1GHz 程 度 の 低 い 周 波 数 で あ る 。し か
し、CPU の計算コアと GPU の計算コアが同程度の機能・性能を備えているわけではない。また GPU の計算コアは全てのコアが互いに異なる演算を同時に行えるようには作られておらず、SIMD のようにいくつかのコアが同じ計算を行うことが前提となっている。現在の CPU はチッ
プ面積の多くをキャッシュや分岐予測など計算以外の仕事を行う部分が占めている。一方 GPU
はチップ面積の多くを多数のシンプルな計算コアが占めている。そのため GPU は、シンプル

12だが高並列な問題では著しく高い性能が得られる一方で、分岐の多いプログラムや並列度が低い問題では高い性能が得られない。このような計算コアの傾向の違いは、GPU 本来の用途であるグラフィックスの処理において GPU に求められてきたのは CPU のようなキャッシュや分岐予測などの機能の強化ではなく、多数の頂点やピクセルに対して次々に処理を行える高い並
列演算性能であったことによるものである。
続いてメモリの性能について比較する。GPU はグラフィックス用に開発された高速なメモ
リ GDDR SDRAM を搭載している一方で、搭載可能な最大容量は CPU と比べて小さいことがわかる。そのため大規模な問題を解こうとする場合には、CPU 側で対象問題を 1GPU 上のメモ
リに乗る大きさに分割して実行する必要がある。
さらに最大消費電力を見てみると、GPU は CPU と比べて多くの電力を消費する可能性がある こ と が わ か る 。し か し 演 算 性 能 に 大 き な 差 が あ る た め 、電 力 あ た り 演 算 性 能 を 比 較 す る とCPU よりも GPU の方が優れている。
以上をまとめると、単純で並列性が高く GPU 上のメモリに収まるサイズに分割可能な問題
は GPU で解き、そうでない問題は CPU で解くことで、高い性能および電力あたり演算性能が期待できるということがわかる。
しかし、GPU による演算には CPU との通信が必要である。GPU はあくまで演算ユニットであり、GPU 単体ではユーザーからの入力を受けとることや結果をディスプレイ以外へと出力することができない。そのため GPU を利用する際には、CPU から GPU へデータを送信し、演算結果を GPU から CPU へ書き戻す必要がある。CPU-GPU 間の通信には一般的に PCI-Express
バスが使わ れる。PCI-Express は Gen2 x16 で双 方向合計 16GB/s とい う高い転送 性 能を持つ ものの、GPU 上の DRAM と GPU コア間の通信性能と比較すると低速であり、CPU-GPU 間の送受信が多いプログラムを実行する場合には GPU の演算を妨げ性能低下を引き起こす可能性が高い。また、対象プログラムに単純な並列処理によって高性能が得られる部分以外の部分が含まれる場合には、並列度が低くて性能が得られないことを理解した上で GPU に演算を行わせるか、CPU-GPU 間の通信がオーバーヘッドになることを理解した上で CPU に演算を行わせる必要がある。さらに CPU が GPU を制御すること自体も多少のオーバーヘッドになる。以上のことから、プログラムの全てが単純に並列処理できる場合を除いては、単純に GPU を用いて並列高速化が行えるとは限らない。一方で、CPU と GPU はそれぞれが同時に別々の演算を行うことが可能なため、CPU と GPU による並列演算によって性能向上可能な場合もありえる。
さらに、CPU と同様に複数の GPU を用いた計算機環境を構築することができる。複数の CPU
を 用 い る 方 法 と し て は 、1 台 の 計 算 機 に 複 数 の CPU を 搭 載 す る マ ル チ ソ ケ ッ ト と 、複 数 台 の計算機を用いるマルチノード、そして両方を組み合わせた方法が考えられる。一方で GPU を
複 数 用 い る 方 法 も 、1 台 の 計 算 機 に 複 数 の GPU を 搭 載 す る 方 法 と 、GPU を 搭 載 し た 計 算 機 を複数用いる 方法 、そ して 両方を 組み合わ せた方 法が 使用可能 である。し か しながら 、GPU は

PCI-Express などのバスで CPU やメインメモリと接続されるハードウェアであり、同一計算機上の GPU 同士が直接通信することや、異なる計算機上の GPU 同士が直接通信することはできない。(NVIDIA の SLI や AMD の CrossFire といった複数の GPU を利用する技術には同一計算機上の GPU 同士を接続するケーブルが存在するが、ドライバレベルの制御によって複数 GPU により描画を高速化するためのものであり、ユーザーが細かく制御することはできない。) さらに、複数の GPU を搭載した計算機環境を構築する場合は、GPU 上のメモリを管理するために十13分大容量のメインメモリを搭載する必要もある。このように、複数の GPU を利用すると CPUやメインメモリに負担がかかるため、台数効果を得るのは難しい。今日では複数の GPU を搭載可能なチップセットやマザーボードの流通が増えてはいるものの、複数の GPU を活用して高い性能を得るための知識や技術はまだ普及しているとは言い難い。
以上、第一回の今回は GPU と GPGPU がどのように発展を遂げてきたのかや、GPU と CPUの特徴および違いについて紹介した。次号では、現在広く利用されている GPGPU 環境 CUDA
について、概要やプログラミング方法を解説する。

(次号に続く)参考文献[1] 東 京 工 業 大 学 学 術 国 際 情 報 セ ン タ ー. 東 京 工 業 大 学 が 世 界 初 の 大 規 模 GPGPU コ ン
ピューティング基盤を大規模スーパコンピュータ基盤 TSUBAME 上に実現. プレスリリー
ス, http://www.gsic.titech.ac.jp/contents/news.html.ja?page=News/2008/1119/01, Novem-

ber 2008.
[2] TOP500 Supercomputing Sites. Tianhe-1, November 2009.
[3] NVIDIA. CUDA Zone – The resource for CUDA developers,
http://www.nvidia.com/object/cuda home.html.
[4] Microsoft. DirectX デベロッパーセンター,
http://msdn.microsoft.com/ja-jp/directx/default.aspx.
[5] The Khronos Group. OpenGL - The Industry Standard for High Perfoemance Graphics,
http://www.opengl.org/.
[6] NVIDIA. Cg Toolkit - GPU Shader Authoring Language,
http://developer.nvidia.com/object/cg toolkit.html.
[7] E.Scott Larsen and David McAllister. Fast matrix multiplies using graphics hardware. In
Proceedings of the 2001 ACM/IEEE conference on Supercomputing, page CDROM, 2001.
[8] K.Fatahalian, J.Sugerman, and P.Hanrahan. Understanding the Eﬃciency of GPU Algorithms for Matrix-Matrix Multiplication. In Graphics Hardware 2004, pages 133–137, 2004.
[9] Jesse D. Hall, Nathan A. Carr, and John C. Hart. Cache and Bandwidth Aware Matrix Multiplication on the GPU. Technical report, University of Illinois Dept. of Computer Science,
2003.

14