『[増補改訂]GPUを支える技術 ――超並列ハードウェアの快進撃[技術基礎]』より転載
本書は、GPU(Graphics Processing Unit、GPGPU/General Purpose GPU)の技術解説書『GPUを支える技術』の増補改訂版です。本書の初版は2017年に出版されました。業界全体の急速な進展に伴い、改訂版の本書では取り上げる技術をアップデートし、とくに第7章、第8章では、先端のGPUやディープラーニング(Deep learning/深層学習、より包括的な概念であるマシンラーニング/Machine learning/機械学習とも呼ばれる)、AI(Artificial Intelligence)エンジン、マシンラーニング処理性能のベンチマークなどの解説を大幅に強化しました。また、全体を通して、扱うGPUなども本書前半の基本解説、後半の技術動向紹介(後述の「本書の構成」を参照)ともにそれぞれ新しくしました。
スマートフォンなどのカラフルな画面を作り上げているのは「GPU」です。したがって、GPUは私たちの生活に一番密着しているプロセッサとも言えます。本書前半では、グラフィックスの画面表示がどのようにして行われているのか、グラフィックス表示用のGPUは従来のCPUとどのような違いがあるのかから解説を行っています。
グラフィックス表示、とりわけ3Dモデルに基づく画面表示を行うには大量の計算が必要であり、GPUは「高い計算能力」を持つという方向に進化していき、トップクラスの製品同士を比較すると現在ではCPUに比べてGPUは10倍程度の計算能力を持っています。
GPUの計算能力の向上には、ゲームグラフィックスが大きな支えになっています。3.3節に、西川善司氏に寄稿いただいたゲームグラフィックスの解説があります。そして、改訂版では3.3節に、レンダリングパイプラインにおける変化の兆しや、多重反射による映り込みを扱えるレイトレーシング(Ray tracing)技術の解説が加わりました。
第4章では、GPUはどのような構造になっており、なぜCPUより数値計算性能が大幅に高いのかを詳しく掘り下げて説明しています。基本的にGPUはたくさんの演算器を搭載して、並列に計算を行うことで高い計算性能を実現していますが、たくさんの演算器があってもそれらを有効に使うプログラムでなければ高い性能は実現できません。第5章では、GPUで実行する超並列プログラムの記述機能を持つCUDAやOpenCLについて説明しています。また、並列化されていないC言語やFORTRANのプログラムに並列化の指示行を書き加えることで並列プログラムを作るOpenACCやOpenMPといったツールが使われてきており、並列プログラムの開発を容易にしてきています。第5章ではこれらのツールについても紹介しました。続く第6章では、GPUの進化と合わせて理解しておきたい、メモリやデータ伝送の周辺技術についてまとめています。
本書後半、第7章以降は、GPUの応用や動向に焦点を当てます。GPUの高い計算能力に注目した研究者やエンジニアが、GPUを科学技術計算に使い始めたことは初版(第3章、第7章)でも説明しました。その後もGPUの計算性能は向上し続けており、世界のスーパーコンピュータの性能ランキングのTOP500で、500位までのスーパーコンピュータのリストのうちの約1/3が計算エンジンとしてGPUを使っています。
ここ10年ほどの新しい動きは、AI/ディープラーニングの分野の大幅な発展です。ディープラーニングは画像の識別などでは時に人をも超える正確さを示すようになってきており、普通の言葉で書かれた文章、音や声の理解なども実用的に使えるレベルになってきています。最近では、Microsoft WindowsのCortanaやGoogle Assistantのような音声認識や、画像認識を使った類似の写真の検索、自動翻訳など、ディープラーニングを使うWebサービスが増えています。また、車の自動運転でも周りの状況の認識などに、ディープラーニングが使われます。このようなAI/ディープラーニングには極めて大量の計算が必要になり、これらの計算はGPUの得意なタイプの計算でGPUが多く使われています。
GPUを利用したAI/ディープラーニングの進化がAIを利用する分野を拡大し、利用分野の拡大がGPUに新たな改良を促すというポジティブなフィードバックが起こり、大きな進歩が起こっています。第7章では、GPUの使われ方の広がりや新たな使い方に焦点を当てています。
ディープラーニングは膨大な計算を必要とし、その実行エンジンとしては、大量の計算を行うGPUが近い位置にあります。大量の計算といっても、科学技術計算では64ビットの倍精度浮動小数点演算という高精度が要求されます。一方のディープラーニングでは16ビット程度の低精度の計算で良いのですが、大量の計算を速く実行する必要があるという異なる要求が出てきています。
これにより、GPUは「高精度の数値計算」と「大量の低精度の数値計算」を行うアクセラレータという両面性を持つように作られてきています。その一方で、GPUの利用範囲が広がるにつれて、適用範囲を絞って、その範囲内ではより性能の高いアクセラレータを作るという動きも出てきています。第8章では、適用範囲をディープラーニングに絞って性能を高めたアクセラレータについても取り上げています。また、GPUだけではなくその他のアクセラレータを含めて、今後どうなっていくのかという展望も述べています。
本書では全体を通して、汎用CPUの基本的な処理方法の概念はおおよそ理解があるという想定で解説を行っています。また、GPUのプログラミングに関してはC言語の基本的な知識を持っていることを前提に解説を進めますが、並列プログラミングについては特別な知識は必要ではありません。
GPUは広く使われていますが、初学者の方々向けに、その構造を解説した書物はほとんどありません。また、CUDAやOpenCLによるプログラムの書き方を扱っている文献はありますが、GPUのハードウェアの構造と関連付けて、どのように書けばハードウェアを有効利用できるかという観点で説明を行っている本はまだ少ないのが現状です。
本書を通してGPUを理解し、より上手に活用していく方が増えることにつながれば幸いです。
2021年2月 Hisa Ando