取引におけるOpenCL - ページ 5

 

6. スーパースカラーと VLIW



6. スーパースカラーと VLIW

このビデオでは、プロセッサがスーパースカラー実行を使用してバイナリ命令間の並列性を検出および抽出し、パフォーマンスを向上させる方法を説明します。ここでは、命令間に依存関係がない場合など、命令を同時に実行できるインスタンスを特定する際の制御ロジックの重要性について説明します。このビデオでは、スーパースカラと VLIW という 2 つのプロセッサ設計例も紹介されています。後者は依存関係の検出の責任をコンパイラに移し、並列実行される長い命令ワードを生成します。 VLIW は実行時チェックを軽減しますが、長い命令ワード内の未使用のスポットにより実行ユニットに無駄が生じる可能性があります。

  • 00:00:00 このセクションでは、プロセッサがスーパースカラ実行を利用してバイナリ命令を含むプログラムの全体的なパフォーマンスを向上させる方法をビデオで説明します。プログラマーは、プログラムを正しく実行するために適切に設計されたプロセッサーに依存しているため、パフォーマンスを向上させるために命令から並列性を特定して抽出する責任はプロセッサーにあります。このビデオでは、命令間の依存関係グラフの例を示しています。特定の命令間には依存関係がありますが、それらの間に依存関係がないため、プロセッサは他の命令を同時に実行できます。これらのインスタンスを識別し、パフォーマンスを最大化するために可能な限り最も効率的な方法で命令を実行するのは、プロセッサ内の制御ロジックの仕事です。

  • 00:05:00 このセクションでは、ビデオでプロセッサのアーキテクチャ設計の 2 つの例、スーパースカラーと VLIW について説明します。最初の例は、プロセッサが命令間の依存関係を検出し、それに応じて命令をスケジュールして時間を節約する方法を示しています。このビデオでは、分岐命令の投機的実行の可能性も強調しています。 2 番目の例では、依存関係の検出の責任をコンパイラに移す VLIW 設計について説明します。コンパイラは、並列実行可能な複数の命令で構成される長い命令ワードを生成するため、プロセッサの設計が簡素化されます。

  • 00:10:00 このセクションでは、超長命令ワード (VLIW) の概念について説明します。これにより、複数の命令を 1 つの長い命令ワードにパックし、一緒にフェッチおよびデコードできるようになります。 VLIW は、プログラムの実行前に命令を同時に実行する機会を検出する責任をコンパイラーに移し、実行時チェックの必要性を減らします。ただし、長い命令ワード内に空きスポットがある場合、実行ユニットでは依然として無駄が発生する可能性があります。
Superscalar and VLIW
Superscalar and VLIW
  • 2020.05.22
  • www.youtube.com
This video introduces two types of processor architecture: Superscalar and Very Long Instruction Word (VLIW)
 

7. SIMD とハードウェアのマルチスレッド化



7. SIMD とハードウェアのマルチスレッド化

このビデオでは、並列処理の課題に対処する 2 つの方法、単一命令複数データ (SIMD) とハードウェア マルチスレッド (SMT) について説明しています。 SIMD を使用すると、ハードウェア命令を複数のデータ要素に対して並行して実行できるため、スケジューリングとデコード ロジックが簡素化されます。 SMT は、独立した命令ストリームを同時に実行することでスレッド レベルの並列処理を利用し、追加のレジスタ ファイルと慎重なキャッシュ共有を要求します。このビデオでは、タイム スライス スレッド スケジューリングの実装についても説明しています。タイム スライス スレッド スケジューリングでは、スレッドがラウンドロビン方式でプロセッサのデータ パスを順番に占有し、待ち時間が短縮され、複数のスレッドがコンピューティング ユニットとメモリ システムに同時にアクセスできるようになります。最終的に、プロセッサーは必要な数のスレッドに対応できますが、シングルスレッド プロセッサーではパフォーマンスの向上はそれほど大きくない可能性があります。

  • 00:00:00 このセクションでは、単一命令複数データ (SIMD) の概念について説明します。SIMD では、ハードウェア命令を使用して複数のデータ要素に対する操作を並列実行できます。 SIMD は、データのすべての要素に同じ操作を適用するために 1 つの命令のみをスケジュールする必要があるため、スケジューリングとデコード ロジックを簡素化します。 SIMD の使用は、解決する問題に大幅なデータ並列処理が含まれる場合に有益ですが、そうでない場合は効率的な解決策ではない可能性があります。さらに、SIMD とベクトル計算の類似性について説明します。メモリのさまざまな部分に分散しているデータに対してベクトル命令を使用して、仮想演算を実行できます。

  • 00:05:00 このセクションでは、ハードウェア マルチスレッドまたは同時マルチスレッド (SMT) を使用してスレッド レベルの並列処理を活用する方法をビデオで説明します。複数のプログラムまたはスレッドを同じプロセッサ上に配置すると、異なる命令ストリームが互いに独立していれば同時に実行できます。ハードウェア マルチスレッドは、2 つの独立したスレッドから命令を簡単に抽出できるため、大型マシンや単一の CPU に役立ちます。ただし、これには追加のレジスタ ファイルが必要であり、異なるスレッド間でキャッシュを共有する方法を慎重に検討する必要があります。

  • 00:10:00 ビデオのこのセクションでは、プレゼンターがタイム スライス スレッド スケジューリングを実装することで算術論理演算装置 (ALU) をビジー状態に保つ方法について説明します。この方法では、スレッドがラウンドロビン方式でプロセッサのデータ パスを順番に占有することができるため、より多くのスレッドをスケジュールすることで待ち時間が大幅に短縮されます。この方法では、停止したスレッドを待機している間に次の命令を実行することで、複数のスレッドで計算機とメモリ システムを同時に使用できるようになります。最終的には、時間の無駄がなくなり、プロセッサは必要な数のスレッドに対応できるようになります。ただし、シングル スレッド プロセッサ上のシングル スレッドのパフォーマンスは、マルチスレッド プロセッサほど改善されない可能性があります。
SIMD and Hardware Multithreading
SIMD and Hardware Multithreading
  • 2020.05.23
  • www.youtube.com
This video introduces SIMD, Vector Processing and Hardware Multithreading
 

8. マルチコアプロセッサアーキテクチャ



8. マルチコアプロセッサアーキテクチャ

このビデオでは、マルチコア プロセッサのアーキテクチャと、各コアが独自のパイプラインとデータ キャッシュを持ちながら、複数のコアが独立して動作し、一部のコンポーネントを共有するなどの利点について説明します。時間的および空間的局所性を利用する複数レベルのキャッシュを使用して、マイクロプロセッサとメモリ アクセスの間の速度ギャップを埋める際のキャッシュ階層の重要性が強調されています。このビデオでは、さまざまな機能ユニットとインターフェイスを 1 つのチップに組み合わせてコストとフォーム ファクターを削減するシステム オン チップ設計についても触れています。全体として、このビデオは、マルチコア プロセッサの設計に伴う複雑さとトレードオフについて有益な紹介を提供します。

  • 00:00:00 このセクションでは、マルチコア プロセッサと、シングルコア プロセッサに対するマルチコア プロセッサの利点について学びます。マルチコア プロセッサには複数のコアがあり、独立して動作し、命令フェッチ、デコード、浮動小数点スケジューラなどの一部のコンポーネントを共有します。ただし、各コアには独自のパイプラインと独自のレベル 1 データ キャッシュがあります。マルチコア プロセッサには、各キャッシュに格納されているデータがメイン メモリ内のデータと一貫していることを保証するためのキャッシュ コヒーレンス プロトコルが必要です。システム オン チップは、コストとフォーム ファクターを削減するために、複数の要素を同じチップ上の単一のデバイスに結合するもう 1 つの設計オプションです。これには、出荷されていない相互接続を介してチップの残りの部分に接続された、さまざまな専用機能ユニットとインターフェイスが数多くあります。

  • 00:05:00 このセクションでは、講演者がマルチコア プロセッサ アーキテクチャにおけるキャッシュ階層の概念を説明します。キャッシュを使用する主な理由は、異なる周波数で実行され、異なるストレージ容量を持つマイクロプロセッサとメモリ アクセスの間の速度ギャップを埋めることです。レベル 1、レベル 2、およびレベル 3 キャッシュはギャップを埋めるために使用され、それぞれ短期間に少数の命令またはデータにアクセスするか、近くの場所にアクセスするという時間的および空間的局所性を利用します。キャッシュはブロックを使用して編成され、メモリ レベル間で移動されるため、プロセッサは時間的および空間的局所性を利用できます。
Multicore Processor Architecture
Multicore Processor Architecture
  • 2020.05.23
  • www.youtube.com
A brief introduction of multicore processor architecture
 

9. GPU アーキテクチャ



9. GPU アーキテクチャ

アクセラレーテッド プロセッシング ユニット (APU) は、低電力コアと GPU ユニットがすべて同じチップ上にある異種プロセッサです。 GPU には、命令でスケジュールできる多数のシェーダ コアがあり、そのキャッシュは一般に非コヒーレントであるため、設計が簡素化され、多くのコアが同時に動作する場合にはるかに高いパフォーマンスが可能になります。 AMD と Nvidia は、小型の計算ユニットを利用して複数のデータの同時操作をサポートし、高速なコンテキスト切り替えをサポートするために大きなレジスタ ファイルを備えています。講演者は、GPU アーキテクチャでの制御フローの管理方法、特に無効な結果を生成する可能性のある分岐命令の処理方法についても説明しますが、プロセッサ ベンダーがハードウェアに制御ロジックをすでに提供しているため、プログラマーはこれらの問題についてあまり心配する必要はありません。全体として、GPU は、現代の市場、特に AI と機械学習の分野で、複雑なワークロードによく使われるプロセッサーです。

  • 00:00:00 このセクションでは、システムの汎用コンピューティング、管理、構成に使用される低電力コアと GPU ユニットで構成される典型的なヘテロジニアス プロセッサであるアクセラレーテッド プロセッシング ユニット (APU) について学びます。すべて同じチップ上にあります。 APU には 2 レベルのキャッシュを備えた一般的な x86 コアが搭載されていますが、GPU コアは x86 ではなく異なり、下位のローカル データ ストレージはプライベート メモリと見なされます。メモリの所有権は図で確認でき、メモリの場所、アクセス可能性、サイズが示されます。プライベート メモリはローカル メモリよりも小さく、グローバル メモリよりもはるかに小さいです。 Intel または AMD の現在のラップトップ プロセッサには、通常、少数の汎用コア、統合メモリ、およびオンチップ グラフィックス プロセッシング ユニットが搭載されています。

  • 00:05:00 このセクションでは、GPU アーキテクチャと、それが AI および機械学習の分野でどのように使用されるかについて学びます。 GPU には、命令でスケジュールできるシェーダー コアと呼ばれるプロセッサが多数搭載されています。汎用プロセッサのメモリ サブシステムとは異なる高速 GPU メモリにアクセスでき、キャッシュは一般に非コヒーレントです。 GPU は一貫性を確保するためにキャッシュ コヒーレンス プロトコルを使用しないため、設計が簡素化され、多くのコアが同時に動作している場合でもより高いパフォーマンスが可能になります。全体として、GPU は現代の市場で複雑なワークロードによく使用されるプロセッサです。

  • 00:10:00 このセクションでは、AMD と Nvidia が、同時に複数のデータの操作をサポートする cmd ハードウェアを備えた小型のコンピューティング ユニットをどのように利用しているかについて学びます。どちらのベンダーも 16 幅の cmd を備えており、作業項目をより大きなグループにグループ化し、チップと構成パラメーターに応じて異なるバッチにマップできます。さらに、両ベンダーは、高速コンテキスト スイッチングをサポートするための大規模なレジスタ ファイルを備えており、自動レベル 1 キャッシュとユーザー管理のスクラッチパッドの組み合わせを備えています。これは、それぞれのプライベート メモリでの高速操作をサポートするために高帯域幅で強力にサポートされています。最後に、制御フローと 1 つの命令で複数のデータを実行するという概念、および分岐命令によって実行パスに多少の逸脱が発生し、無効なデータに対して実行される計算量を最小限に抑える方法が必要になる仕組みについて簡単に触れます。

  • 00:15:00 このセクションでは、講演者が GPU アーキテクチャでの制御フローの管理方法、特に無効な結果を生成する可能性のある分岐命令の処理方法について説明します。この問題に対処するには、パフォーマンスが低下する可能性がありますが、cmd レーンをマスクして一部の計算を破棄できます。単一命令複数スレッド (SIMT) テクノロジを使用する場合に対処する必要があるもう 1 つの問題は、ソフトウェア スレッド間の相違であり、適切に管理しないと計算サイクルが無駄になる可能性があります。幸いなことに、プロセッサ ベンダーがハードウェアに制御ロジックをすでに提供しているため、OpenCL プログラマはこれらの問題についてあまり心配する必要はありません。
GPU Architecture
GPU Architecture
  • 2020.05.23
  • www.youtube.com
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...
 

10. FPGA の内部構造


10. FPGA の内部構造

このビデオでは、フィールド プログラマブル ゲート アレイ (FPGA) のアーキテクチャと機能について説明します。 FPGA はプログラマブル ロジックを備えているため、新しい機能に対応するために再プログラムすることができ、大量の入出力 (I/O) を通じてデータに直接アクセスできます。 FPGA のルックアップ テーブル構造は、論理関数を定義するようにプログラムできる複数レベルのマルチプレクサで構成されます。 FPGA は、カウンタ、シフト レジスタ、ステート マシン、DSP 機能に使用できるプログラマブル レジスタを使用します。チップ上の各長方形のブロックはロジック アレイ ブロック (LAB) を表し、各 LAB には 10 個のアダプティブ ロジック モジュール (ALM) が含まれています。 FPGA は、民生用デバイス、自動車、医療機器、通信および放送などの業界で使用されています。

  • 00:00:00 このセクションでは、新しい機能に対応するために再プログラムできるプログラマブル ロジックや、大量の I/O によるデータへの直接アクセスなど、FPGA の基本を紹介します。 FPGA の利点は、メモリ コンポーネントやコプロセッサへの接続が便利であること、ハードウェアを交換する必要がなく機能が交換可能であること、民生機器、自動車、医療機器、通信および放送などの業界で広く普及していることです。 FPGA のアーキテクチャには、論理関数を定義するためにプログラムできるルックアップ テーブルと、以降のセクションで説明するキャリーイン レジスタや適応論理モジュールなどの重要な部分が含まれています。

  • 00:05:00 ビデオのこのセクションでは、プレゼンターが FPGA のルックアップ テーブルの構造について説明します。ルックアップ テーブルは、選択可能な入力を備えた複数レベルのマルチプレクサで構成されます。ルックアップ テーブルへの入力を使用して、任意の組み合わせ論理関数を構築できます。次に、ビデオではプログラマブル レジスタについて説明します。プログラマブル レジスタは、カウンタ、シフト レジスタ、ステート マシン、DSP 機能に使用される FPGA の記憶素子です。これらのレジスタには、通常はグローバル クロックによって駆動されるクロック信号があり、ルックアップ テーブルにフィードバックできます。さらに、ビデオではロジックエレメントとアダプティブロジックモジュールがチェーン信号を介してどのように接続されるかを説明しています。
    キャリー ビット、およびレジスタへの入力が前の論理要素からどのように取得されるかについて説明します。

  • 00:10:00 このセクションでは、FPGA チップ内のロジック要素を編成する方法を学びます。チップ上の各長方形のブロックはロジック アレイ ブロック (LAB) を表し、各 LAB には 10 個のアダプティブ ロジック モジュール (ALM) が含まれています。各 ALM は、演算ユニット、ローカル相互接続および登録接続に加え、入力の柔軟な構成と特定の出力生成のための専用リソースと適応ルックアップ テーブルで構成されます。さらに、特定の LAB を接続できる行と列の相互接続があり、デバイス密度に応じて配線が直線的にスケールされます。最後に、シングルまたはデュアル ポート RAM、読み取り専用メモリ、または eMLAB と呼ばれるメモリ構造の小さなスライスなど、さまざまなタイプのメモリ構造をサポートする組み込みメモリ ブロックがあります。

  • 00:15:00 このセクションでは、デジタル信号処理 (DSP) ブロックや入出力 (IO) コンポーネントなど、FPGA のさまざまな機能について学びます。 DSP ブロックは、FFT 変換や高性能の積和演算などの信号処理機能を実装するのに役立ちます。 FPGA はさまざまな IO コンポーネントと通信することもでき、出力の有効化、制御、終了が可能になります。 IO エレメントのロジックには双方向ピンと出力イネーブル信号制御が含まれており、出力パスはクロック信号を通じて値 A と B を生成します。一方、出力制御が無効な場合、入力信号は入力レジスタを通過します。

  • 00:20:00 FPGA の内部に関するこのセクションでは、FPGA 動作をサポートするための専用入力クロック ピンの使用とともに、クロック信号の重要性が強調されています。高速トランシーバーについても説明します。これは、複雑な信号調整や処理を必要とせず、FPGA でより複雑な信号プロトコルを実装するのに役立ちます。最小限のスキューでデバイス全体で使用するためのさまざまなクロック信号を生成するための PLL の使用法と、入力信号と出力信号の接続を制御するプログラマブル ビットを構成するための SRAM セル テクノロジとルックアップ テーブルの使用法についても説明します。このビデオでは、外部 W prom、Cpl D、または CPU を使用してプログラミング シーケンスを制御するための FPGA のプログラミング方法や、さらなる診断とデバッグのための特別なハードウェア JTAG 接続の使用方法も取り上げています。

  • 00:25:00 このセクションでは、フィールド プログラマブル ゲート アレイ (FPGA) の設計と機能について説明します。 FPGA の領域の大部分は、行および列の相互接続を介して接続できるロジック アレイ ブロックです。他のブロックには、PR、トランシーバー、およびさまざまなメモリ コンポーネントに接続できるメモリ コントローラーが含まれます。 PJ エリア 10g X FPGA は、100 万個の論理要素、170 万個のレジスタ、それぞれ 22 ビットの 54,000 個のメモリ ブロック、1,518 個の DSP ブロック、367.4 ギガビット/秒のトランシーバー、2 個のハード PCIe ブロック、492 個の汎用 IO ピンを備えた例として使用されます。 12 個のメモリ コントローラー。 FPGA の利点は、複雑な機能を作成できる高密度、複数の機能の統合、さまざまな IO 規格および機能へのアクセス、および 1 つのチップでのデータへの直接アクセスです。
FPGA Internals
FPGA Internals
  • 2020.04.18
  • www.youtube.com
The internal architecture of FPGA
 

11. GPU システム上の OpenCL メモリ



11. GPU システム上の OpenCL メモリ

インストラクターは、OpenCL メモリの AMD GPU へのマッピング、および GPU システム内のさまざまなメモリ層について説明します。計算デバイスには、複数の SIMD レーン、プライベート レジスタ ファイル、およびプライベート メモリを備えたコアとして機能する計算ユニットへのディレクティブを管理するコマンド プロセッサがあります。カーネル プログラムは、利用可能なすべてのコアの利用を可能にし、メモリ アクセスの待ち時間を短縮する自律型ジョブを提供することを目的としています。講演者はまた、計算とメモリ軸の移動の間の比率を指す演算強度の概念と、GPU のメモリ帯域幅が制限要因となるのを避けるためにどのように高くすべきかについても言及しています。

  • 00:00:00 このセクションでは、講演者が、特に AMD GPU に焦点を当てて、さまざまなプロセッサのハードウェア アーキテクチャに関連して OpenCL について説明します。この図は、グローバル メモリ、定数メモリ、およびローカル メモリを示しています。左側のカーネルは、データ並列プログラムの設計時に使用される OpenCL カーネルを表しています。各ワーク グループはデータに基づいて計算のサブセットを実行します。ローカル メモリはワーク グループにとってローカルであり、プロセッサ内の実行ユニットと共有されます。ワークグループ内のワークアイテムは実際に実行される計算であり、それぞれが独自のデータセットを持っています。

  • 00:05:00 このセクションでは、インストラクターが、OpenCL メモリが AMD GPU にどのようにマッピングされるか、および GPU システム上のさまざまなレベルのメモリについて説明します。計算デバイスには、レベル 1 キャッシュを備え、一部のレベル 2 キャッシュを共有し、グローバル メモリに接続されている計算ユニットへの命令をスケジュールするコマンド プロセッサがあります。コンピュータ ユニットは、複数の SIMD レーンとプライベート メモリを構成する GPR と呼ばれるプライベート レジスタ ファイルを備えたコアとして機能します。カーネル プログラムは独立した作業部分を提供することが期待されており、利用可能なすべてのコアをビジー状態にするためにできるだけ多くの作業部分を提供する必要があり、これらの部分はメモリ アクセスの待ち時間を最小限に抑えるためにハードウェア コンテキストの切り替えを可能にする必要があります。カーネルは、ハードウェアを効率的に使用するために高い演算強度も備えている必要があります。
     
  • 00:10:00 このセクションでは、講演者は、基本的に計算と記憶軸の動きの比率であるロマンチックな強度の概念について説明します。目標は、メモリ帯域幅による制限を避けるために、メモリ アクセスに対する数学演算をできる限り高速化することです。
OpenCL Memory on a GPU System
OpenCL Memory on a GPU System
  • 2020.05.23
  • www.youtube.com
This lecture introduces how OpenCL memory model is mapped to a GPU based system.
 

12. OpenCL の例: 行列の乗算



12. OpenCL の例: 行列の乗算

このビデオでは、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 の対応する要素に割り当てます。これらの手順は、行番号と列番号を使用して次のことを行う方法を示しています。線形方式でインデックスを計算します。これは、行列を物理メモリに保存するために不可欠です。
OpenCL Example: Matrix Multiplication
OpenCL Example: Matrix Multiplication
  • 2020.06.05
  • www.youtube.com
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...
 

13. OpenCLプログラムの構造(その1)



13. OpenCLプログラムの構造(その1)

ビデオ「OpenCL プログラムの構造 (part1)」では、OpenCL アプリケーションを構築するプロセスを説明します。プログラムはまず OpenCL プラットフォームにクエリを実行してそのリソースを理解し、OpenCL コンテキストとコマンド キューを作成する必要があります。次に、ホストとデバイスのメモリ間のデータ交換用にバッファが作成され、カーネル プログラムがデバイス上で実行できるバイナリにコンパイルされます。このビデオでは、読み取り専用および書き込み専用のバッファーの作成方法、出力行列用のスペースの割り当て方法、および結果をホストにコピーして戻す方法について説明します。 API 呼び出しが正常に実行されたかどうかを確認することの重要性が強調されています。

  • 00:00:00 このセクションでは、講演者が OpenCL アプリケーションを構築する手順を説明します。まず、プログラムは OpenCL プラットフォームにクエリを実行して、プラットフォーム上で利用可能なリソースを理解してから、バッファ操作とカーネルの起動に不可欠な OpenCL コンテキストとコマンド キューを作成する必要があります。次に、ホストとデバイスのメモリ間でデータを交換するためにバッファが作成されます。この後、カーネル プログラムを、FPGA または GPU 上のアクセラレータ デバイスで実行できるバイナリにコンパイルする必要があります。コンパイルプロセスはデバイスによって異なります。

  • 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 の完全な定義を示します。
Structure of an OpenCL Program (part1)
Structure of an OpenCL Program (part1)
  • 2020.06.05
  • www.youtube.com
This video describes the basic structure of an OpenCL program. (this is part1, a second part follows)
 

14. OpenCLプログラムの構造(その2)



14. OpenCLプログラムの構造(その2)

OpenCL プログラミングの 3 番目のステップにはカーネル コンパイルが含まれますが、FPGA デバイスの場合はオフラインで実行されるため異なります。ソースと C TX を含む CL 作成プログラムを使用してプログラムを作成し、続いて CL ビルド プログラムを使用してプログラムをバイナリにビルドします。適切なエントリ ポイントを使用して正しいカーネル関数が選択され、カーネル引数は正しいポインタを持つ CL set kernel argument を使用して初期化される必要があります。講演者は、行列の乗算で引数を適切に設定する方法について詳しく説明します。次に、ローカルおよびグローバルのワークグループ サイズの設定、カーネルの実行、およびキュー バッファー API の CL を使用した結果の取得について説明します。最後に、講演者は OpenCL プログラミングにおける出来事について簡単に言及します。

  • 00:00:00 このセクションでは、カーネルのコンパイルを含む、OpenCL プログラムの 3 番目のステップについて説明します。コンパイルがオフラインで行われるため、FPGA デバイスの場合はこのプロセスが少し異なります。プログラムのソースコードがキャラクタバッファに格納されていると仮定し、ソースとC TXを含むCL作成プログラムを使用してプログラムを作成し、プログラムをバイナリにビルドするためにCLビルドプログラムを使用します。次に、選択した特定のカーネル関数の適切なエントリ ポイントを使用してカーネルを作成することにより、ソース コードから正しいカーネル関数が選択されます。カーネルが作成されたら、実際の値を指すポインターを使用して、CL set kernel argument を使用してカーネル引数を適切に初期化する必要があります。たとえば、行列の乗算では、宛先バッファ、行列のサイズ、2 つの入力行列を含む 7 つの引数を適切に設定する必要があります。

  • 00:05:00 このセクションでは、講演者は複数のカーネル引数の初期化について説明し、エラーを避けるためにこれらの引数のインデックスを正しく設定することの重要性を強調しています。次に、グループ内の作業項目の数と作業グループの数を指定して、ローカルおよびグローバルのワークグループ サイズを設定する方法について説明します。最後に、OpenCL API の呼び出し、キュー バッファー API の CL を使用してデバイスからホスト メモリに結果を取得するなど、カーネルを実行する手順について説明します。講演者はイベントと、それを OpenCL プログラミングで使用する方法についても簡単に説明しますが、これについては後の講義でさらに説明します。
Structure of an OpenCL Program (part2)
Structure of an OpenCL Program (part2)
  • 2020.06.05
  • www.youtube.com
This video describe the basic structure of an OpenCL program. (continued from part 1)
 

15. OpenCL行列乗算のデモ



15. OpenCL行列乗算のデモ

「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 プラットフォームを表示します。
OpenCL Matrix Multiplication Demo
OpenCL Matrix Multiplication Demo
  • 2020.06.05
  • www.youtube.com
This video walks through the code of Matrix Multiplication.
理由: