PCのパーツについてのお勉強 – メインメモリとVRAM、CPUとGPU
January 11, 2021
自作 PC を検討していた時のメモ(結局検討だけで終わりましたけど。でも良い勉強になりました。)
マザーボードのメモリとビデオカードのメモリについて #
- マザーボードにはメモリを刺すわけだが、それとは別にビデオカードも自身のメモリを持っている。例えば、「GeForce RTX 2060」の場合、容量 6GB のメモリ。
- マザーボードのメモリをメインメモリと呼び、ビデオカードのメモリを VRAM(Video RAM)と呼んだり、ビデオメモリと呼んだりする。
- VRAM はその名の通りグラフィックの描画に特化したメモリ。
- リアルタイムに描画処理し続ける場合、遅延を起こしてはいけない。
- 描画に関するデータを一時的に保存しておくことで、GPU の処理タイミングに遅れることなくデータを提供するために登場したのが VRAM という存在。
なぜメインメモリではだめなのか
その理由はデータ転送速度(メモリバンド幅)にあります。
搭載 CPU や製品にもよりますが、メインメモリで使われる DDR4 という規格では 50GB/秒程度の転送速度なのに対し、VRAM で一般的な GDDR5 という規格は 200GB/秒もの速度でデータを送り出すことが出来ます。
高解像度で美しいグラフィックを 1 秒間に何十、何百枚と表示するには大量のデータを転送し続けることが必要になるので、より高速な VRAM が必要になるのです。
一般的なメーカーパソコンがゲームに向かないと言われる理由の一つに、この VRAM を搭載していないものが多いことが挙げられます。
これらのパソコンでは、低速なメインメモリにグラフィックデータを格納して処理します。その為、一般的用途なら問題はなくてもゲームではデータ転送が描画に間に合わなくなり、フレームレート(1 秒間に表示する画像の枚数)が低くなるため、ガクガクとした動きになり快適にプレイ出来なくなります。
グラフィックデータが VRAM に入りきらない場合は、あふれたデータはメインメモリに、それでも入りきらない場合は仮想メモリとして HDD のような記憶媒体に格納されます。
メインメモリに格納されるということは、上記の一般的なメーカーパソコンと同じような状態になってしまうということです。
フレームレートの大幅な低下を引き起こしたり、起動できないといった問題の原因になる可能性があります。
CPU と GPU の違い、そして GPU の GPGPU 化 #
- (いまさらだが)GPU は本来画面描画のために用意されたもの
GPU は一般的に画像処理を専門とする演算装置であり、多くの場合、CPU と呼ばれる主演算装置の制御の下で用いられる動画信号生成専用の補助演算用 IC である。動画像の実時間内での生成は高負荷な演算能力が要求されるが、その多くが定式化された単純な演算の繰り返しで…(略)
- そもそも画面描画とは、条件分岐のない、決まった大量の処理を高速でこなす作業
- それに特化したプロセッサが GPU、つまり CPU に言われたことをただひたすら高速でこなす脳筋君
GPU はメモリにシーケンシャルにアクセスし、かつ条件分岐の無い計算(演算密度の高い処理)に強い。
- 逆に言うと、条件分岐には弱いってこと。
- よく、CPU は複雑な計算が得意で、GPU は単純な計算を大量にこなすのが得意という説明がされるけれど、
- 要するに、条件分岐を含んだ処理でもそつなくこなすのが CPU、条件分岐しない処理が得意なのが GPU ということ。
- 機械学習系統の処理は単純な計算を大量にこなすもの(…らしいよ?)なので、GPU にスポットライトがあたる。
- 画面描画以外でも GPU に働いてもらおうじゃないか、という概念および技術が GPGPU(General-purpose computing on graphics processing units)で、つまり、じぇねらるぱーぱすな GPU なのです。
GPGPU 用の GPU の登場
- GPGPU 用に最適化し、逆に画面描画用の性能を削減した GPU も登場している
- NVIDIA からは「NVIDIA Tesla」シリーズ
- AMD からは「AMD FirePro」シリーズ
- そろそろ GPU がゲシュタルト崩壊します
CPU で処理するのか、GPU で処理するのか、誰が決めているのか #
すべての処理は CPU の仕事です。
- CPU が GPU に処理を振ることで GPU が処理をおこない、結果を CPU に返します。
- つまり、CPU は自分自身でも演算処理すると同時に、GPU への振り分け役でもあります。
- CPU 部長はプレイングマネジャーというわけです。
以下は、teratail からの引用
GPU で(描画以外に)演算させるためには、必要なデータや演算ロジックを、CPU から指定してやらねばなりません。GPU は CPU の下請けとして、演算だけを専門に行う別会社のようなものです。
一例的には、こんな感じです。
- CPU は演算のための元データをメインメモリに準備する
- CPU は GPU に、元データを転送する(GPU は自身の管理するグラフィックメモリ内にそのデータを格納する)
- CPU は GPU のプログラマブルシェーダーを転用して、演算ロジックを設定する
- CPU は GPU に命令して、演算を実行させる
- CPU は GPU からの演算完了を待ち、完了したら GPU に命令して、結果を受け取る
では私はどうすれば、GPU に処理をさせるよう CPU に命令できるのか?
- そういうふうにプログラミングする方法があります。
- 「GPU プログラミング」とか、「GPU コンピューティング」と言われるようです。
- 色々あるらしいけれど、例えば CUDA(クーダ)という NVIDIA 製のの統合開発環境を使うことで GPU に処理させるプログラムができるらしい
- もはやよくわからないので、Wikipedia へのリンクを貼って逃げます。
ヘテロジニアス・コンピューティング
- CPU と GPU という異なる種類のプロセッサを組み合わせて演算させることを「ヘテロジニアス・コンピューティング」というらしい。
- とりあえずかっちょいい響き。以上。
そう、できるよ、Python ならね
-
ここまでで CPU と GPU の関係性については整理できたので満足だけど、一応補足。
-
GPU コンピューティングってめちゃくちゃ敷居高そう(実際高いと思われる)だけど、Python ならうまいことやってくれるライブラリがある様子。
-
NumPy 互換の GPU 計算ライブラリ「cupy」
- ちなみに、Preferred Networks 社製とのこと。さすが。
-
TensorFlow の GPU サポート
- TensorFlow は GPU 計算をサポートしてるらしいですが詳しくは各自でお調べなさいまし。