ヘルニアクソ野郎エンジニアblog

~ヘルニアでHell near~

【GPUの技術】CPUにとって高負荷となる映像処理を肩代わりする目的で作られた「GPUの特徴や技術について」

calendar

2000年代の通常のPCでは、2チップ構成のマザーボードの「ノースブリッジ」側を担うチップに「GPU機能」が内蔵されていました。オンボードグラフィックってやつですね。

現在では、「ノースブリッジ」が担っていた「メモリコントローラ」と「グラフィック」の機能はCPUに統合されています。

しかし、このCPU内蔵グラフィックスで性能が足りない場合は、「グラフィックボード」(GPU)を追加する事になります。

2000年代以降は「3Dゲーム」の普及と発展に伴って、「3次元(3D)グラフィックス」の描画が「GPU」の活躍の場となっています。

その他「地デジ」や「HD映像」の発展によって、動画コーデックのデコード、エンコードや映像のインターレース解除など、ビデオ系の処理も「GPU」のパワーが本領を発揮する領域となっています。

今回はそんな「GPU」に焦点を当てて、特徴や技術についてまとめようと思います。

 

スポンサーリンク

GPUの特徴

GPUとCPUの違い

GPUは、本来CPUが行ってもいい演算を「肩代わり」する処理装置です。

この点において、USB接続やLAN接続などの信号処理を行う「コントローラーチップ」とは一線を画す存在です。

CPUに従属する存在ではありますが、その処理能力においては、特定の領域でCPUをはるかにしのぐ性能を発揮します。

CPUは多種多様な命令を実行する必要があるため、命令の処理速度は速い代わりに、同時に処理できるのはマルチスレッドが可能として「コア数の2倍」程度に留まります。

例えば、標準的なクアッドコアのCPUならば、およそ1クロックごとに8つの命令を処理できます。

一方のGPUでは、処理すべき命令が限られており、また特定処理の結果を待たずに(命令の分岐処理なしに)大量のデータを処理できます。

そのため、単純処理を実行するコアを1000個以上搭載して、コア数ぶんの命令を同時に処理する事が可能です。

例えば、NVIDIAのGeForce GTX 1080 では、2560基のCUDAコアを用いて、1クロックごとに「2560」の命令を処理できます。

CPUのクロックがおよそ1000~3000Mhz、GPUのクロックが500~1500Mhzと約半分の関係にあったとしても、特定の演算に限れば、GPUはCPUの100倍以上のスピードで処理する事が可能です。

よく乗り物に例えて言われているのが、命令の種類を「目的地」とし、データを「乗る人」、と考えれば、多様な目的地に小単位の人を運ぶのが得意なのが「タクシー」であり、これがCPUに該当します。

反対に、「バス」は、あらかじめ決められた目的地に大人数を運ぶのが得意なので、これがGPUになります。

 

GPUの構造

メーカーによる名称やアーキテクチャの違いはありますが、いずれにせよGPUでは多数の演算コアを複数階層でまとめる構造になっています。

ここではNVIDIAの「Pascal」アーキテクチャを採用した「Geforce GTX 1080」を例にとって、説明します。

GigaThreadエンジン

構造の頂点となるのが「PCI Express3.0」バスから命令を受け取って、4つの「GPC」(Graphics Processsing Cluster)に分配する「GigaThreadエンジン」です。

「GPC」(Graphics Processsing Cluster)

「GPC」は5つの「SM」と1つの「ラスタライザ」(頂点と法線データから2次元のピクセルを生成する処理装置)を備えており、最終的な映像出力ができます。

したがってGPCは単体で独立したGPUとして機能する事が可能なユニットであり、CPUの場合の「コア」に該当します。

SM(Streaming Multiprocesser)

SMはラスタライザ以外のGPU要素を全て備えたユニットです。したがって、最終処理にあるラスタライジング以外のGPU演算を、SM単体で実行することが可能です。

また、ラスタライザを必要としない「GPGPU」や「CUDA」においては、SMごとに並列化した演算処理が可能です。

つまり、Geforce GTX 1080であれば、20基のSMによるGPU演算の並列処理が可能になります。

1基のSMには「128基」の「CUDAコア」と、SM内部で共有するL1キャッシュやシェアードメモリ、命令キャッシュと命令スケジューラが搭載されています。

CUDAコア

NVIDIAの「Pascal」アーキテクチャにおける最小単位となるのが「CUDAコア」になります。

CUDAコアは、FP32不動少数点演算ユニットと整数演算ユニットを搭載する「ミニCPU」とみなすことが可能です。

したがって、十分に単純化して適切に処理を割り当てれば、「128基(SM)×5基(GPC)×4基=2480基」のCUDAコアを用いて、2480本の処理を並列でできます。

 

マルチGPU

マルチGPUの歴史

マルチGPUの取り組みは、3Dグラフィックスのハード処理を最初に普及させた「3dfx」社が開発した「Scan-Line Interleave」になります。

映像を「走査線」で表現していたアナログ時代のテレビでは、1秒間を60コマに分け、1コマごとに「奇数の走査線」と「偶数の走査線」を描画することで滑らかな映像を表現していました。これを「インターリーブ」と呼んでいます。

いまでもインターリーブの技術は用いられており、逆に奇数と偶数を分けずに、順次走査させる方法を「プログレッシブ」と呼んでいます。

3dfxの採用した技術は、時間軸での交互描画そのものを意味するわけではありません。

2つのチップに描画処理を並列で行わせるための方法として、片方に奇数番の走査線、もう片方に偶数番の走査線、を担当させたわけです。

この技術は3dfxを買収したNVIDIAに引き継がれ、「SLI」(Scalable Link Interface)と頭文字の変わらないままに名称変更されました。

当初のNVIDIAのSLIは、インターリーブではなく、上下方向に画面をチップ数に合わせて分割し、1フレームごとに複数チップが分担して処理するものでした。

これは、上下方向に分割する事で、「地面」と正面の「人物」や「物体」、「空」といった連続性の高いオブジェクトを効率よく分担させることができます。

それによって「ポリゴン」の処理も、多少の重複はあるものの、分担して並列処理できる点で優れていました。

ほぼ同様の「マルチGPU」の手法を、AMDも採用し、「CrossFireX」として展開されています。

この「CrossFireX」は、後初であったこともあり、独自規格の「SLI」とは異なり、オープン規格として発表されています。

マルチGPUの効果

3Dグラフィックの処理は、頂点とそれにより構成される「ポリゴン」の処理が基本となるため、比較的「分散処理」に向いています。

仮に、上下に2分割した際に、上下に球体が一個ずつという具合にきれいに分かれていれば、完全な「並列処理」が可能であるため、処理速度は2倍に向上すると言えるでしょう。

また、映像の「ハードエンコード、デコード」処理なども、フレームごとにタスクを分割して割り振る事が可能であるため、投入する「GPU数」に比例した性能向上が得られやすいでしょう。

一方、ゲームグラフィックスにおける「物理演算」や「GPGPU演算」では、部分の演算結果が全体に関係してくる、すなわち「相互依存」する演算が少なくないため、「並列化」の恩恵も減ります。

あくまでもメーカーの発表値ですが、一般的な対応ソフトにおいて、NVIDIAによれば、「デュエルGPU」時で「1.87倍」、「3-way SLI」で最大「2.8倍」の性能向上が見込めるとされています。