Ryuz's tech blog

FPGAなどの技術ブログ

なぜGPUは高性能なのか

はじめに

最近 FPGA をやっているとよく GPU と比べられるという事が起こります。

本来の FPGA の得意分野(通信処理とか画像信号処理とか)を考えると、不思議な感じもするのですが、逆に FPGA が汎用計算機と比較されてしまうぐらい守備範囲を広げているとも考えられますので、喜ばしいことです。

FPGA との比較は後に回して、まずは どうしてCPUに対してGPUは高性能になれたのか? について考えてみたいと思います。

HPC は一旦おいていて、コンシューマでも手の届くレンジで最新のものとして GeForce RTX 50 series を眺めていたのですが、TSMC 4N での製造でダイサイズが 16.9 ~ 750mm2 までラインナップがあり、CUDAコア数が 2,560 ~ 21,760、TensorCore も含めた演算性能だと 13.2 ~ 104.8 TFLOPS(FP32) となっているようです。

同世代の Core Ultra 9(Intel) や Ryzen(AMD) などのコンシューマ向け x86 CPU が 0.5~10 TFLOPS 程度のレンジだと思いますので、同じ半導体プロセスをもってして、計算機アーキテクチャの差で数十倍程度の性能差は出していることになるようです。

SIMD と SIMT と

この二つは計算機のアーキテクチャとしてはかなり似ていると思っているのですが、ソフトウェアから見た見え方はだいぶ変わってくると思います。

SIMD(Single Instruction Multiple Data)は、CPU の命令の中に並列計算を行う命令を用意して1つの命令で同じ演算を並列に沢山計算するというもので、x86 の AVX や ARM の NEONなどが有名です。

一方、SIMT(Single Instruction Multiple Thread)は、主に GPU で用いられているもので、同じ命令を実行する沢山のスレッドを同時に実行します。

どちらもハードウェアとしては、大量のALU(演算ユニット)に対して、1つの命令デコーダで構成されますので、かなり良く似ています。

ではなぜ SIMD は SIMT に十分に迫ることが出来ていないのでしょうか?

一つの理由に、SIMD はソフトウェア互換性を保ったまま並列度を増やすのがとても難しいという事があるように思います。

AVX-2(256bit) が AVX-512(512bit) に並列度倍増しようとしたときに、Linux の作者である Linus Torvalds 氏がこんな苦言 を呈したのは有名なのでご存じの方も多いかもしれません。

SIMD の並列度の増強は、新命令の追加だけでなくレジスタ幅も広げなければなりません。レジスタはOSなどがプロセスやスレッドをスイッチするときに退避復帰する部分ですので、まずOSがアップデートされなければその機能を使う事が出来ません。 加えて当然ながらコンパイラも新命令に対応を迫られ、アプリケーション側もその新命令を使ってプログラムしなければ恩恵に預かれません。 要するにSIMDの性能向上は方々のソフトウェアエコシステムに都度対応してもらうという迷惑を掛けないと進化できません。

一方で、SIMT はもともと「このスレッドをできるだけ沢山一度に実行して」という形でプログラミングする為、同じプログラムが、コア数の少ないGPUでは少しのスレッドに分けて何度も実行され、大量のコアを持つGPUでは一度に大量に数度だけ実行される、という動きになります。 早い話が元のプログラムはそのままで、デバイスドライバ層以下の狭い範囲の対応だけで並列度の高い新しいGPUの恩恵が受けられます。 これがGPUの強みの一つと考えており、半導体プロセスの進化とともにどんどんコア数を増やし、並列度を上げてきました。

それでは「CPUでもSIMTをやればいいじゃないか」と思われるかもしれません。 しかし残念ながら、CPU では過去にあまりにも複雑な命令を沢山実装しすぎたせいで簡単にはそれができません。SIMTをやりたければ、互換性の為に過去のすべての命令に対応したスレッドを並列実行しないといけないため極めて高コストになってしまいます。 SIMD は 新しく追加した「演算に特化したシンプルな命令だけ並列化する」からこそCPUでも採用できている部分があると思われます。

だったら、シンプルな命令だけ実行できるコアを別に用意して、それ用の命令列も別に作ってSIMTを追加すればいいじゃないかとも思われるかもしれません。が、それは GPU入りCPUに外ならず、既にあちこちに存在している通りです。

最先端プロセスの威力

次に、FPGA と比較するために、最先端プロセスの凄さにも触れておきます。

半導体は大量に製造販売できる需要の見えているものは、最先端プロセスでの製造に投資しやすく、大量生産の効果で価格も抑えやすいです。 今GPUはご承知の通りAI需要で引っ張りだこでですので、惜しげもなく先端プロセスに投資できる状況にあるかと思います。

私が普段使っている KV260 などの 16nm プロセスの FPGA の載ったものは DSP(積和演算器)の数も1000個程度の規模であるため、CUDAコアが数万個もある最新のGPUと比べると性能に圧倒されるわけですが、逆に同じ 16nm 世代の GPU として GeForce 10 series あたりを参照すると、CUDA コア数も 256 ~ 3840個で、同じ世代の FPGA でも積和演算性能であれば近いものが狙っていけますし、価格帯も数万から数十万円のGPUの値段に対して同じ価格でFPGAも同クラスの規模感が狙っていけます。

要するにアーキテクチャではそれほど優劣は無いと思っているのですが、現実には、最先端プロセスの採用に関して GPU がだいぶ先を行っている感があります。

今のところ FPGA は先端プロセスで作っても直ぐに大量に売れるわけではありませんので、こなれた価格で使える品種のプロセス世代が変わるにはどうしても時間がかかってしまいます。

プロセスの進化で圧倒的に変わるのがダイ面積あたりに詰め込めるトランジスタの数でありそのまま演算量となります。半導体の価格は面積と強い相関があるので、FLOPS/$ が改善します。 またしばし微細化が進むと1つあたりのトランジスタでの電力も減るため FLOPS/W も改善します(これとは別に「面積当たりの電力」は近年悪化の一途のようですが)。

今朝方、試しに RTX 50 series の性能を Wikipedia を見ながらプロットしてみました。

GeForce RTX 50 series

1mm2 増えるごとに コア数が 31.5個ぐらい増え、0.149 TFLOPS 程度上昇する計算のようです。

同じことを GeForce 10 series でもやってみました。

GeForce 10 series

1mm2 増えるごとに コア数が 8.45個ぐらい増え、0.0259 TFLOPS 程度上昇する計算のようです。

ものすごく大雑把な計算ですが、TFLOPSで見ると TSMC の 16nm を 4N にすると GPU では 5.75 倍ぐらい面積当たりの性能効率が上がっているようです。

はやい話が FPGA は、10倍まではいかなくても 5 倍ぐらい不利なプロセスで戦っているというのが見えてきたのではないかと思う次第です。

おわりに

「敵を知り己を知れば、百戦危うからず」と言いますが、まあ敵とは言わないまでも他のプロセッサアーキテクチャの特性をよく理解して、何を選択するのが最適なのか考える事は大事だと思います。

せっかく「FPGA で尖ったことがやりたい」と思っていたのに、「やってみたら、GPUでやるのに比べて良いところなしだった」だと寂しいですので、どういうところが強みで、弱みなのかと合わせて、「どれぐらい弱いのか」、または「どれぐらい強いのか」をもう少し定量的に見ておくこともまた必要なことのように思いました。

しかし、久々に最新スペックを見てみましたが、GPU凄いですね。 とはいえまだまだ GPU より凄い物を作れる余地は沢山あるのだと思いますので、また新しいものが出てくることを期待している今日この頃であります。