はじめに
私自身が、業務でGPU環境を初めて構築することになり、GCPの公式ドキュメントを見ていたところ、初めて見る言葉を整理したくなり、この記事にまとめたいと思います。
GPUを利用するために必要な、GPUドライバについて、
- NVIDIAドライバとはなにか
- CUDAツールキットとはなにか
- CUDAランタイムとはなにか
- CPUには必要のないドライバーがGPUにはなぜ必要なのか
というあたりを、素人なりに調査してみます。
NVIDIAドライバとはなにか
答えは...
「NVIDIA製のグラフィックカードを正常に動作させるために必要なソフトウェア」
グラフィックカードとはGPUが装着されたボードのことを指すので、実質GPUを正常に動作させるためのソフトウェアと考えてよいでしょう。
また、
このドライバによりハードウェアとソフトウェア間の通信を円滑にし、NVIDIA製グラフィックカードの性能を最大限に引き出します。
ハードウェア(GPU)とソフトウェア(OS)の橋渡しの役割がある、ということになります。
CUDAとはなにか
答えは...
「NVIDIAが開発した並列コンピューティングプラットフォームおよびプログラミングモデル」
こちらのサイトから引用させてもらいました。言葉が難しいので、一つ一つ調べていきます。
並列コンピューティング
複数のコンピュータやプロセッサーでひとつのタスク処理を行う技術の総称。
なるほど、GPUは並列で計算を行うのはよく聞く話で、CUDAはGPUに並列処理させるためのプラットフォームになるんですね。
プログラミングモデル
プログラミングモデルというと、オブジェクト指向などがぱっと頭に浮かびますが、ここでは異なる意味のように思います。
CUDAのプログラミングモデルは、並列処理を直感的に記述できるよう設計されています。主要な概念には以下のようなものがあります。
カーネル:GPU上で実行される並列処理の単位
スレッド:個々の処理単位
ブロック:複数のスレッドをグループ化したもの
グリッド:複数のブロックをさらにグループ化したもの
これらの概念を使いこなすことで、複雑な並列処理も効率的に実装できます。
つまりは、実行の単位やメモリの扱いを検討し、プログラムにまとめたもの、というのがここでのプログラミングモデルの概念になるのでしょうか。
CUDAツールキットとは
答えは...
「NVIDIA社が開発・提供しているGPU向けの開発環境」です。
CUDAツールキットに含まれるもの
- コンパイラ(nvcc)
C/C++やCUDA C/C++ソースコードをGPU用バイナリにコンパイルする。 - 各種ライブラリ(cuBLAS, cuFFT, cuDNNなど)
線形代数やFFT(高速フーリエ変換)など、GPUを活用するための便利な関数群。 - 開発用ツール(Nsightなど)
プロファイリング(性能解析)やデバッグを行うためのツール。 - サンプルコード・ドキュメント
開発の学習やサンプル実装の参考に役立つ。
つまり、CUDA向けプログラムを「開発(コンパイル・リンクなど)」する人にとって必要なものとなります。
CUDAランタイムとは
答えは...
「GPUとのインターフェースを提供するライブラリ」です。
つまり、CUDAプログラムを「実行」する際に必要となるランタイムライブラリやAPI機能のことを指し、CUDAを利用するアプリケーションを動かすために必要となります。
GPUにはなぜドライバーが必要なのか
CPUには必要のないドライバーが、なぜGPUには必要なのか。答えは...
「GPU(グラフィックス処理装置)はグラフィックスの描画や並列計算を行うための専用ハードウェア」であるからです。
CPU(中央処理装置)はパソコンなどのシステムの中核を担う「標準的な演算装置」であり、OS自体がそのCPUのアーキテクチャ(x86/AMD64、ARMなど)に合わせて作られているため、特別な追加ドライバが不要となっています。一方で、GPU(グラフィックス処理装置)はグラフィックスの描画や並列計算を行うための専用ハードウェアであり、ハードウェアごとに特殊な制御が必要なので、それを行うためのベンダー提供ドライバが求められる、ということになります。
まとめ
- NVIDIAドライバとはなにか → GPUとOSの橋渡しになるもの
- CUDA ツールキットとはなにか → GPU向けプログラムを開発する時に必要なもの
- CUDA ランタイムとはなにか → CUDAを利用するアプリケーションを動かすために必要なもの
- GPUにはなぜドライバーが必要なのか → 専用ハードウェアであるGPUを動かすために必要だから