paint-brush
CPU と GPU の機能について、わかりやすい概要を説明します。@venkat2811
779 測定値
779 測定値

CPU と GPU の機能について、わかりやすい概要を説明します。

Venkat Raman15m2024/04/23
Read on Terminal Reader

長すぎる; 読むには

この記事では、並列コンピューティング タスクの処理における CPU と GPU の根本的な違いについて詳しく説明し、フォン ノイマン アーキテクチャ、ハイパースレッディング、命令パイプライン化などの概念を取り上げます。また、グラフィックス プロセッサからディープラーニング アルゴリズムを高速化する強力なツールへと進化した GPU について説明します。
featured image - CPU と GPU の機能について、わかりやすい概要を説明します。
Venkat Raman HackerNoon profile picture

The Dieで何が起こるかをわかりやすく概説

この記事では、GPU がグラフィックス、ニューラル ネットワーク、ディープラーニングのタスクに優れ、CPU がさまざまなシーケンシャルで複雑な汎用コンピューティング タスクに優れている理由を理解するために、基本的な低レベルの詳細をいくつか説明します。この記事では、調査してもう少し詳しく理解する必要があったトピックがいくつかありましたが、そのうちのいくつかについては簡単に触れるだけにします。CPU と GPU の処理の絶対的な基本だけに焦点を当てるために意図的に行っています。


フォン・ノイマン・アーキテクチャ

以前のコンピュータは専用デバイスでした。ハードウェア回路と論理ゲートは、特定の一連の動作を実行するようにプログラムされていました。何か新しいことをしなければならない場合は、回路の配線を変更する必要がありました。「何か新しいこと」は、2 つの異なる方程式の数学的計算を実行するという単純なことかもしれません。第二次世界大戦中、アラン チューリングはエニグマ マシンを破るプログラム可能なマシンの開発に取り組んでおり、後に「チューリング マシン」の論文を発表しました。同じ頃、ジョン フォン ノイマンと他の研究者も、基本的に次のことを提案するアイデアに取り組んでいました。


  • 命令とデータは共有メモリ(ストアド プログラム)に保存する必要があります。
  • 処理ユニットとメモリユニットは分離する必要があります。
  • 制御ユニットは、メモリからデータと命令を読み取り、処理ユニットを使用して計算を実行します。


ボトルネック

  • 処理ボトルネック - 処理ユニット (物理ロジック ゲート) には、一度に 1 つの命令とそのオペランドしか存在できません。命令は、次々に順番に実行されます。長年にわたり、プロセッサの小型化、クロック サイクルの高速化、コア数の増加に重点が置かれ、改善されてきました。
  • メモリのボトルネック - プロセッサがどんどん高速化するにつれて、メモリと処理装置の間で転送できるデータの速度と量がボトルネックになりました。メモリは CPU よりも数桁遅いです。長年にわたり、メモリの高密度化と小型化に重点が置かれ、改善されてきました。


CPU

コンピュータ内のすべてがバイナリであることは周知の事実です。文字列、画像、ビデオ、オーディオ、OS、アプリケーション プログラムなどはすべて 1 と 0 で表されます。CPU アーキテクチャ (RISC、CISC など) の仕様には命令セット (x86、x86-64、ARM など) があり、CPU メーカーはこれに準拠する必要があり、OS がハードウェアとインターフェイスするために使用できます。


データを含む OS およびアプリケーション プログラムは、CPU で処理するために命令セットとバイナリ データに変換されます。チップ レベルでは、処理はトランジスタとロジック ゲートで行われます。2 つの数値を加算するプログラムを実行すると、加算 (「処理」) はプロセッサ内のロジック ゲートで行われます。


フォン ノイマン アーキテクチャの CPU では、2 つの数値を加算する場合、回路内の 2 つの数値に対して 1 つの加算命令が実行されます。そのミリ秒のほんの一部では、処理ユニットの (実行) コアで加算命令のみが実行されます。この詳細が常に私を魅了してきました。


現代のCPUのコア

CPU コアのコンポーネントの概要 (シングル HW スレッド)


上の図のコンポーネントは一目瞭然です。詳細と詳しい説明については、この優れた記事を参照してください。最新の CPU では、1 つの物理コアに複数の整数 ALU、浮動小数点 ALU などを含めることができます。繰り返しますが、これらのユニットは物理的なロジック ゲートです。

GPU をより深く理解するには、CPU コアの「ハードウェア スレッド」を理解する必要があります。ハードウェア スレッドは、CPU コアの実行ユニットで、CPU クロック サイクルごとに実行できるコンピューティングの単位ですこれは、コアで実行できる作業の最小単位を表します。


命令サイクル

パイプラインやスーパースケーラーを使用せずに、CPU コア上で単一のハードウェア スレッドで実行されるプロセス


上の図は、CPU 命令サイクル/マシン サイクルを示しています。これは、CPU が 1 つの命令を実行するために実行する一連のステップです (例: c=a+b)。


  • フェッチ:プログラム カウンター (CPU コア内の特別なレジスタ) は、どの命令をフェッチする必要があるかを追跡します。命令はフェッチされ、命令レジスタに格納されます。単純な操作の場合、対応するデータもフェッチされます。

  • デコード:命令をデコードして演算子とオペランドを確認します。

  • 実行:指定された操作に基づいて、適切な処理ユニットが選択され、実行されます。

  • メモリ アクセス:命令が複雑であるか、追加のデータが必要な場合 (いくつかの要因が考えられます)、実行前にメモリ アクセスが行われます (上の図では、簡略化のため無視されています)。複雑な命令の場合、初期データはコンピューティング ユニットのデータ レジスタで使用できますが、命令を完全に実行するには、L1 および L2 キャッシュからのデータ アクセスが必要です。つまり、コンピューティング ユニットが実行されるまで少し待機時間が発生し、待機時間中もハードウェア スレッドがコンピューティング ユニットを保持したままになります。

  • 書き戻し:実行によって出力が生成される場合 (例: c=a+b)、出力はレジスタ/キャッシュ/メモリに書き戻されます。 (上記の図や記事の後半では、簡潔にするために無視されています)


上の図では、t2 でのみ計算が行われています。残りの時間、コアはアイドル状態です (作業は行われません)。

最新の CPU には、基本的にクロック サイクルごとに (フェッチ、デコード、実行) ステップを同時に実行できるようにする HW コンポーネントがあります。

単一のハードウェア スレッドがクロック サイクルごとに計算を実行できるようになりました。これを命令パイプラインと呼びます。


フェッチ、デコード、メモリ アクセス、およびライト バックは、CPU 内の他のコンポーネントによって実行されます。適切な言葉がないため、これらは「パイプライン スレッド」と呼ばれます。パイプライン スレッドは、命令サイクルの実行段階にあるときにハードウェア スレッドになります。


パイプラインを使用して、CPU コア上で単一のハードウェア スレッドで実行されるプロセス


ご覧のとおり、t2 から毎サイクルで計算出力が得られます。以前は、3 サイクルに 1 回計算出力が得られていました。パイプライン化により、計算スループットが向上します。これは、フォン ノイマン アーキテクチャで処理のボトルネックを管理する手法の 1 つです。アウトオブオーダー実行、分岐予測、投機的実行などの他の最適化もあります。

ハイパースレッディング

これは、CPU について最後に議論したい概念です。この概念を最後に、GPU について説明しましょう。クロック速度が上昇するにつれて、プロセッサも高速化され、効率も向上しました。アプリケーション (命令セット) の複雑さが増すにつれて、CPU の計算コアは十分に活用されなくなり、メモリ アクセスの待機に多くの時間を費やすようになりました。


つまり、メモリのボトルネックが発生していることがわかります。コンピューティング ユニットはメモリ アクセスに時間を費やしており、有用な作業は何も行っていません。メモリは CPU よりも数桁遅く、その差はすぐには縮まりそうにありません。アイデアは、単一の CPU コアのいくつかのユニットでメモリ帯域幅を増やし、メモリ アクセスを待機しているときにコンピューティング ユニットを利用できるようにデータを準備しておくというものでした。


ハイパースレッディングは、2002 年に Intel の Xeon および Pentium 4 プロセッサで利用可能になりました。ハイパースレッディング以前は、コアごとに 1 つのハードウェア スレッドしかありませんでした。ハイパースレッディングを使用すると、コアごとに 2 つのハードウェア スレッドが存在します。これは何を意味しますか? 一部のレジスタ、プログラム カウンター、フェッチ ユニット、デコード ユニットなどの処理回路が重複します。

2 つの HW スレッド (ハイパースレッディング) を備えた CPU コア


上の図は、ハイパースレッディング機能を備えた CPU コアの新しい回路要素を示しています。これは、1 つの物理コアがオペレーティング システムから 2 つのコアとして見える仕組みです。ハイパースレッディング機能が有効になっている 4 コア プロセッサを使用している場合、OS からは 8 つのコアとして見えます。L1 - L3 キャッシュ サイズは、追加のレジスタに対応するために増加します。実行ユニットは共有されることに注意してください。


2 つのプロセス、2 つのハードウェア スレッドを備えた CPU コアで実行され、パイプライン化されている


プロセス P1 と P2 が a=b+c、d=e+f を実行していると仮定します。これらは、HW スレッド 1 と 2 により、1 クロック サイクルで同時に実行できます。前述のように、単一の HW スレッドでは、これは不可能です。ここでは、ハードウェア スレッドを追加してコア内のメモリ帯域幅を増やし、処理ユニットを効率的に利用できるようにします。これにより、コンピューティングの同時実行性が向上します。


いくつかの興味深いシナリオ:

  • CPU には整数 ALU が 1 つだけあります。HW スレッド 1 または HW スレッド 2 は 1 クロック サイクル待機し、次のサイクルで計算を続行する必要があります。
  • CPU には 1 つの整数 ALU と 1 つの浮動小数点 ALU があります。HW スレッド 1 と HW スレッド 2 はそれぞれ ALU と FPU を使用して同時に加算を実行できます。
  • 使用可能なすべての ALU が HW スレッド 1 によって使用されています。HW スレッド 2 は ALU が使用可能になるまで待機する必要があります。(上記の加算の例には当てはまりませんが、他の命令では発生する可能性があります)。

CPU が従来のデスクトップ/サーバー コンピューティングに適しているのはなぜでしょうか?

  • 高いクロック速度 - GPU のクロック速度よりも高速です。この高速性と命令パイプラインを組み合わせることで、CPU は連続タスクに非常に優れています。レイテンシが最適化されています。
  • 多様なアプリケーションと計算ニーズ - パーソナル コンピューターとサーバーには、幅広いアプリケーションと計算ニーズがあります。このため、命令セットは複雑になります。CPU は、さまざまなことに優れている必要があります。
  • マルチタスクとマルチプロセス - コンピューターには非常に多くのアプリがあるため、CPU のワークロードにはコンテキストの切り替えが必要です。キャッシュ システムとメモリ アクセスは、これをサポートするように設定されています。プロセスが CPU ハードウェア スレッドでスケジュールされると、必要なデータがすべて準備され、計算命令が 1 つずつ迅速に実行されます。

CPUの欠点

この記事をチェックして、 Colab ノートブックも試してみてください。行列乗算が並列化可能なタスクであること、並列コンピューティング コアによって計算が高速化される仕組みがわかります。

  • 順次タスクは非常に得意ですが、並列タスクは得意ではありません。
  • 複雑な命令セットと複雑なメモリ アクセス パターン。
  • CPUは、計算に加えて、コンテキストの切り替えや制御ユニットの活動にも多くのエネルギーを費やします。

重要なポイント

  • 命令パイプラインにより計算スループットが向上します。
  • メモリ帯域幅を増やすと、コンピューティングの同時実行性が向上します。
  • CPU は、シーケンシャル タスク (レイテンシに最適化) に適しています。大量のコンピューティング ユニットとハードウェア スレッドが必要なため、超並列タスクには適していませんが、これらは利用できません (スループットに最適化されていません)。CPU は汎用コンピューティング用に構築されており、命令セットが複雑であるため、これらは利用できません。


GPU

コンピューティング能力が増加するにつれて、グラフィックス処理の需要も増加しました。UI レンダリングやゲームなどのタスクでは並列処理が必要なため、回路レベルで多数の ALU と FPU が必要になります。シーケンシャル タスク用に設計された CPU では、これらの並列ワークロードを効果的に処理できませんでした。そのため、グラフィックス タスクでの並列処理の需要を満たすために GPU が開発され、後にディープラーニング アルゴリズムの高速化に採用される道が開かれました。


強くお勧めします:

  • ビデオ ゲームのレンダリングに関係する並列タスクについて説明するこのご覧ください。
  • このブログ投稿を読んで、トランスフォーマーに関係する並列タスクを理解してください。CNN や RNN などの他のディープラーニング アーキテクチャもあります。LLM が世界を席巻しているため、トランスフォーマー タスクに必要な行列乗算の並列処理を高レベルで理解しておくと、この投稿の残りの部分を理解する上で役立ちます。(後ほど、トランスフォーマーを完全に理解し、小さな GPT モデルのトランスフォーマー レイヤーで何が起こるかについて、わかりやすい概要を共有する予定です。)

CPU と GPU の仕様例

CPU と GPU のコア、ハードウェア スレッド、クロック速度、メモリ帯域幅、オンチップ メモリは大きく異なります。例:

  • Intel Xeon 8280 には次の機能があります:
    • ベース2700MHz、ターボ時4000MHz
    • 28 コア、56 ハードウェア スレッド
    • パイプラインスレッド全体: 896 - 56
    • L3 キャッシュ: 38.5 MB (すべてのコアで共有) L2 キャッシュ: 28.0 MB (コア間で分割) L1 キャッシュ: 1.375 MB (コア間で分割)
    • レジスターサイズは公開されていません
    • 最大メモリ: 1TB DDR4、2933 MHz、6 チャネル
    • 最大メモリ帯域幅: 131 GB/秒
    • ピーク FP64 パフォーマンス = 4.0 GHz 2 AVX-512 ユニットクロック サイクルあたり AVX-512 ユニットあたり 8 回の演算 * 28 コア = ~2.8 TFLOPs [次を使用して導出: ピーク FP64 パフォーマンス = (最大ターボ周波数) (AVX-512 ユニットの数) (クロック サイクルあたりの AVX-512 ユニットあたりの演算数) * (コアの数)]
      • 汎用コンピューティングのピーク パフォーマンスを得ることは非常に主観的なため、この数値は GPU との比較に使用されます。この数値は理論上の最大制限であり、FP64 回路が最大限に使用されていることを意味します。


  • Nvidia A100 80GB SXM には次の機能があります:
    • 1065 MHz ベース、ターボ時 1410 MHz
    • 108 個の SM、SM あたり 64 個の FP32 CUDA コア (SP とも呼ばれる)、SM あたり 4 個の FP64 Tensor コア、SM あたり 68 個のハードウェア スレッド (64 + 4)
      • GPU あたりの合計: 6912 64 FP32 CUDA コア、432 FP 64 Tensor コア、7344 (6912 + 432) ハードウェア スレッド
    • SM あたりのパイプライン スレッド数: 2048 - 68 = 1980 (SM あたり)
    • L2 キャッシュ: 40 MB (すべての SM で共有) L1 キャッシュ: 合計 20.3 MB (SM あたり 192 KB)
    • レジスタサイズ: 27.8 MB (SM あたり 256 KB)
    • 最大 GPU メインメモリ: 80GB HBM2e、1512 MHz
    • 最大 GPU メインメモリ帯域幅: 2.39 TB/s
    • ピーク FP64 パフォーマンス = 19.5 TFLOPs [すべての FP64 Tensor コアのみ使用]。CUDA コアの FP64 のみが使用されている場合、下限値は 9.7 TFLOPs になります。この数値は理論上の最大限度であり、FP64 回路が最大限に使用されていることを意味します。


最新のGPUのコア

CPU で見た用語は、必ずしも GPU にそのまま当てはまるわけではありません。ここでは、コンポーネントとコア NVIDIA A100 GPU について説明します。この記事の調査中に驚いたことの 1 つは、CPU ベンダーがコアの実行ユニットで使用できる ALU、FPU などの数を公開していないことです。NVIDIA はコアの数について非常に透明性が高く、CUDA フレームワークは回路レベルで完全な柔軟性とアクセスを提供します。


最新の CPU と NVIDIA GPU (出典: NVIDIA)


上の GPU の図では、L3 キャッシュがなく、L2 キャッシュが小さく、制御ユニットと L1 キャッシュが小さいながらもかなり多く、処理ユニットも多数あることがわかります。


NVIDIA A100 GPU (出典: NVIDIA)

NVIDIA A100 GPU ストリーミング マルチプロセッサ (CPU コアに相当) 出典: NVIDIA


最初に理解していただくために、上の図の GPU コンポーネントと、それに対応する CPU コンポーネントを示します。私は CUDA プログラミングをしたことがありませんので、CPU コンポーネントと比較すると、最初に理解しやすくなります。CUDA プログラマーはこれをよく理解しています。

  • 複数のストリーミング マルチプロセッサ <> マルチコア CPU
  • ストリーミング マルチプロセッサ (SM) <> CPU コア
  • ストリーミング プロセッサ (SP)/CUDA コア <> CPU コアの実行ユニット内の ALU/FPU
  • Tensor コア (1 つの命令で 4x4 FP64 演算を実行可能) <> 最新の CPU コアの SIMD 実行ユニット (例: AVX-512)
  • ハードウェア スレッド (CUDA または Tensor コアで 1 クロック サイクルで計算を実行する) <> ハードウェア スレッド (実行ユニット (ALU、FPU など) で 1 クロック サイクルで計算を実行する)
  • HBM / VRAM / DRAM / GPU メモリ <> RAM
  • オンチップメモリ/SRAM (レジスタ、L1、L2 キャッシュ) <> オンチップメモリ/SRAM (レジスタ、L1、L2、L3 キャッシュ)
    • 注: SM のレジスタは、コアのレジスタよりも大幅に大きくなります。これは、スレッド数が多いためです。CPU のハイパースレッディングでは、レジスタの数は増えても計算ユニットの数は増えなかったことに注意してください。ここでも同じ原理です。

移動データとメモリ帯域幅

グラフィックスおよびディープラーニングのタスクでは、SIM(D/T) [単一命令マルチデータ/スレッド] タイプの実行が必要です。つまり、単一の命令で大量のデータを読み取って処理します。


CPU の命令パイプラインとハイパースレッディングについて説明しましたが、GPU にもその機能があります。実装方法と動作方法は若干異なりますが、原理は同じです。

GPU スケジューリング (出典: NVIDIA)

CPU とは異なり、GPU (CUDA 経由) はパイプライン スレッド (メモリからデータを取得してメモリ帯域幅を利用する) への直接アクセスを提供します。GPU スケジューラは、最初にコンピューティング ユニット (関連する共有 L1 キャッシュとコンピューティング オペランドを格納するレジスタを含む) を埋めようとし、次に「パイプライン スレッド」がレジスタと HBM にデータをフェッチします。ここでも強調しておきたいのは、CPU アプリ プログラマーはこれについて考えておらず、「パイプライン スレッド」とコアあたりのコンピューティング ユニット数に関する仕様は公開されていないということです。Nvidia はこれらを公開するだけでなく、プログラマーに完全な制御を提供します。


これについては、CUDA プログラミング モデルとモデル サービング最適化手法における「バッチ処理」に関する専用の投稿でさらに詳しく説明し、これがどれほど有益であるかを説明します。


GPU - 高スループット プロセッサ (出典: NVIDIA)


上の図は、CPU と GPU コアでのハードウェア スレッドの実行を示しています。CPU パイプラインの前の「メモリ アクセス」セクションを参照してください。この図は、CPU の複雑なメモリ管理により、この待機時間が L1 キャッシュからレジスタにデータをフェッチするのに十分なほど短く (数クロック サイクル) なっていることを示しています。L3 またはメイン メモリからデータをフェッチする必要がある場合、データがすでにレジスタにある他のスレッド (ハイパー スレッディング セクションで説明しました) が実行ユニットを制御します。


GPU では、オーバーサブスクリプション (パイプライン スレッドとレジスタの数が多い) とシンプルな命令セットのため、実行を保留しているレジスタにはすでに大量のデータが存在します。実行を待機しているこれらのパイプライン スレッドはハードウェア スレッドになり、GPU のパイプライン スレッドは軽量であるため、クロック サイクルごとに実行を実行します。


帯域幅、コンピューティング能力、レイテンシ

オーバーゴールって何ですか?

  • クロック サイクルごとにハードウェア リソース (コンピューティング ユニット) を最大限に活用して、GPU を最大限に活用します。
  • コンピューティング ユニットをビジー状態に保つには、十分なデータを供給する必要があります。

CPU と GPU での行列乗算


これが、小さい行列の行列乗算のレイテンシが CPU と GPU でほぼ同じになる主な理由です。試してみてください

タスクは十分に並列化されている必要があり、データはコンピューティング FLOP とメモリ帯域幅を飽和させるのに十分な大きさである必要があります。 単一のタスクが十分に大きくない場合は、ハードウェアを完全に活用するために、メモリとコンピューティングを飽和させるには、複数のそのようなタスクをパックする必要があります。


計算強度 = FLOP / 帯域幅。つまり、計算ユニットが 1 秒あたりに実行できる作業量と、メモリが 1 秒あたりに提供できるデータ量の比率です。

コンピューティングの強度 (出典: NVIDIA)

上の図では、レイテンシが高くなり、メモリ帯域幅が低くなるにつれて、コンピューティングの強度が増すことがわかります。コンピューティングを最大限に活用するには、この数値をできるだけ小さくする必要があります。そのためには、コンピューティングを迅速に実行できるように、L1 / レジスタにできるだけ多くのデータを保持する必要があります。HBM から単一のデータを取得する場合、単一のデータに対して 100 回の演算を実行しても価値がある操作はほとんどありません。100 回の演算を行わない場合、コンピューティング ユニットはアイドル状態になります。ここで、GPU 内の多数のスレッドとレジスタが役立ちます。L1 / レジスタにできるだけ多くのデータを保持して、コンピューティングの強度を低く抑え、並列コアをビジー状態に維持します。

CUDA コアは 1 つの 1x1 FP64 MMA しか実行できないのに対し、Tensor コアはクロック サイクルごとに 4x4 FP64 MMA 命令を実行できるため、CUDA コアと Tensor コアの計算強度には 4 倍の違いがあります。

重要なポイント

多数のコンピューティング ユニット (CUDA および Tensor コア)、多数のスレッドとレジスタ (サブスクリプション以上)、削減された命令セット、L3 キャッシュなし、HBM (SRAM)、シンプルで高スループットのメモリ アクセス パターン (CPU と比較して - コンテキスト スイッチング、マルチ レイヤー キャッシュ、メモリ ページング、TLB など) は、並列コンピューティング (グラフィックス レンダリング、ディープラーニングなど) において GPU が CPU よりはるかに優れている原則です。


GPUを超えて

GPU は当初、グラフィックス処理タスクを処理するために作成されました。AI 研究者は、CUDA と、CUDA コアを介した強力な並列処理への直接アクセスを活用し始めました。NVIDIA GPU には、テクスチャ処理、レイ トレーシング、ラスター、ポリモーフ エンジンなど (グラフィックス固有の命令セットとしましょう) があります。AI の採用が増えるにつれて、4x4 マトリックス計算 (MMA 命令) に優れたディープラーニング専用の Tensor コアが追加されています。


2017 年以降、NVIDIA は各アーキテクチャの Tensor コアの数を増やしてきました。しかし、これらの GPU はグラフィック処理にも優れています。GPU の命令セットと複雑さははるかに少ないですが、ディープラーニング (特に Transformer アーキテクチャ) に完全に特化しているわけではありません。


FlashAttention 2 は、トランスフォーマー アーキテクチャのソフトウェア レイヤー最適化 (アテンション レイヤーのメモリ アクセス パターンに対する機械的な共感) であり、タスクを 2 倍高速化します。


CPU と GPU に関する基礎原理に基づく深い理解により、トランスフォーマー アクセラレータの必要性が理解できます。トランスフォーマー アクセラレータとは、並列処理のための多数の計算ユニット、削減された命令セット、L1/L2 キャッシュなし、HBM に代わる大容量の DRAM (レジスタ)、トランスフォーマー アーキテクチャのメモリ アクセス パターンに最適化されたメモリ ユニットを備えた専用チップ (トランスフォーマー操作専用の回路) です。結局のところ、LLM は (Web とモバイルに続く) 人間の新しい仲間であり、効率とパフォーマンスのために専用チップが必要です。

いくつかの AI アクセラレータ:

変圧器アクセラレータ:

FPGA ベースのトランスフォーマー アクセラレータ:


参考文献: