執筆者/H.T
はじめに
こんにちは。ORENDAシステム課のH.Tです。
普段はORENDAメンバーの皆様のシステムサポートをしています。コンピュータ・アーキテクチャや、低レイヤーの分野に興味があり、趣味でいろいろさわっています。
本日は、皆様にもハードウェアの良さを知っていただくべく、満を持してやってまいりました。よろしくおねがいします。
皆様はグラフィックボードという言葉を聞いたことがあるでしょうか。
コンピュータを使ってゲームをする方、または作る方にとってはお馴染みの名前かもしれません。これは(少なくとも現代で使われている意味においては)ゲームのような高度なグラフィックをコンピュータで描画するための専用部品の名称です。他に、グラフィックカード、ビデオボード、ビデオカード、GPU等と呼ばれることもあります。
我々の業界(3DCG)において、グラフィックボードという名前は身近なものですが、この部品がどのような構造をしており、どうやって高度なグラフィック処理を行っているのかご存知でしょうか。
今回は、グラフィックボードの役割や構造について、入門編としてその起源へと遡りつつざっくりと解説させていただきます。
基本的な構造を知ることで、コンピュータグラフィックスへの理解を更に深めることができるかと思いますので、興味のある方は是非ご覧になっていってください。
※ 本稿はグラフィックボードについてできるだけわかりやすくお伝えするために、一部機能を簡略化したり、実際のロジックと異なっている表現があります。その点をご理解の上、お読みいただけますと幸いです。
この記事の内容
- キャラクタディスプレイ
- グラフィックコントローラ
- GPUの誕生
1.キャラクタディスプレイ
先にご紹介したとおり、グラフィックボードは「グラフィック」、つまり、絵や図を描画するための部品です。多くの場合、映像用の出力端子が備わっており、ケーブルを介してディスプレイと接続されています。
ディスプレイをじっくり観察すると、たくさんのピクセルの行列で構成されていることがわかります。さらに、1つのピクセルは赤・青・緑のドットでつくられています。(近年のスマートフォン等は、ドットが細かすぎて肉眼では分かり辛くなっていますが…。)
コンピュータがディスプレイに画像を表示するには、デジタル画像データを映像出力専用のメモリ領域に書き込みます。これをフレームバッファと呼びます。一秒間に数十回、フレームバッファを読み込んでディスプレイに信号を送ることで、パラパラ漫画のように映像を表示しているのです。
コンピュータにディスプレイが接続されたのは1960年頃、普及しだしたのは1970年頃のことです。当時はメモリが高価だったため、ディスプレイの1ドットずつを制御できる容量のメモリを用意することは、あまり現実的でありませんでした。そこで、ディスプレイを 8×8 ピクセル程度に区切り、その枠内にアルファベットや数種類の記号を表示するキャラクタディスプレイを利用することで、メモリの容量を節約していました。
単色の8×8ピクセルを独立に表現しようとすると 64bit × 光度の階調 分の情報量が必要ですが、予め決められた文字のみを表示するようにすれば、情報量を削減できます。例えばアルファベットは26文字しかありませんので、5bitもあれば表現可能です。
専用のコントローラがCPU(コンピュータの頭脳にあたる演算装置)から命令を受け取り、VRAMと呼ばれる映像専用メモリに文字や位置の情報を書き込みます。最終的には、予めフォントを保存しているCG-ROMの情報とVRAMの情報を合わせ、ディスプレイへ送信します。
このキャラクタディスプレイの仕組みこそ、グラフィックボードの前身と言っても良いかもしれません。
2.グラフィックコントローラ
更に時代が進みメモリの価格が安くなると、VRAMの容量にも余裕ができ、ディスプレイの1ドットずつを制御できるようになりました。そうなってくると、文字だけでなく図形や画像も描写したくなります。新しく登場したグラフィックコントローラは、簡単な図形や画像を計算、表示する機能を持っており、CPUの補助的な演算を行う部品としての地位を固めていきました。
さて、ディスプレイの1ドットずつを制御するグラフィックコントローラには、どのような演算回路が入っているのでしょうか。
速いコンピュータを設計する上で最も大切な理念の一つは「よく使う計算から高速化していく」ということです。あまり使わない行動を高速化するよりも、よく行う行動を高速化したほうが全体のパフォーマンス向上につながるということです。
このことを念頭に置きつつ、グラフィックコントローラが行っている計算について見てみましょう。
各ドットの色を決めたり、図形の二次元的な座標を求めるための計算の正体は、実はとても単純な足し算や掛け算です。ただし、単純な計算を大量に行う必要があります。
例えばフルHDのディスプレイは、1920 × 1080 ≒ 200万ものピクセルをもっており、各ピクセルは赤・青・緑の3色で構成されています。さらにこれらをパラパラ漫画のように 1/60 秒に一度のタイミングで更新しているのです。単純計算で 200万ピクセル × 3色 × 60回 ≒ 3億6千万回もの計算を、たった1秒の間に繰り返し行っていることになります。
もう一つ、グラフィックコントローラが行う計算の特徴として、「プログラム間の依存が少ない」ということが挙げられます。「依存」とは並列処理で使われる言葉で、ある命令が別の命令に依存している状態を指します。
例えば、
a. C = A + B
b. D = C + A
という2行のプログラムがあるとします。このプログラムは、先に命令 a を実行しないと変数Cの値が定まらないので、命令 b が実行できません。命令の順番を入れ替えたり、同時に実行したりするとおかしなことになってしまいます。これを、「命令 b は 命令 a (の結果)に依存している」と言います。
対して、ディスプレイの各ドットは独立しているので、依存がありません。そして依存の無い命令は、命令の順番を入れ替えたり、同時に実行したりすることができます。つまり、計算をするための回路を用意すればするほど、たくさんのドットの計算を一度に実行してしまうことができるのです。
そのため、「複雑な計算を行う巨大な回路を1つ」いれるより、「単純な計算を行う小さな回路を多数」搭載するほうが理にかなっていると言えます。
実際、現在最新のグラフィックボードの一つであるNVIDIA GeForce RTX 3090は、1万を超えるCUDAコアを内蔵しています。
3.GPUの誕生
80年代には、グラフィックコントローラに図形の描画や塗りつぶし、ラスタスクロール等の機能が実装されます。グラフィックスに関する演算をCPUから肩代わりしてくれるという意味を込めて、グラフィックアクセラレータと呼ばれ出したのもこの時代です。
90年代に入ると、高度なGUIを搭載したWindowsが爆発的に普及し、グラフィックアクセラレータに要求される性能は段々と高まっていきました。90年代は激動の時代で、様々な企業が業界へ参入しては消えていきます。
この流れの中、80年代から90年代にかけてアーケードゲーム業界で3Dポリゴン表現を使ったゲームが流行りだしました。
実は、3D描画に関しても、単純な計算を大量に行う作業がメインとなります。例えば、ゲームの3Dオブジェクトは複数の頂点を持った図形(ポリゴン)の集まりとして表現されますが、これをA地点からB地点へ移動させるためには、各頂点が持つ3次元座標(x, y, z)のすべての要素に移動分の数値を足し算する必要あります。
頂点1つに注目すると単純な作業ですが、何十万、何百万という頂点を移動させるには大量の値を操作する必要があります。
1995年、Microsoft社から、同社OSであるWindows95向けのグラフィックAPIとして、DirectXがリリースされました。DirectXは3Dグラフィックスを描画するためのパイプラインを持っていました。
その後、グラフィックアクセラレータはさらなる進化を遂げます。当初「レンダリング」のみであった機能は、「アルファブレンディング」「フォグ」「テクスチャマッピング」等、現代の3D表現に欠かせない様々な3DCG技法の実行に対応しました。そして90年代後半になると、3Dの座標変換・陰影計算(T&L)をハードウェア回路で実装した史上初の製品、GeForce 256がNVIDIA社から誕生します。GeForce 256こそ、CPUと比較してGPUと呼ばれるようになった初のグラフィックボードです。
2008年には単精度(32bit)の浮動小数点演算が可能なGeForce8000が登場しました。浮動小数点演算は、一部の科学技術計算分野に需要があり、その方面から大きな注目を集めました。GPUで計算を行うには、グラフィックAPIを利用する必要があります。グラフィックAPIは、グラフィック処理を行うために設計されているので、汎用の科学技術計算には向きません。昔は変数を頂点座標に見立て、無理やり計算を行っていたそうです。
そこでNVIDIA社は、GeForce8000に合わせて、CUDAというプログラミング環境を提供しました。CUDAはC言語をベースとしており、これによってプログラミングによってGPUへ命令を送ることができるようになったのです。グラフィックボードをグラフィック以外の用途で計算のために使う「GPGPU」は、今では当たり前に利用されています。
また、グラフィックス機能としては、それまで定型のパイプラインだったシェーダが、DirectX 8世代以降段々とプログラマブルなパイプラインに置き換えられていきました。CG業界の進化は著しく、次々と新しい技術や技法が生まれます。それらを専用のハードウェアとしてグラフィックボードに組み込むのではなく、ソフトウェア的に柔軟にカバーしていこうという流れです。
最も顕著なのはユニファイドシェーダの登場でしょう。ユニファイドシェーダ登場以前、座標変換を行うバーテックスシェーダと、ライティング処理を行うピクセルシェーダのための演算ユニットは、それぞれ専用のものがハードウェア実装されていました。新しい世代のグラフィックボードはこの垣根を取り払い、座標変換もライティングも行えるユニファイドシェーダという汎用演算ユニットを採用しました。おかげでプログラムで制御できる幅が広がり、より柔軟なシステムの開発が行えるようになります。(しかもハードウェアがより単純になります。単純なのは良いことです!)
その後もグラフィックボードは順調に進化を遂げ、見違えるほど早くなっています。最近ではハードウェアによるリアルタイムレイトレーシングに対応したり、機械学習専用コアを実装したりと、その用途を広げています。
現在では、多くの汎用CPUはGPUを統合したパッケージとなっており、グラフィックボードを別途使用せずにディスプレイへの出力が可能です。しかし、CPUのリソースは限られており、最新のゲームソフトなど、より高度なグラフィックを表示するための演算を行うにはグラフィックボードが不可欠です。
まとめ
グラフィックボードのおおまかな歴史について紹介してきましたが、いかがでしたでしょうか。
重要な点は、
- グラフィックボードはディスプレイに映像を出力するための機械であり、コンピュータグラフィックスの発展に伴い様々な機能が付け足されてきた。
- 3Dの時代になると、グラフィックスチップは高度な演算が可能となり、CPUと比較してGPUと呼ばれるようになった。
- グラフィックボードが行う計算は、単純で依存性も少ないが数が膨大であるため、単純な回路をたくさん搭載している。
といったところでしょう。
CPUと違い、GPUはまだまだ進化の余地を残していると言われています。近年は、ディープラーニング等AI技術の発展もあり、GPUが活躍できる場が広がりつつあります。
今回は、そんな今注目のグラフィックボードについて、その歴史の上澄みを紹介させていただきました。一人でも多くの方に興味を持っていただけたら幸いです。