This video introduces the internals of a Graphics Processing Unit (GPU), which can be an accelerator for general purpose computing, in addition to graphics p...
このビデオでは、OpenCL プログラミングの例として行列の乗算を紹介します。講演者は、行列の行と列を横断できる独立したループを作成するために C コードを作成する方法をデモンストレーションします。作業項目と、それを OpenCL の行列要素にマッピングする方法について説明します。カーネル関数の引数、呼び出し方法、本体について説明し、カーネル実装について説明します。スピーカーは、インデックスを計算するために行番号とインデックス番号を使用して入力行列を 1 次元配列に格納する方法を示します。最終的に、カーネル関数はドット積を計算して、出力行列の要素を生成します。物理メモリに行列を格納するための線形アプローチが強調されます。
00:00:00 このセクションでは、OpenCL プログラミングの例として行列の乗算について学びます。行列乗算は、多くのさまざまなアプリケーションで使用されている古典的なパワー コンピューティングの例です。この実装には入れ子になったループが必要で、行列 A の列数が行列 B の行数と等しくなければならないという要件があります。これは、行列 C の結果の各要素が A の行ベクトルのドット積であるためです。演算を実装するために C コードがどのように記述されているか、またループがどのように独立して動作するかがわかり、結果として得られる行列 C のすべての行または列をランダムな方法で処理できるようになります。
00:05:00 このセクションでは、作業項目の概念が導入され、作業項目が OpenCL の行列要素にどのようにマップされるかについて説明します。作業項目は、独立して計算される行列の出力要素ごとに作成できるため、2 次元範囲の作業項目にマッピングできます。 OpenCL での行列乗算のカーネル実装についても説明します。カーネル関数の引数と main 関数からそれを呼び出す方法が説明され、カーネル関数の本体が示されます。カーネル関数は、行ベクトルと列ベクトルのドット積を計算して、出力行列の各要素を計算します。
00:10:00 このセクションでは、講演者が OpenCL プログラミング言語を使用して行列を乗算するプロセスを説明します。主なアイデアは、行番号とインデックス番号を使用して 2 次元入力行列を 1 次元配列に格納し、ドット積演算を実行するための適切な要素を見つけるための適切なインデックスを計算することです。カーネル関数は sum 変数を 0 で初期化し、A の行ベクトルと B の列ベクトルを反復処理して内積を計算し、最終的にその結果を C の対応する要素に割り当てます。これらの手順は、行番号と列番号を使用して次のことを行う方法を示しています。線形方式でインデックスを計算します。これは、行列を物理メモリに保存するために不可欠です。
This video explains how to do matrix multiplication in OpenCL. Note the thinking process to break a large problem into smaller partitions, and compute the sm...
00:05:00 このセクションでは、プラットフォームとデバイスを作成し、コンテキストを作成し、OpenCL プログラミング用のコマンド キューを作成するための環境をセットアップする方法についてビデオで説明します。これにはプラットフォーム ID の取得が含まれます。これにより、プログラマは利用可能なプラットフォームの数を決定し、ストレージ用のスペースを割り当てることができます。このビデオでは、プラットフォーム内でデバイスを選択する方法、選択したデバイスに関する情報を取得する方法、適切な引数を設定する方法、およびこれらの引数の値をカーネル関数に渡してカーネルをインスタンス化する方法について説明します。最後に、カーネルが完了したら、結果をデバイスからホストのメモリにコピーして戻す方法を示します。
00:10:00 このセクションでは、ビデオで OpenCL コンテキストの作成方法と、コマンド キューやバッファなどの OpenCL 操作に必要なすべてのリソースを結び付ける際のコンテキスト オブジェクトの重要性について説明します。このトランスクリプトでは、読み取り専用および書き込み専用バッファーを作成する方法と、CL インクおよび CL in Q 書き込みバッファー コマンドを使用してホストとデバイス間でデータをコピーする方法について概要を説明します。使用される例は行列の乗算です。行列 A と B が入力であり、行列 C が出力です。このビデオでは、API 呼び出しが成功したかどうかを確認することの重要性を強調しています。
00:15:00 このセクションでは、出力行列である行列 C にスペースを割り当てる方法をスピーカーが説明します。彼らは、バッファ C が CL メモリとして宣言されており、デバイスが結果をバッファ C に書き込むことができると述べています。ただし、ホスト側からこのバッファを読み取ることは禁止されません。これは、デバイスから結果を取得し、結果の行列をホスト内のどこかにコピーするために必要です。スピーカーは、コンテキスト、フラグ、サイズ、ホスト ポインター、戻り値の 5 つの引数を取るバッファー API の完全な定義を示します。
「OpenCL 行列乗算デモ」ビデオでは、OpenCL フレームワークを使用して行列乗算のサンプルを実行するプロセスを説明しています。ホスト側のメイン C プログラム、カーネル プログラム、メイクファイルなどの複数のソース コード ファイルが含まれています。このビデオでは、OpenCL フレームワークのさまざまな側面、プラットフォーム ID とデバイス ID の取得、OpenCL コンテキスト、プログラムとカーネル オブジェクトの作成、ホストのバッファ管理、デバイス上のバッファの作成と初期化について説明します。発表者は、ドット積演算を実行するサンプル カーネルと、AMD Radeon pro 575 計算エンジンでの最終結果のデモも示します。
00:00:00 このセクションでは、講演者が OpenCL を介して行列乗算の例を実行する方法を説明します。この例は、ホスト側プログラムとしてのメイン C プログラム、my kernel CL という名前のカーネル プログラム、プロジェクトのコンパイルに役立つメイクファイルなど、いくつかのソース コード ファイルで構成されています。メイン プログラムには、標準ライブラリ、OpenCL フレームワークのマクロ定義、入力行列 (行列 A と行列 B) の宣言、デバイス名、プラットフォーム識別子、デバイスの数が含まれています。講演者は、コンテキスト、プログラム、カーネル、ソース コードの読み取りとコンパイルなど、OpenCL フレームワークのさまざまな側面についても説明します。さらに、講演者は、コード内のマトリックスの次元だけでなく、プラットフォームとデバイスの ID の重要性についても説明します。
00:05:00 このセクションでは、講演者がプラットフォームとデバイスの ID を取得し、行列乗算のデモ用の OpenCL コンテキストを作成するプロセスについて説明します。これらは、プラットフォーム数がどのように返され、プラットフォーム ID を格納するために配列が割り当てられるかを説明します。また、選択した特定のタイプのデバイス ID を取得し、その名前をクエリする方法も示します。このビデオでは、各デバイスのコマンド キューを作成する方法と、OpenCL プログラムをコンパイルする方法を示します。さらに、app open を使用してカーネル ソース コード ファイルを開いてプログラムをコンパイルする方法についても説明します。
00:10:00 このセクションでは、OpenCL カーネル ソース コードからプログラム オブジェクトを作成する方法をビデオで説明します。このプロセスはプラットフォームごとに異なります。ネイティブ OpenCL サポートを備えた Mac OS では、ソース コードを使用してプログラム オブジェクトを作成できます。ただし、アルテラ FPGA OpenCL SDK では、プログラム オブジェクトを作成するには、カーネルをコンパイルし、アルテラ固有の API を使用してそのコンパイルのバイナリ結果からカーネルを作成する必要があります。プログラム オブジェクトが作成されたら、ビデオでカーネル プログラムを構築し、カーネル オブジェクトを作成する方法が示されます。最後に、ビデオはホスト側のバッファ管理に入り、結果の行列 C を保存するためにバッファが割り当てられます。
00:15:00 このセクションでは、OpenCL を使用して行列乗算のためにデバイス側でバッファを作成および初期化する方法を発表者が説明します。さらに、グローバルおよびローカルのワークグループ サイズの設定など、カーネル引数を適切に設定する方法を示します。 CL の戻り値をチェックすることの重要性も強調されています。次に、発表者は結果をホスト メモリに読み取り、ホストと OpenCL に割り当てられたリソースを解放する方法を実演します。最後に、グローバル ID の取得を使用して行列の幅を反復処理し、ドット積演算を実行し、結果を行列 C の対応する要素に格納するサンプル カーネルを示します。
00:20:00 このセクションでは、講演者がメインの C プログラムと Mike Rinder CL プログラムの構築について説明します。ホスト側プログラムをビルドするには、ユーザーは単一の C プログラム ファイルをコンパイルする必要があります。カーネルについては、GPU コンパイラーを使用して、CL を認識している Micra を GPU バイナリにコンパイルできます。ホスト側とデバイス側の両方でプログラムをビルドすると、ユーザーは「main」という名前の実行可能ファイルと、さまざまな GPU バージョンで使用できるさまざまなバイナリを入手できるようになります。このファイルを実行すると、講演者は、すべての要素に 8 つの点を含む C 行列の初期値を持つ AMD Radeon pro 575 計算エンジンを備えた OpenCL プラットフォームを表示します。
6. スーパースカラーと VLIW
6. スーパースカラーと VLIW
このビデオでは、プロセッサがスーパースカラー実行を使用してバイナリ命令間の並列性を検出および抽出し、パフォーマンスを向上させる方法を説明します。ここでは、命令間に依存関係がない場合など、命令を同時に実行できるインスタンスを特定する際の制御ロジックの重要性について説明します。このビデオでは、スーパースカラと VLIW という 2 つのプロセッサ設計例も紹介されています。後者は依存関係の検出の責任をコンパイラに移し、並列実行される長い命令ワードを生成します。 VLIW は実行時チェックを軽減しますが、長い命令ワード内の未使用のスポットにより実行ユニットに無駄が生じる可能性があります。
7. SIMD とハードウェアのマルチスレッド化
7. SIMD とハードウェアのマルチスレッド化
このビデオでは、並列処理の課題に対処する 2 つの方法、単一命令複数データ (SIMD) とハードウェア マルチスレッド (SMT) について説明しています。 SIMD を使用すると、ハードウェア命令を複数のデータ要素に対して並行して実行できるため、スケジューリングとデコード ロジックが簡素化されます。 SMT は、独立した命令ストリームを同時に実行することでスレッド レベルの並列処理を利用し、追加のレジスタ ファイルと慎重なキャッシュ共有を要求します。このビデオでは、タイム スライス スレッド スケジューリングの実装についても説明しています。タイム スライス スレッド スケジューリングでは、スレッドがラウンドロビン方式でプロセッサのデータ パスを順番に占有し、待ち時間が短縮され、複数のスレッドがコンピューティング ユニットとメモリ システムに同時にアクセスできるようになります。最終的に、プロセッサーは必要な数のスレッドに対応できますが、シングルスレッド プロセッサーではパフォーマンスの向上はそれほど大きくない可能性があります。
8. マルチコアプロセッサアーキテクチャ
8. マルチコアプロセッサアーキテクチャ
このビデオでは、マルチコア プロセッサのアーキテクチャと、各コアが独自のパイプラインとデータ キャッシュを持ちながら、複数のコアが独立して動作し、一部のコンポーネントを共有するなどの利点について説明します。時間的および空間的局所性を利用する複数レベルのキャッシュを使用して、マイクロプロセッサとメモリ アクセスの間の速度ギャップを埋める際のキャッシュ階層の重要性が強調されています。このビデオでは、さまざまな機能ユニットとインターフェイスを 1 つのチップに組み合わせてコストとフォーム ファクターを削減するシステム オン チップ設計についても触れています。全体として、このビデオは、マルチコア プロセッサの設計に伴う複雑さとトレードオフについて有益な紹介を提供します。
9. GPU アーキテクチャ
9. GPU アーキテクチャ
アクセラレーテッド プロセッシング ユニット (APU) は、低電力コアと GPU ユニットがすべて同じチップ上にある異種プロセッサです。 GPU には、命令でスケジュールできる多数のシェーダ コアがあり、そのキャッシュは一般に非コヒーレントであるため、設計が簡素化され、多くのコアが同時に動作する場合にはるかに高いパフォーマンスが可能になります。 AMD と Nvidia は、小型の計算ユニットを利用して複数のデータの同時操作をサポートし、高速なコンテキスト切り替えをサポートするために大きなレジスタ ファイルを備えています。講演者は、GPU アーキテクチャでの制御フローの管理方法、特に無効な結果を生成する可能性のある分岐命令の処理方法についても説明しますが、プロセッサ ベンダーがハードウェアに制御ロジックをすでに提供しているため、プログラマーはこれらの問題についてあまり心配する必要はありません。全体として、GPU は、現代の市場、特に AI と機械学習の分野で、複雑なワークロードによく使われるプロセッサーです。
10. FPGA の内部構造
10. FPGA の内部構造
このビデオでは、フィールド プログラマブル ゲート アレイ (FPGA) のアーキテクチャと機能について説明します。 FPGA はプログラマブル ロジックを備えているため、新しい機能に対応するために再プログラムすることができ、大量の入出力 (I/O) を通じてデータに直接アクセスできます。 FPGA のルックアップ テーブル構造は、論理関数を定義するようにプログラムできる複数レベルのマルチプレクサで構成されます。 FPGA は、カウンタ、シフト レジスタ、ステート マシン、DSP 機能に使用できるプログラマブル レジスタを使用します。チップ上の各長方形のブロックはロジック アレイ ブロック (LAB) を表し、各 LAB には 10 個のアダプティブ ロジック モジュール (ALM) が含まれています。 FPGA は、民生用デバイス、自動車、医療機器、通信および放送などの業界で使用されています。
キャリー ビット、およびレジスタへの入力が前の論理要素からどのように取得されるかについて説明します。
11. GPU システム上の OpenCL メモリ
11. GPU システム上の OpenCL メモリ
インストラクターは、OpenCL メモリの AMD GPU へのマッピング、および GPU システム内のさまざまなメモリ層について説明します。計算デバイスには、複数の SIMD レーン、プライベート レジスタ ファイル、およびプライベート メモリを備えたコアとして機能する計算ユニットへのディレクティブを管理するコマンド プロセッサがあります。カーネル プログラムは、利用可能なすべてのコアの利用を可能にし、メモリ アクセスの待ち時間を短縮する自律型ジョブを提供することを目的としています。講演者はまた、計算とメモリ軸の移動の間の比率を指す演算強度の概念と、GPU のメモリ帯域幅が制限要因となるのを避けるためにどのように高くすべきかについても言及しています。
12. OpenCL の例: 行列の乗算
12. OpenCL の例: 行列の乗算
このビデオでは、OpenCL プログラミングの例として行列の乗算を紹介します。講演者は、行列の行と列を横断できる独立したループを作成するために C コードを作成する方法をデモンストレーションします。作業項目と、それを OpenCL の行列要素にマッピングする方法について説明します。カーネル関数の引数、呼び出し方法、本体について説明し、カーネル実装について説明します。スピーカーは、インデックスを計算するために行番号とインデックス番号を使用して入力行列を 1 次元配列に格納する方法を示します。最終的に、カーネル関数はドット積を計算して、出力行列の要素を生成します。物理メモリに行列を格納するための線形アプローチが強調されます。
13. OpenCLプログラムの構造(その1)
13. OpenCLプログラムの構造(その1)
ビデオ「OpenCL プログラムの構造 (part1)」では、OpenCL アプリケーションを構築するプロセスを説明します。プログラムはまず OpenCL プラットフォームにクエリを実行してそのリソースを理解し、OpenCL コンテキストとコマンド キューを作成する必要があります。次に、ホストとデバイスのメモリ間のデータ交換用にバッファが作成され、カーネル プログラムがデバイス上で実行できるバイナリにコンパイルされます。このビデオでは、読み取り専用および書き込み専用のバッファーの作成方法、出力行列用のスペースの割り当て方法、および結果をホストにコピーして戻す方法について説明します。 API 呼び出しが正常に実行されたかどうかを確認することの重要性が強調されています。
14. OpenCLプログラムの構造(その2)
14. OpenCLプログラムの構造(その2)
OpenCL プログラミングの 3 番目のステップにはカーネル コンパイルが含まれますが、FPGA デバイスの場合はオフラインで実行されるため異なります。ソースと C TX を含む CL 作成プログラムを使用してプログラムを作成し、続いて CL ビルド プログラムを使用してプログラムをバイナリにビルドします。適切なエントリ ポイントを使用して正しいカーネル関数が選択され、カーネル引数は正しいポインタを持つ CL set kernel argument を使用して初期化される必要があります。講演者は、行列の乗算で引数を適切に設定する方法について詳しく説明します。次に、ローカルおよびグローバルのワークグループ サイズの設定、カーネルの実行、およびキュー バッファー API の CL を使用した結果の取得について説明します。最後に、講演者は OpenCL プログラミングにおける出来事について簡単に言及します。
15. OpenCL行列乗算のデモ
15. OpenCL行列乗算のデモ
「OpenCL 行列乗算デモ」ビデオでは、OpenCL フレームワークを使用して行列乗算のサンプルを実行するプロセスを説明しています。ホスト側のメイン C プログラム、カーネル プログラム、メイクファイルなどの複数のソース コード ファイルが含まれています。このビデオでは、OpenCL フレームワークのさまざまな側面、プラットフォーム ID とデバイス ID の取得、OpenCL コンテキスト、プログラムとカーネル オブジェクトの作成、ホストのバッファ管理、デバイス上のバッファの作成と初期化について説明します。発表者は、ドット積演算を実行するサンプル カーネルと、AMD Radeon pro 575 計算エンジンでの最終結果のデモも示します。