GPU 並列コンピューティングを始める

0. 序文

GPU が存在しない前は、基本的にすべてのタスクは CPU に引き渡されました。GPU では両者が分業しており、CPU は論理トランザクション処理とシリアル コンピューティングを担当し、GPU は高度にスレッド化された並列処理タスク (大規模コンピューティング タスク) の実行に重点を置きます。

GPU は独立して動作するコンピューティング プラットフォームではなく、CPU のコプロセッサと見なすことができる CPU と連携する必要があるため、GPU 並列コンピューティングについて話すときは、実際には、次のようなヘテロジニアス コンピューティング アーキテクチャを指します。 CPU+GPU。

NVIDIA と AMD が主要な独立グラフィックス カード メーカーであり、そのグラフィックス カードはそれぞれ N カードと A カードと呼ばれ、N カードは主に CUDA プログラミングをサポートし、A カードは主に OpenCL プログラミングをサポートします。NVIDIA は GPU 業界のリーダーであり、その GPU 製品は市場シェアの約 80% を占めています。

1. CPU と GPU

このセクションでは、ブログ「CPU と GPU の違いは何ですか?」を読むことをお勧めします。

CPU と GPU のアーキテクチャを次の図に示します。

ここに画像の説明を挿入
視覚的には次のように理解できます。

CPU には 25% の ALU (演算ユニット)、25% のコントロール (制御ユニット)、および 50% のキャッシュ (キャッシュ ユニット) があります。

GPU には 90% の ALU (演算ユニット)、5% のコントロール (制御ユニット)、および 5% のキャッシュ (キャッシュ ユニット) があります。

したがって、この 2 つの構造は異なり、その結果、異なる特性が生じます。

CPU: 强控制弱计算,更多资源⽤于缓存
GPU: 强计算弱控制,更多资源⽤于数据计算

したがって、GPU を設計する際には、データ キャッシュやフロー制御ではなく、より多くのトランジスタがデータ処理に使用され、高度な並列コンピューティングを実現できます。

さらに、GPU には次のような利点があります。

  • 浮動小数点演算重視/高いコストパフォーマンス:GPUは設計時に浮動小数点演算に関係のない分岐処理やロジック制御などの複雑な機能を回避または弱体化し、浮動小数点演算に重点を置くため大きなメリットがあります。製造コストに
  • グリーン電力消費率: GPU には軽量のマイクロプロセッサが多数集積されており、クロック周波数が制限されているため、動作によって発生する電力消費は非常に小さくなります。

NVIDIA には 3 つの主流 GPU 製品ラインがあります。

  1. Teals シリーズ: 高性能コンピューティング用に設計されており、高価です。有名な深層学習トレーニング アーティファクト A100、V100、P100 などはすべて Teals シリーズです。
  2. Geforce シリーズ: ゲーム、エンターテイメントに重点を置いており、もちろんディープ ラーニング コンピューティングにも使用できます (Geforce RTX 3060、Geforce RTX 4090 など)。
  3. Quadroシリーズ:グラフィックや画像処理向けに設計されていますが、個人的には使ったことがないので紹介しません。

2. 並列コンピューティングの概要

並列コンピューティングとは、複数のプロセッサを使用して同じ問題を共同で解決することを指し、各プロセッサがコンピューティング タスクの一部を引き受けます。

並列コンピューティングには、時間並列処理 (パイプラインに依存しない作業) と空間並列処理 (行列ブロック計算) が含まれます。これらには、負荷分散と小規模な通信 (CPU と GPU 間の通信) を確保する必要があります。

並列コンピューティングの前提は、アプリケーションの問題にはある程度の並列処理が必要であること、つまり、アプリケーションの問題を並列実行できる複数のサブタスクに分解できることです。

個々の高性能コンピューティング ノードは主に次のように分類されます。

  1. 同種ノード: CPU、Intel Xeon CPU、AMD Opteron CPU など、同じメーカーのハードウェアのみを使用します。
  2. 異種ノード: 異なるメーカーのハードウェアをホスト側とデバイス側に分けて使用し、それぞれ論理演算と浮動小数点計算に重点を置きます。一般的な並列コンピューティングは異種ノードです。

3. CUDA の概要

CUDA (Compute Unified Device Architecture) は、汎用の並列コンピューティング アーキテクチャであり、コンピューティング プラットフォームです。CUDA は 2007 年に NVIDIA によってリリースされました。CUDA はグラフィックス API を必要とせず、開発を容易にするために C に似た言語を使用します。

CUDA は専用の異種プログラミング モデルです。CUDA は C 言語をベースにした拡張機能です。たとえば、device、shared などの一部の修飾子が拡張されています。3.0 からは、C++ プログラミングもサポートされています。

CUDAに基づいて開発されたプログラムコードは、実際に実行される際には次の2種類に分かれます。

  • CPU上で動作するホストコード(ホストコード)
  • GPU上で動作するデバイスコード(デバイスコード)

GPU上で動作するCUDAの並列計算機能はカーネル関数(カーネル関数)と呼ばれ、一連のデバイス側のカーネル関数並列部分とホスト側の直列処理部分でCUDAプログラム全体が構成されます。

カーネルは GPU 上の複数のスレッドで実行されます。CUDA プログラミングについて学ぶのは、主にカーネル関数の記述方法を学ぶことです。

4. CUDAの処理フロー

CUDAの処理の流れは以下の通りです。

  1. システムメモリからGPUメモリにデータをコピーする
  2. CPU 命令が GPU 動作を駆動する
  3. GPUのCUDAコアごとの並列処理
  4. GPU は CUDA 処理の最終結果をシステムのメモリに返します。

CUDA プログラム実行の基本的なフローは次のとおりです。

  1. メモリ空間とビデオメモリ空間の割り当て
  2. メモリ空間を初期化する
  3. 計算対象のデータをホストメモリからGPUメモリにコピー
  4. カーネル計算を実行するカーネル関数として独自のプログラムを作成します。
  5. 計算されたデータをGPUメモリからホストメモリにコピーします
  6. プロセスデータをホストメモリにコピー

おすすめ

転載: blog.csdn.net/qq_43799400/article/details/131216479