ZeroLoom

「GPUを支える技術 ――超並列ハードウェアの快進撃」の読書ログ

October 3, 2024
2 min read
Table of Contents

本記事について


技術評論者 - GPUを支える技術 ――超並列ハードウェアの快進撃[技術基礎] の読書メモ用として本の内容から個人的に要約したものを記載しております。 引用している部分もありますが、私の要約に誤りがある可能性もありますのでご了承ください。

GPU について


  • CPU は数個 ~ 数十個の演算器を持っているだけだが、GPU は数十 ~ 数千個の演算器を持っている
  • 演算のためのデータの供給には GDDR DRAM(Graphics Double Data Rate Dynamic Random Access Memory)という、通常の DDR(Double Data Rate)メモリに比べて 1 桁高いバンド幅を持つメモリを使用している
  • GPU のように多数の演算器や大きなバンド幅を持つメモリを有効に使うためにはたくさんの処理を並列に実行するようなプログラムである必要がある
  • GPU は 整数演算から浮動小数点演算、32 ビットの単精度浮動小数点演算、64 ビットの単精度浮動小数点演算へと演算性能が変わってきた
  • GPU は CPU と比べてクロック周波数が低い分、1つのタスクを実行する速度は遅い
  • CPU は OS を介して I/O やネットワークをサポートしてデータの入力を行い、GPU にデータを供給し大量の計算を実行する
  • CPU と GPU の間は通常 PCI Express(PCIe)で接続し、GPU 側に DMA エンジンを持たせ、CPU メモリ(メインメモリ)と GPU メモリ(デバイスメモリ)間のメモリブロックのデータのコピーを行なっている
  • CPU と GPU とではピーク演算性能やメモリバンド幅に差がある
  • CPU は DIMM(Dual Inline Memory Module)の容量にもよるが、数十GB から 100 GB を超えるメモリを接続することができる
  • GPU はデバイスメモリとして使われる GDDR メモリの集積度によって、容量が固定で決まるため、増減ができない
  • 規模の大きなデータは CPU メモリにおいて、必要な部分だけ必要な時に GPU のデバイスメモリに転送して処理する必要がある
  • CPU から GPU のメモリにコピーするデータが2次元の配列である場合、ディープコピーを考慮する必要があるため、配列をコピーする際に配列の格納場所を GPU メモリに確保し、コピーした配列に対して、CPU メモリ側にある配列のアドレスに合わせてポインタのさすアドレスを変更する処理が必要

コンピュータで画像を表示する仕組み


  • プログラムを実行することによってメモリの画面表示領域に任意のデータを書き込むことができる
  • 画面表示領域はフレームバッファと呼ぶ
  • 動画の場合は 30 FPS(Frame Per Second)のようにフレームをパラパラ漫画のように表示する
  • フレームバッファのメモリを読み出し、それをディスプレイに表示するディスプレイインターフェースというブロックが設けられている
  • メインメモリではなく、表示専用のメモリ(VRAM)が存在する
  • 液晶ディスプレイは、液晶セルに光の透過量を書き込んで記憶させている
  • それを行毎に左列から順に右へと選択して書き込んでいる
  • 液晶ディスプレイ自体は発行しないため、裏側から小型の蛍光灯のようなランプを置いたり、白色 LED で照らして、光の透過量を制御して画像を表示している

プロセッサの構造と動き


  • プロセッサは命令やデータを記憶するメモリと、命令を実行する部分で構成されている
  • 命令を実行する部分は命令メモリから順次命令を読み出す
  • 命令で指示されている動作を行なっていく
  • 命令が演算の場合は、レジスタ(Register)群から演算するデータ(Operand)を読み出して、演算機で算術演算や、論理演算、その他の演算を行う
  • 演算結果は レジスタに書き込まれる
  • 命令がデータメモリの内容を読むロード(Load)命令の場合は、読みだすメモリアドレスをレジスタ群から読み出して、レジスタにデータを書き込む
  • データをメモリに書き出すストア(Store)命令の場合は、レジスタ群からアドレスと書き込むデータを読んで、指定されたアドレスにデータを書き出す

3D モデルの作成


  • 3D グラフィックスは平面のパネルを貼って表面の形を作る
  • 多角形のパネルの頂点の座標を書き重ねて表現
  • 平面ではなく、曲面の場合は小さなパネルに分解して表現する
  • トライアングルストリップはりんごの皮剥きのように細い帯に区切り、連続した三角形で近似して区切る
  • 頂点付近はファン(扇子)のように要のところで三角形を繋いで近似させる
  • 三角形パネルの3つの頂点の座標を指定するとパネルに位置が決まる
  • この二つの表現方法は前の三角形の2点を利用して1つの点を追加するだけで、1つの三角形を表現できるため、データ量を減らすことができる
  • 四角形や多角形のパネルでは、4点以上の頂点の座標が必要になるため、平面にならず計算が面倒になる
  • 建物のモデルを作る場合、壁、屋根、窓、煙突など全ての面を三角パネルに分解し、座標を指定して表現する
  • 車のモデルを作る場合はボディーやタイヤなど、トライアングルストリップを使う曲面が多く、滑らかな表面にするには多数の三角パネルが必要になる
  • 両者のモデルともに、ローカル座標というモデル毎に独立の座標で表現し、全てのモデル要素をまとめるグローバル座標(X/Y/Z)の中に、ローカル座標で表現したモデルを配置する
  • 物体を移動させる場合は、ローカル座標の原点のオフセットを調整することで平面(XY)の移動が可能
  • 物体の向きを変える場合はローカル座標の Z 軸の周りに回転させる
  • それぞれ、頂点座標に対して、平行移動の行列、回転の行列を掛ける
  • 上記のようにグローバル座標の中で、モデルの位置や向きを調整することをモデリング変換という
  • 視点を基準とした座標に変換することを視点変換という
  • モデリング変換行列と視点変換行列を掛けた変換行列によって、両方の変換を一括で行うことをモデルビュー交換という
  • このような座標変換をトランスポーズという
  • 光の反射の計算をピクセル毎に計算する処理のことをライティング(Lighting)と呼ぶ
  • パネルからパネルに反射する場合を考慮して、高品質な描画を行うためにレイトレーシング(Ray Tracing)という技術を用いる
  • レイトレーシングは多重反射を計算する(ピクセル単位)