自作PCで学ぶコンピュータアーキテクチャ CPU GPU編

# はじめに
9月末に時間があったので、ディープラーニング用に自作PCのパーツを秋葉原に買いに行ったのですね。
CPUやメモリ、グラボについて授業で勉強することはなかったのですが、オライリーの
[コンピュータシステムの理論と実装 ―モダンなコンピュータの作り方](https://www.amazon.co.jp/%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%81%AE%E7%90%86%E8%AB%96%E3%81%A8%E5%AE%9F%E8%A3%85-%E2%80%95%E3%83%A2%E3%83%80%E3%83%B3%E3%81%AA%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%81%AE%E4%BD%9C%E3%82%8A%E6%96%B9-Noam-Nisan/dp/4873117127)
はざっくり読んだという状況です。
これから3回ほどに分けて購入した各パーツについての記事を書いていきたいと思います。

## CPU購入時に考えたこと
買ったCPUは第9世代のIntel icore 5-9400です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265573/5c2be4b6-326a-927b-bd88-6773457a9e3f.png)

6コア/6スレッド、クロックがベース2.9GHz、ターボ時4.1GHz、キャッシュ容量が9MB（Intel SmartCache）、TDPが65W、対応メモリがDDR4-2666（2チャンネル、最大128GB）
今回は、CPUは最低限のスペックでよかったので、コア、スレッドとクロック数だけ考慮して購入しました。かつては単一のコアで動くCPUが主流でしたが、小型化が進み、第８世代からは、iCore5のスペックから６コア６スレッドのヘキサコアになりました。
クロック周波数はとは、1秒あたりの信号数です。
2.9GHzだと1秒間に29億回の動作を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265573/0ee1e42c-46ff-fa9b-70e6-059c4509d9f2.png)


DLの学習ではGPUが重要だと思われがちですが、前処理ではCPUが使われることが多いです。
例えば、Pythonの有名なライブラリscikit-learnはGPUによる計算処理のサポートがないので処理速度はCPUに依存します。
## GPU購入時に考えたこと
購入したGPU
GeForce RTX 2070 GAMING Z 8G
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265573/953d0ae4-5207-683c-ebed-37b4a93e0dde.png)

GPUを購入時に考えたことはGPUの個数とGPUクロック、ブーストクロック、メモリ量です。
マザーボードによっては、複数のGPUを積んで、SLI接続を行い、複数のGPUを並列に動かすことができます。
ただ、ショップの店員さんにも言われたのですが、よっぽどのハイスペックなGPUが必要ではない限り、性能が低いGPUを2つ積むよりも、性能が良いGPUを一つ積んだ方が良いらしいです。
今回は予算が10万付近だったので、個数は1つにしました。
というわけで、1070と迷いましたが、新しいモデルの2070を購入しました。
### 余談-Why GPU?
そもそも、なぜDL用のPCではGPUの性能が求められるのでしょうか？
CPUでの演算処理では何がダメなのでしょうか？
そもそもGPUはGraphics Processing Unitの略で3Dグラフィックスなどの画像描写を行う際に必要となる計算処理を行う半導体チップ(プロセッサ)のことです。
画像データは行列(多次元配列)ですよね。
超簡略化した図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265573/514de33a-99e0-e25e-bb6f-8c601ed0a91a.png)

PCゲームをやる時には、リアルタイムでユーザが起こしたアクションや、ゲーム内のイベントについてCPUから送られる画像を描画する必要があるわけですが、行列の計算を高速で行う必要があるのでGPUではコア数が数千個(CPUは多くても数十個)ほどあり、並列で行列の計算が行えるようになっています。

GT5
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265573/8aadea4b-4428-9cf6-ae5f-ec265a507175.png)
画質綺麗すぎやろ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265573/7d8ae37c-2b97-439c-c745-4e7297a9e80e.png)

CPUはif分などの複雑な処理を処理することには向いていていますが、コア数が少ないので高速に並列処理を行うことには向いていません。
一方GPUはfor文などの反復処理を高速で行うことができます。
２次元データを高速で3D画像に描画することは単純でスピードが求められるのでGPUの方が適しているっていうわけです。
CPUでの処理に限界を感じてGPUを作ったので当たり前と言えば当たり前なのですが。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265573/b71a88d1-ff39-b20d-32a9-8c871ad41e3e.png)

さて、DLについて理解している人はもうピンと来ていると思いますが、DLの学習時の演算は重みの行列に別の行列をかけて足し合わせる「行列の積和演算」ですよね。
この処理は三次元のグラフィックスのポリゴンを移動させたり回転させたりするときの行列演算とそのまんま同じなのです。

ポリゴン画像
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265573/97e02974-33a4-d609-e1aa-f5ac0bad1bc2.png)


そう！ポケモンのポリゴンはまさにポリゴンなのです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265573/ce3a10ae-a4cf-5a4e-a637-7f30c3bf5b40.png)

DLでの演算がGPUの演算とほとんど同じなので、元々は3Dグラフィックスの描画に使っていたけど、DLでも使ってしまえ！というのがアイデアなのですね。
GPUの演算資源を画像処理以外の目的で応用する技術のことをGPGPU(General-purpose computing on graphics processing units)と言います。

# 最後に
余談が長すぎて、ほとんどになってしまいました。笑
次回はマザーボードとメモリについて解説できたらなと思います。
まだまだ絶賛参加受付中なので、気になった方は参加して欲しいです！！
[千葉大学 Advent Calender](https://qiita.com/advent-calendar/2019/c-tech)
それでは！
# 参考
https://www.kagoya.jp/howto/rentalserver/gpu_deeplearning_ai/