CUDAとは? GPUを画像処理から汎用計算へ開いた仕組み

CPUとプログラムからGPUの多数の並列計算へ仕事を渡し、科学計算やデータ分析やAIへ用途が広がる様子 AI半導体・GPU
CUDAはGPUを別の部品へ変えるものではなく、GPUの並列計算を幅広い用途から使うためのソフトウェア基盤です。
学習レベル 初級

第28話で「ゲームがGPUの並列処理を育てた」と知った人が、CUDAによって何が変わったのかを理解する記事です。コードを書いた経験がなくても読めます。

CUDA(クーダ)は、NVIDIAが開発した並列コンピューティングのプラットフォームとプログラミングモデルです。GPUの計算能力を、画面描画だけでなく科学計算やデータ処理などへ使いやすくしました。CUDAはGPUそのものでも、AI専用の言語でもありません。

先に結論

変わる前GPUの高い計算力があっても、画像以外の処理へ使うには専門的な工夫が多かった。
CUDAの役割計算する部分をGPUへ渡し、多数の処理へ分けて実行する共通の考え方と道具を用意した。
変わった後研究・シミュレーション・データ処理、そして後のAIへ用途が広がった。
CPUとプログラムからGPUの多数の並列計算へ仕事を渡し、科学計算やデータ分析やAIへ用途が広がる様子
CUDAはGPUを別の部品へ変えるものではなく、GPUの並列計算を幅広い用途から使うためのソフトウェア基盤です。

CUDAで何が変わった?

GPUは、3Dグラフィックスの大量計算によって発達しました。しかし、計算能力が高いことと、研究者や開発者が自由な計算へ使いやすいことは別です。初期のGPUで画像以外の処理を行うには、計算を描画処理に見せるなど、グラフィックス固有の知識が必要でした。

NVIDIAは2006年にCUDAを発表しました。公式のCUDA Programming GuideはCUDAを「汎用並列コンピューティングのプラットフォームとプログラミングモデル」と説明しています。開発者は、CPU側で全体を進めながら、並列化しやすい計算をGPUへ渡せるようになりました。

問題を分ける
GPUへデータを渡す
多数の処理を並列実行
結果をCPU側へ戻す

CUDAが開いたのは、「画像を描くGPU」から「プログラムで計算へ使えるGPU」への入口です。

CPUとGPUはどう協力する?

CUDAのプログラムは、GPUだけで完結するとは限りません。公式ガイドでは、CPUとCPU側のメモリをホスト、GPUとGPU側のメモリをデバイスと呼びます。アプリはCPUから始まり、必要なデータをGPUへ渡し、GPUで動く処理を起動し、結果を受け取ります。

CPU側で仕事とデータを準備し、GPUメモリへ送り、多数の並列処理を実行して結果をCPUへ戻すCUDAの流れ
CPUは全体の進行やデータ準備を担い、GPUは並列化しやすい大量計算を担当します。CUDAは両者をつなぐ仕組みを提供します。

ここが誤解されやすい点

CUDAがCPUを不要にするわけではありません。実際の速さは、計算の分け方、CPUとGPUの間で運ぶデータ量、GPUメモリへのアクセスなどを含むシステム全体で決まります。

大量の仕事を「グリッド・ブロック・スレッド」へ分ける

CUDAでは、GPUで実行する関数をカーネルと呼びます。カーネルを起動すると、多数のスレッドが同じ処理の流れを並列に実行します。スレッドはブロックにまとめられ、ブロックはさらにグリッドとして並びます。

大きな計算対象をグリッドから複数のブロックへ分け、各ブロックを多数のスレッドへ細分化するCUDAの階層
大きな問題を独立して進めやすい単位へ分けることで、規模の異なるGPUでも多数の処理を割り当てやすくします。

この階層は、GPU内部の部品名を覚えるためだけのものではありません。「大きな仕事を、互いに依存しすぎない小さな仕事へ分ける」という並列計算の設計を、プログラムから表すための仕組みです。

CUDAは「言語ひとつ」ではなく、道具のまとまり

CUDAは「CUDAというAI専用言語」ではありません。CUDA C++のような言語拡張だけでなく、GPUへ仕事を渡すランタイム、コンパイラ、数値計算ライブラリ、デバッグ・性能分析ツールなどを含む基盤です。公式ドキュメントでも、C++以外の言語やAPIから利用できることが説明されています。

GPUハードウェアの上にCUDAのプログラミングモデルと実行基盤、ライブラリと開発ツール、各分野のアプリが積み重なる構造
ハードウェアだけでなく、プログラミングモデル、ライブラリ、開発ツールがそろったことで、GPU計算を別の分野へ持ち込みやすくなりました。
名称役割誤解しないための一言
GPU多数の処理を並列に実行するハードウェアCUDAと同じものではない
CUDANVIDIA GPUを計算へ使うプラットフォームとプログラミングモデルAIだけの仕組みではない
CUDA Toolkitコンパイラ、ライブラリ、開発・分析ツールなどの集合GPUを購入しただけで自動的に処理が速くなるわけではない
Tensor Core行列の積和演算を効率よく進めるGPU内の演算器CUDAとは役割が違う。次回のテーマ

なぜAIへつながったのか

AIの学習や推論では、行列を使った計算を大量に繰り返します。こうした処理には、GPUの並列計算を生かしやすい部分があります。CUDAとそのライブラリが整ったことで、研究者やフレームワーク開発者はGPUを計算基盤として利用しやすくなりました。

ただし、CUDAだけで現在のAIが生まれたわけではありません。アルゴリズム、データ、研究成果、GPUハードウェア、メモリ、ネットワーク、ライブラリが積み重なって現在のAI基盤になっています。普段PyTorchなどを使う人は、CUDAを直接書かなくても、その下でCUDA対応ライブラリの恩恵を受けることがあります。

CUDAなら何でも速くなる?

分けにくい処理前の計算結果を待つ必要が多い処理は、大量並列の強みを出しにくい。
データ移動が多い処理計算より転送時間が支配的になると、GPUを使う効果が小さくなる。
ソフトウェア対応処理をCUDA向けに実装するか、CUDA対応ライブラリを使う必要がある。

また、CUDAはNVIDIAのプラットフォームです。ほかのメーカーのGPUやアクセラレータには、別のプログラミング環境があります。用途、既存ソフトウェア、性能、電力、費用を含めて選ぶ必要があります。

CUDAを支える仕事

CUDAに関わる仕事は、カーネルを書く開発者だけではありません。GPUの回路設計、コンパイラやライブラリ開発、性能分析、データセンター運用、冷却、先端パッケージ、HBM、品質・検査まで多くの役割がつながります。

自分に近い仕事の入口を探す

ソフトウェア、設計、製造、装置、品質など、どの方向から学ぶか迷う方は、匿名・回答非保存の半導体10問仕事ナビ βで候補を整理できます。診断結果は仕事の適性を断定するものではなく、次に読むテーマを選ぶための目安です。

CUDAについてよくある質問

CUDAはプログラミング言語ですか?

CUDAは言語ひとつの名前ではなく、並列コンピューティングのプラットフォームとプログラミングモデルです。CUDA C++のほか、ライブラリやAPIを通じて複数の言語・開発環境から利用できます。

CUDAはAI専用ですか?

いいえ。科学技術計算、シミュレーション、画像処理、データ分析など幅広い計算に使われます。AIはCUDAが利用される重要な分野の一つです。

CUDAを使うにはNVIDIAのGPUが必要ですか?

CUDAコードをGPUで実行するには、対応するNVIDIA GPUとドライバなどの環境が必要です。別メーカーのGPUには別の開発基盤があります。

Tensor CoreとCUDA Coreは同じですか?

同じではありません。Tensor Coreは行列の積和演算を効率よく行う演算器です。CUDAは、それらを含むNVIDIA GPUの計算機能をソフトウェアから利用するための基盤です。Tensor Coreの仕組みは次回、行列計算との関係から説明します。

まとめ

  1. CUDAはGPUではなく、NVIDIAの並列コンピューティング基盤
  2. CPUとGPUを協力させ、計算を多数のスレッドへ分けて実行しやすくした
  3. 共通のプログラミングモデル、ライブラリ、ツールがGPUの用途を研究やAIへ広げた
  4. 次の進化を理解する鍵は、行列計算を効率化するTensor Core

参考資料

↑ 先頭
タイトルとURLをコピーしました