GPUを支える技術
浮動小数点演算器を搭載していく流れが生まれた
科学技術者にとって魅力的な演算環境として注目
64bitの倍精度演算できるGPUを開発し科学技術向けに作り始める流れ
整数と浮動小数点
所与のbitにてどのように数を表すか?の仕様
CPUとGPU繋ぐ仕様
https://scrapbox.io/files/66b67a8d10dc16001da837f4.png
CPUとは独立のPCIeカード等に搭載されたGPUの利用(NVIDIAぶっ刺したり)
GB級のメモリ持つのがアツい
CPUメモリ空間とGPUメモリ空間
CPUメモリ or GPUメモリに置くことを宣言しないといけないのに
MLXだと演算の実行先を宣言する形なのに感動しました CPUとGPUが同一チップ(スマホとか)だとCPU/GPUで共通メモリ空間が実現されてる
ムーアの法則
目標設定:前の世代の2倍のトランジスタ密度を達成する0.7倍の寸法
GPUを科学技術計算に使いたい!
グラフィクスの要件から頂点座標と座標変換マトリクスを掛けるというような操作を記述するプログラム
科学技術計算する際に、変数を頂点座標としてそれに変数を座標変換マトリクスの形で掛ける必要があった
汎用計算に適してない...
GeForce 8800
Streaming Miltiprocessor(SM)8基 × 16個の演算ユニット(32bit演算器×2)CUDAコア 例えばGF100 Fermi GPUは16個のSM、32個のCUDAコア(32bit演算器×2。整数演算器と浮動小数点演算器)
各サイクルで16×32×2回計算可能
64bitなら2サイクルで計算できるので16×16×2回計算可能
このCUDAコア数の感覚大事
1コア1クロックあたりの計算性能IPC(Instructions Per Clock cycle) クロック周波数を考えるとCPUの数千倍計算できることが分かる
DirectX、Windows環境下の用語だが3Dグラフィクスの世代を語る上で指標用語になってる
浮動小数点
グラフィクスでは一般的に32bit。座標計算がきわどいと16bitだと見えないピクセルが見えちゃったり
MLだと個々の入力に多少の誤差があっても総和に影響ない。半精度で十分
Pascal GPU以降では半精度(16bit)をサポートするように
浮動小数点、1.23×1045とすると1045が数の大きさ、1.23が数の細かさ
Expが大きさ、Fracが範囲
数値範囲を決めるExpが足りないケースに備えbf16が使われるケースも むしろ「推論」であれば8bitでも十分では?
32bitの浮動小数点積和演算に比べるとトランジスタ十分の一、重みを記憶するメモリも8bitに減らせる
専用の作れば同じサイズのチップでもっと大きなNNが載せられる = 専用チップに繋がる
Tesla M 40
メモリ帯域幅は(32bitなら)72GB/s、6.8TFlops
つまり、平均的に1回メモリ読んだらそのデータを94.4回演算に使わないとメモリアクセスがネックになる
6.8T/72GB
DGX-2
NVSwitchを使っているのでV100全てが各々全てのメモリをアクセスできるようになっている! 巨大GPUのメモリ空間を持てている
CPUやGPUのエラー原因は宇宙線によるCMOS回路誤作動
NVIDIA、GPUアーキテクチャに高名な科学者の名前付ける流れ
GPU「アーキテクチャ」への名前なのか。アーキテクチャの刷新
伝統的に「100」が科学技術用高性能チップ。V100(Volta)、A100(Ampere)
どのようにカーネルを実行する?
動作予定のカーネルプログラムをGPUのデバイスメモリに転送しておき、CPUからは先頭アドレスを叩いて実行
GPUは32bitのデータが基本。レジスタファイルのデータ幅は32bit構造
64bit扱う場合は2回に分けて処理
Pascal以降は32bit演算器を半分にしてfp16計算できるようなサポート つまり、各CUDAコアを「分割」することで半精度演算を1サイクルに2つ並列に実行できる機能をサポート
GPUは32bitが基本構造なのでfp16演算では計算を並列実行するSIMDとしてレジスタファイルの読み書きは32bit幅でやる
このような実装なので(TU 102 GPUの場合)fp16が107.6TFlops、int8が2倍の215.2TFlops、int4では更に2倍の430.3TFlops
アーキテクチャが刷新するごとに分割して使えるようになっていったイメージか
intとかって科学技術計算では使わないにしろポインタの計算とかでメチャクチャ使うね
CPU内蔵GPUやスマホ用SoCはCPU/GPUが同じメモリ
CUDAもOpenCLもC言語の拡張
どこのメモリに置くのかとか指定する必要ある = 修飾子 cuBLASはマトリクスやベクトルの演算を行うライブラリ
C言語の拡張なのでC言語のライブラリ使える
cudaSetDevice():どのCUDAデバイスに投げる?