/note/tech

なぜもっとたくさんのコアを搭載したCPUを作らないのでしょうか?2000コアのGPUなんかそそこら辺にありますが...

質問に間違いがありますね。

2000個のコアが入ったGPUなんかありません。企業の広報は違った(間違った)方法で計算して数字を大きく見せています。

Radion 6900XTの本当のコア数(DCU)は、5120個ではなく、40個です。こちらでダイの写真を確認でき、2つのグループ、または4*5のコアがあります。

各コア(DCU)には32レーンのSIMDユニットが4つあり、各コアには並列に動作する32 bitの浮動小数点演算ユニット(FMA)が128個あり、チップ全体としては32 bitのFMAが5120個同時に動きます。

CPU - 順次実行

汎用のプログラミング言語で書かれた普通のプログラムを実行するためにCPUは設計されています。

普通のプログラムを書くのに使われるプログラミング言語のほとんどは、処理を順番に記述する構成になっており、順次処理というプログラミングのパラダイムを基本にしています。この順次処理の制御の流れは、前の処理の結果が次の処理に影響するため、普通は効率よく並列化できません。ごく一部に限りコンパイラがマルチコアに適した並列処理に自動変換できます。たとえコア数が少ない場合でも、コードの大半を並列化するために、プログラマは懸命にマルチスレッドのコードを書かないといけません(つまり、より大変で、時間がかかり、バグりやすくなります)。

順次処理のコードを可能な限り早く走らせるようにCPUは最適化されています。ほとんどのプログラムにとっては順次処理が本当の問題だからです。もしプログラムの半分を並列処理で書けたとして、100万コアがあり、並列処理が100万コアを活用できたとしても、もう半分の順次処理の実行速度に変わりはなく、全体としては元のコードの2倍の速さになりません。

GPU - 並列実行

一方GPUは並列処理に高度に特化しています。プログラム全体を実行する能力はありません。プログラムのごく一部にあたる高度に並列化された処理だけがGPUに送られて実行されます。そのためにプログラムはたくさん働いてGPUで実行するコードを生成します。

スクリーンにドットを描く処理はめちゃくちゃ並列化できる数少ない処理の1つです。もし1画面に800万ドットがある場合、1ドットを打つのにたくさんの計算をする必要があり、論理的にはその800万ドットの処理全てを並列化できます。

グラフィック処理は本質的に高度な並列処理で、ここ10年弱でグラフィックと全く関係のない計算を並列実行できるようになりましたが、並列処理ユニットは元々はグラフィック処理のためにGPUとして登場したのです。

へぇー