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

 

45. 並行して考えるには?



45. 並行して考えるには?

このビデオでは、行列乗算を例として並列プログラミングについて説明します。この計算では、複数の行と列を個別に計算できるという並列処理が強調されています。行列 C の単一要素計算の実装は、並列計算を可能にするカーネル関数を使用して示されています。アクセサー、レンジ、並列カーネル関数の使用法について詳しく説明します。範囲値をカーネル関数に渡す手順について説明します。 Intel FPGA dev Cloud を使用した行列乗算のデモも行われます。

  • 00:00:00 このセクションでは、ビデオでは、並列プログラミングを教えるために一般的に使用される例として行列の乗算を紹介します。このビデオでは、行列の乗算では、ある行列から行を取得し、別の行列から列を取得して、要素ごとの乗算と累算を実行して結果の行列を生成することが説明されています。このビデオでは、さまざまな行と列を互いに独立して計算できるため、この計算では多くの並列処理が行われることが説明されています。行列乗算の簡単な実装は、要素ごとの乗算と累積を実行するネストされた for ループを備えた通常の C または C++ 言語を使用して示されています。

  • 00:05:00 このセクションでは、行列 C の単一要素計算の実装について学習します。これは、並列計算を可能にする 1 つのカーネル関数として実装されます。重要な点は、すべての行と列の計算は同じであり、唯一の違いは行と列の番号であるということです。アクセサーは、行列 A および B には読み取り専用アクセス、行列 C には書き込みアクセスを使用してカーネル内のバッファーにアクセスするのに役立ちます。範囲は複数の次元を宣言するための抽象化として使用され、H.Parallel4 は並列カーネル関数の定義に役立ちます。 。カーネル関数にはラムダ関数が含まれており、引数は両方の次元のすべての値を反復処理するための変数です。

  • 00:10:00 このセクションでは、講演者が層流関数であるカーネル関数に範囲値を渡す手順を説明します。変数の 2 つの次元と、各変数を識別する方法について説明します。講演者は、ラムダ関数がどのように機能するかを説明し、カーネル関数を実行する行と列の数によって問題のサイズがどのように定義されるかを示します。行列の乗算の例、伝統的な C プラス表記法、および最も内側の for ループで行われる要素ごとの乗算と累積を使用します。最後に、インテル FPGA 開発クラウドを使用した行列乗算の簡単なデモを示します。
How to Think In Parallel ?
How to Think In Parallel ?
  • 2021.04.07
  • www.youtube.com
This video use matrix multiplication example to introduce how to think in parallel with design data parallel algorithms.
 

47. 設計解析 (I): FPGA の初期イメージを解析する



47. 設計解析 (I): FPGA の初期イメージを解析する

ビデオのこのセクションでは、DPC++ デザインの FPGA 初期イメージを分析するプロセスに焦点を当てています。講演者は、プログラムのコンパイル、FPGA バイナリの生成、プロファイリングの実行など、関連する手順を説明します。このビデオには、レポートを生成する方法と、レポートで提供されるさまざまな情報パネルを解釈する方法のデモが含まれています。講演者はまた、b2 モジュールの FPGA 初期イメージを分析し、さまざまな論理ブロック、ループ、ロード ユニット、およびアンロール ファクターについて説明します。また、カーネル関数の設計が FPGA の内部設計にどのように大きな影響を与える可能性があるかについても説明し、内部ループと外部ループを展開してスループットを向上させる方法の例を示します。これらの例は、FPGA のハードウェア リソースに影響を与える高級言語プログラミングの柔軟性を示しています。

  • 00:00:00 ビデオのこのセクションでは、講演者が DPC++ デザインの解析プロセスについて、特に FPGA の初期イメージの解析に焦点を当てて説明します。これには、機能の正確性を確認するためのプログラムの FPGA エミュレータへのコンパイル、FPGA バイナリの生成、フィーチャー カード上での実行、ランタイム パフォーマンスを決定するためのプロファイリングの実行など、いくつかの手順が含まれます。第 2 段階では、レポートを生成し、必要に応じて設計を修正する前にボトルネックを探します。このビデオには、レポートを生成してブラウザーで分析する方法のデモが含まれており、レポートで提供されるさまざまな情報パネルと概要を解釈する方法が説明されています。

  • 00:05:00 このセクションでは、講演者が設計分析ツールの概要とその機能について説明します。リソース使用率パネルがデザインで使用されるリソースに関する情報を表示する方法と、システム ビューア パネルでユーザーがデザインのさまざまなコンポーネント (メモリ コンポーネントやパイプなど) を表示できる方法について説明します。システム ビューア パネル内のグラフ ビューアには、設計で使用されているコンポーネントのリストと、それらがどのように相互接続されているかが表示されます。また、講演者は、ユーザーが個々のモジュールにズームインして、ソース コード内の対応するセグメントを表示する方法も実演します。

  • 00:10:00 このセクションでは、講演者が b2 モジュールの FPGA 初期イメージを分析し、デザインを構成するさまざまな論理ブロックとループについて説明します。また、メモリ コンポーネントからデータをロードするためのロード ユニットの使用法と、ループ操作の効率を高めるためのアンロール係数についても説明します。講演者はまた、並列 4 デザインとシングル タスク デザインを比較し、メモリ アクセスを最適化するために FPGA デザインにシングル タスクを使用することを推奨しています。

  • 00:15:00 このセクションでは、カーネル関数の設計が FPGA の内部設計にどのように大きな影響を与える可能性があるかについて講演者が説明します。講演者は、内部ループと外部ループを展開して FPGA のハードウェア リソースを利用し、それによってスループットを向上させる方法の例を示します。これらの例は、FPGA のハードウェア リソースに影響を与える高級言語プログラミングの柔軟性を示しています。
Design Analysis (I): Analyze FPGA Early Images
Design Analysis (I): Analyze FPGA Early Images
  • 2021.04.07
  • www.youtube.com
This video introduce the design workflow and how to analyze the early image using DPC++ compiler report.
 

48. DPC++ FPGA デザイン解析 (II): ランタイム プロファイリング



48. DPC++ FPGA デザイン解析 (II): ランタイム プロファイリング

このビデオでは、FPGA ビット ストリームにプロファイリング計測器のレジスタを追加してパフォーマンス データを収集するツールを使用して、プログラムのランタイム パフォーマンスを分析するプロセスについて説明します。ユーザーが追加したパフォーマンス カウンターを備えたインテル FPGA ダイナミック プロファイラーを使用して、プロファイリング用にコンパイルし、集合的なプロファイリング結果を解釈する方法を示します。これらは、ランタイム プロファイリング結果の分析に使用されるカーネル関数と実行可能ファイルを V2 プロファイラーが表示する方法と、パーティションのボトルネックを特定して最適化する方法を示しています。使用された例は、グローバル メモリへのメモリ アクセスが多かった行列修正カーネルです。このカーネルは、ローカル メモリを使用して最適化され、グローバル メモリとの通信を減らし、設計効率を向上させました。

  • 00:00:00 このセクションでは、プレゼンターはプログラムの実行時のパフォーマンスの分析について説明します。ツールを使用してプロファイリング計測器レジスタを FPGA ビット ストリームに追加してパフォーマンス データを収集する方法について説明します。インテル FPGA ダイナミック プロファイラーは、ユーザーが追加したパフォーマンス カウンターとともに使用され、カーネル パフォーマンス データを収集します。パフォーマンス データは、実行の最後に profile.mall というファイルに保存され、Intel v2 プロファイラーがファイルを読み取ることができるようにするための json ファイルが生成されます。結果フォルダーをインテル Retune ツールキットにロードする場合は、両方のファイルが必要です。データを v2 にロードする場合、ディレクトリからデータをインポートすることが重要です。

  • 00:05:00 このセクションでは、プレゼンターがプロファイリング用にコンパイルし、集合的なプロファイリング結果を解釈する方法を示します。これらは、ランタイム プロファイリング結果の分析に使用されるカーネル関数と実行可能ファイルを V2 プロファイラーがどのように表示するかを示しています。パネルには、メモリ操作関数とループ操作、その時間、ストールの割合、占有率、アイドル時間、アクティビティの割合、データ転送サイズ、平均帯域幅が表示されます。パネルの下部には、FPGA 使用率とグローバル メモリ帯域幅占有に関するその他のメトリクスが詳細に表示されます。詳細な統計を表示することで、設計者は個々のカーネルとその機能を理解でき、設計の最適化と改善に役立ちます。

  • 00:10:00 ビデオのこのセクションでは、講演者がパーティションのボトルネックを特定して最適化する方法について説明します。使用された例は、グローバル メモリへのメモリ アクセスが多く、結果として 15.57 GB のデータ転送を行う行列変更カーネルです。カーネルの設計はメモリ結合であり、その解決策は、ローカル メモリを使用してメモリ アクセスを最適化し、グローバル メモリとの通信を減らし、設計効率を向上させることです。この最適化については次の講義で説明します。
DPC++ FPGA Design Analysis (II): Runtime Profiling
DPC++ FPGA Design Analysis (II): Runtime Profiling
  • 2021.04.07
  • www.youtube.com
This video introduces DPC++ profiling and how to analyze run-time profiling reports using Intel VTune tool.
 

EECE.6540 ヘテロジニアス コンピューティング (マサチューセッツ大学ローウェル校) - 49. OpenCL の例



49. OpenCL の例 (I)

YouTube ビデオ「OpenCL Examples (I)」では、C プログラミングでのネストされたループを使用した行列乗算の実装と、OpenCL カーネルとしてのその実装について説明しています。講師は、行列の結果の要素の内積計算に 2 レベルのネストされたループを使用する方法と、行列 C の各出力要素が OpenCL で個別のワークアイテムとして扱われる方法を説明します。このビデオでは、OpenCL カーネルの実行準備と、結果のマトリックスをデバイスからホストに取得するために必要な手順、さらにワーク グループ サイズの設定、変更されたカーネル引数を使用したカーネルの実行についても説明しています。さらに、行列乗算のサンプル コードが提供され、講演者は Mac OS 上でデバイス ID とプラットフォーム ID を取得し、さまざまなプラットフォーム上でプログラム オブジェクトを作成するプロセスを実演します。最後に、ビデオではバッファ管理について説明し、ホスト側で割り当てられたリソースと使用される OpenCL リソースを追跡し、簡単な乗算カーネルの例を示します。

このビデオでは、行列の乗算、画像の回転、画像のフィルタリングなど、OpenCL のさまざまな使用例を取り上げています。画像の回転について、講演者は入力分解を使用して問題を分解する方法を説明し、各ピクセルの元の位置と新しい位置を識別するために使用されるカーネル関数を実演します。画像フィルタリングについて、講演者は、デバイス側で画像オブジェクトを作成する概念と、画像へのアクセス方法を定義するための OpenCL サンプラーの使用について説明します。また、2 つのネストされた for ループを使用した画像畳み込み関数のサンプル実装も示します。このビデオは、OpenCL を使用して画像に畳み込みフィルターを実行し、結果を検証するデモンストレーションで終わります。

  • 00:00:00 このセクションでは、講師が古典的なコンピューティングの例である行列乗算を紹介し、C プログラミングのネストされたループによってそれを実装する方法を説明します。また、行列 A の行と行列 B の列の積である、行列の結果の要素の内積計算についても説明します。この講義では、2 つのレベルのネストされたループが独立して実行でき、実行できることについて説明します。ランダムな方法で。

  • 00:05:00 このセクションでは、ワークアイテムの概念と、それを OpenCL カーネルで行列乗算の実装に適用する方法について説明します。行列 C の各出力要素は個別の作業項目として扱われ、FPGA または GPU 処理要素を利用して、2 次元範囲の作業項目をハードウェア実装内の他の for ループにマッピングできます。行列の乗算を実装するには、引数のリストを持つ「simple multiply」という名前のカーネル関数が定義されます。これには、必要なすべての入力行列とその次元が必要です。カーネル関数の本体は、グローバル ID を使用してワークアイテムの 2 次元位置を計算し、合計を初期化して行列 C の結果の要素を計算します。

  • 00:10:00 このセクションでは、OpenCL プログラミング フレームワークを使用した行列乗算のカーネル関数について講演者が説明します。カーネル関数は、ドット積演算と for ループを利用して、a からの行ベクトルと B からの列ベクトルの要素を反復処理します。 2 次元入力行列のインデックスは、行番号と列番号を使用して計算され、行ベクトルと列ベクトルの右側の要素。ドット積が計算されると、結果の要素が C の対応する要素に割り当てられます。計算環境についても説明します。これはプラットフォームに依存し、プラットフォームで利用可能なリソースと重要なパラメーターを理解する必要があります。

  • 00:15:00 このセクションでは、講演者は、カーネルをインスタンス化するためのコンテキストとコマンド キューの作成から始めて、OpenCL カーネルが動作するように準備するために必要な手順の概要を説明します。次に、ホスト側でバッファを割り当て、ホスト メモリからデバイス メモリにデータをコピーし、カーネルをディスパッチすることにより、入力データが準備されます。次に、プログラムはカーネルの完了を待ち、デバイス メモリを読み取って結果を収集します。 openCL アプリケーションには、プラットフォーム層とランタイム層の 2 つの層があり、カーネル プログラムは、FPGA または GPU のアクセラレータ デバイスで実行できるバイナリにコンパイルする必要があります。これらの手順はデバイスによって異なり、PG バイナリのコンパイルには数時間かかる場合がありますが、GPU コンパイルは多くの場合短時間で完了します。

  • 00:20:00 このセクションでは、ビデオで OpenCL プログラミングの環境をセットアップする方法について説明します。最初のステップでは、プラットフォーム ID を取得します。これは、システムで使用可能なプラットフォームの数を返す CL のプラットフォーム ID 取得関数を使用して行われます。次に、ビデオでは、ユーザーの好みに基づいてプラットフォーム内で特定のデバイスを取得する方法と、コマンド キューやバッファーなどのすべてのリソースを格納する OpenCL コンテキストを作成する方法について説明します。チュートリアルでは、操作が成功したことを確認するために戻り値をチェックすることを推奨しています。

  • 00:25:00 このセクションでは、バッファーを宣言し、OpenCL API 関数を使用して、入力行列 B と C、および出力行列 C からデータを作成および移動する方法をビデオで説明します。彼らは、行列 A、B、および C がすでに float 型配列として宣言されており、データを物理メモリの線形アドレス空間に格納していると想定しています。このビデオでは、CL 作成バッファー関数を使用して行列 A および B のバッファーを宣言する方法と、CL Inc you write バッファー関数を使用して行列 A および B からデバイス上に作成されたバッファーに初期データをコピーする方法を示します。次のステップは、行列 C にスペースを割り当てることです。行列 C は、デバイスが計算結果を書き込むため、CL メモリ書き込み専用バッファとして宣言されます。

  • 00:30:00 YouTube ビデオ「OpenCL Examples (I)」のこのセクションでは、スピーカーがデバイスから結果を取得し、結果の行列をバッファ C からホストにコピーするプロセスを説明しています。 API C の定義が示されており、コンテキスト、フラグ、サイズ、ホスト ポインター、戻り値など、バッファーを作成するための 5 つの引数の説明が示されています。次に講演者は、OpenCL プログラムの 3 番目の主要なステップであるカーネル コンパイルについて、FPGA デバイスの簡単なコンパイル プロセスを使用して説明します。このプロセスには、プログラムの作成と構築、およびソース コードから適切なカーネル関数の選択が含まれます。最後に、スピーカーは、CL set kernel argument OpenCL API を使用して、カーネル プログラムを実行する前にカーネル引数を初期化する方法について説明します。

  • 00:35:00 このセクションでは、講演者は、カーネル引数の初期化、ワーク グループ サイズの設定、カーネルの実行、および OpenCL プログラムでの結果の取得のプロセスについて説明します。ユーザーは、「CL create kernel」API を使用し、実際の値へのポインターを使用してカーネル引数のサイズと値を指定する必要があります。講演者は、引数インデックスを正確に設定し、コピー&ペーストする際に行ごとにそれらを変更することの重要性を強調しています。ローカルおよびグローバルのワークグループ サイズは、ワークアイテムとワーク グループの数に合わせて設定する必要があります。最後に、結合された CL バッファを使用してホストのメモリ上の出力バッファを読み取り、適切に実行するための同期要件を示します。

  • 00:40:00 このセクションでは、講演者が OpenCL を使用した行列乗算の例を紹介します。行列乗算のサンプルのソース コードは、ホスト側プログラム、カーネル プログラム、プロジェクトのコンパイルに役立つメイクファイルなど、いくつかのファイルで構成されています。ホスト側プログラムは C で書かれており、OpenCL フレームワークの標準ライブラリと特定のヘッダー ファイルが含まれています。この例には、プラットフォームとデバイスの数、コンテキスト、OpenCL プログラム、OpenCL カーネルなどの入力行列と変数の宣言が含まれています。講演者は、カーネル ソース コードのコンパイル方法、入力行列のサイズとその結果の出力行列についても説明します。

  • 00:45:00 ビデオのこのセクションでは、プレゼンターが Mac OS 上で OpenCL のデバイス ID とプラットフォーム ID を取得する方法を示します。プラットフォーム ID の取得やコマンド キューの作成など、さまざまな OpenCL 関数を呼び出すことで、スピーカーは OpenCL コンテキストを作成し、プログラムをコンパイルします。また、示されているコードは Mac OS と OpenCL SDK の両方をサポートしており、別のプラットフォームで実行するとエラーが報告されることも説明されています。

  • 00:50:00 このセクションでは、さまざまなプラットフォームで OpenCL を使用してプログラム オブジェクトを作成する方法をビデオで説明します。 Mac OS では、プログラム オブジェクトはカーネル ソース コード ファイルから作成されますが、アルテラ FPGA OpenCL SDK では、コンパイルによって生成されたバイナリ ファイルから作成されます。プログラム オブジェクトが作成されると、カーネル プログラムを構築でき、そのプログラム オブジェクトから特定のカーネル関数を選択できます。このセクションが終わるまでに、必要なオブジェクトと関数がプログラムの次のセクションで使用できるようになります。

  • 00:55:00 このセクションでは、行列の結果を保存するためのバッファの割り当てや、デバイス側でバッファを作成するための CL 作成バッファの使用など、バッファ管理プロセスについてビデオで説明します。このビデオでは、特に FPGA を使用する場合、確実に実行が成功するように Q の CL の戻り値と range Colonel をチェックすることの重要性も強調しています。さらに、ビデオでは、ホスト側で割り当てられたリソースと使用された OpenCL リソースを出力することによって結果を検証するプロセスについて説明し、7 つの引数を使用して反復を通じてドット積演算を実行する単純な乗算カーネルの例を示します。

  • 01:00:00 ビデオのこのセクションでは、講演者が OpenCL の使用例を 2 つ説明します。 1つ目は行列の乗算です。プログラムは 2 つの行列を処理し、対応する要素を乗算して結果を 3 番目の行列に格納します。 2 番目の例は画像の回転です。この場合、プログラムは特定の式に基づいて画像のピクセルを回転します。これらの式では、各ピクセルの元の座標と新しい座標、および回転角度が考慮されます。

  • 01:05:00 このセクションでは、講演者が入力分解を使用して画像回転の問題をより小さな問題に分解する方法について説明します。彼らは、画像のピクセル情報が、x 次元と y 次元の独立した計算を通じて新しい場所にコピーされると説明しています。ワーク グループは、グローバル ID を使用して各ピクセルの新しい位置を計算するために割り当てられます。講演者は、作業項目のグループとディメンション、およびこの操作を完了するために必要なカーネル関数を決定する方法についても詳しく説明します。目標は、画像回転計算のためのより効率的でスケーラブルな方法を作成することです。

  • 01:10:00 このセクションでは、ビデオ プレゼンターが OpenCL を使用して画像を回転する方法を説明します。カーネル関数は、ピクセルの元の位置を特定し、回転パラメータを使用してピクセルの新しい位置を計算し、境界チェックをチェックして新しい座標が元の画像サイズ内に収まることを確認し、元の位置からピクセル情報をコピーするために使用されます。新しい場所へ。このコードには、OpenCL API の C++ バインディングと、プラットフォームのクエリ、デバイスの取得、ホスト メモリからデバイス バッファにデータを移動するバッファの宣言の手順も含まれています。元のデータのセキュリティを確保するために、読み取り専用バッファも作成されます。

  • 01:15:00 このセクションでは、講演者が OpenCL を使用して画像の回転を実行するために必要な手順を説明します。まず、元の画像を画像バッファにコピーする必要があります。次に、宛先バッファを初期化し、元のピクチャのサイズや回転パラメータなどの適切なカーネル引数を設定することによって、カーネルがコンパイルされて実行されます。カーネルは、グローバル ワークグループ サイズとローカル ワークグループ サイズで実行されます。最後に、Q の読み取りバッファを使用して結果がホストに読み戻されます。また、講演者は、ヘッダー ファイル、ユーティリティ関数、プラットフォームとデバイスの ID、コマンド キュー、プログラムとカーネル オブジェクト、元のイメージと回転されたイメージの入出力バッファーを含む、イメージ回転のサンプル ソース コードも実演します。

  • 01:20:00 このセクションでは、OpenCL を使用して画像を回転するプロセスをビデオで説明します。ホストはイメージを BMP 形式で読み取り、それを入力イメージ バッファーに格納されている浮動小数点数の配列に変換します。ホスト上の出力バッファが作成され、乱数で初期化されます。プラットフォームは、プラットフォーム上のデバイスを検索し、コンテキストとコマンド キューを作成するために照会されます。プログラムとカーネル オブジェクトが作成され、元の画像と回転された画像を保存するためのデバイス側バッファが作成されます。元のイメージがデバイス側のバッファにコピーされ、カーネル引数が設定されます。カーネルは、グローバルおよびローカルのワークグループ サイズでインスタンス化することによって実行されます。カーネルが正常に実行されたことを確認するために戻り値がチェックされます。

  • 01:25:00 このセクションでは、講演者が OpenCL を使用した画像回転の概要を説明します。カーネルの完了後、デバイス側のグローバル メモリへのポインタを使用して出力データがホストに読み戻され、イメージを保存するためのホスト バッファが提供されます。このプロセスには BMP フォーマットが含まれており、結果を示す新しい BMP ファイルを作成するために write BMP float と呼ばれるユーティリティ関数が使用されます。カーネル関数について詳しく説明します。ここでは、宛先バッファ ポインタとソース バッファ ポインタが、画像の寸法と回転パラメータとともに渡されます。各ピクセルの新しい座標を計算する式が使用され、ピクセル情報を元の位置から新しい位置にコピーする前に境界チェックが適用されます。このプロセスは、猫の画像を 45 度回転する例で説明されています。

  • 01:30:00 このセクションでは、講演者が OpenCL を使用した画像フィルタリングの概念を説明します。彼は、3x3 フィルターを使用して隣接するピクセルの値を乗算および合計し、新しいフィルター処理されたピクセル値を取得するプロセスについて説明しています。また、フィルタを適用する隣接ピクセルが少ない境界近くのピクセルを扱う場合には注意する必要があることも強調しています。次に、講演者は、OpenCL を使用して元の画像に適用できるさまざまなタイプの画像フィルターをデモンストレーションします。その後、画像内のすべてのピクセルを処理する 2 つのネストされた for ループと、フィルター内の要素を処理する 3 番目のループを備えた画像畳み込み関数のサンプル実装を示します。

  • 01:35:00 このセクションでは、講演者が OpenGL の画像データ構造について説明します。OpenGL は、多次元構造として保持され、画像データ型に使用される不透明型です。整数型やポインター型とは異なり、イメージはデバイス内のポイントを通じて直接表示することはできず、そのピクセル値は浮動小数点数または整数値として指定できます。デバイス側でイメージ オブジェクトを作成すると、OpenCL コンピューティング ユニットが新しいピクセルをイメージ オブジェクトに読み書きできるようになり、イメージ データ処理またはグラフィック プロセッサに固有の長く最適化された命令シーケンスにとって有益です。講演者は、CL Write Image や CL Create Buffer などの API を使用して画像とフィルターのデータをデバイスにコピーすることで、ソース画像バッファー、出力画像オブジェクト、およびフィルターを作成する方法についても説明します。

  • 01:40:00 このセクションでは、発表者は、画像へのアクセス方法を記述するために使用されるオブジェクトである OpenCL サンプラーの概念を紹介します。サンプラーは、コンテキストを引数として受け取り、座標を正規化するかどうかを定義する API 関数を使用して作成されます。アドレス指定モードも定義されており、画像座標が範囲外にある場合に画像座標をどのように処理するかを指定します。フィルタリング モードは、座標がピクセル間にある場合に適用する必要があるフィルタを指定します。 convolution という名前のカーネル関数も導入されており、入力および出力 2D 画像オブジェクト、フィルター値を保存する定数浮動小数点フィルター、およびサンプラー オブジェクトを受け取ります。カーネル関数は、画像オブジェクトからデータ項目を読み取り、4 つの浮動小数点数のベクトルを返し、画像データの演算を実行します。

  • 01:45:00 このセクションでは、講演者が 4 要素の浮動小数点ベクトルを使用して浮動小数点ベクトルの演算を実行する方法を説明します。これらは、フィルター インデックスの初期化、2 要素座標の変数の宣言、フィルター行の反復処理、および 2 次元での座標の計算というプロセスを経ます。ピクセルは、読み取りイメージ F 関数を使用してイメージ オブジェクトから読み取られ、フィルター ピクセル値と乗算され、更新された値が出力イメージに保存されます。最後に、CL インクの画像読み取り機能を使用して画像が読み取られます。

  • 01:50:00 このセクションでは、画像処理で使用するフィルターを提供する OpenCL サンプル (I) のコードについて説明します。プログラムは、フィルターの種類ごとに異なるサイズと値を割り当て、ヘルパー関数を使用してフィルター値を初期化し、ファイルから BMP 画像データを読み取ります。プラットフォームとデバイスの検出は、入力イメージと出力イメージ、およびフィルター バッファーを作成する前に実行されます。サンプラーは初期化されると、適切なフィルター パラメーターを使用してカーネルを実行する前に、境界から外れたピクセルを処理する方法を設定します。グローバル サイズは、イメージ内の列数と行数に設定されます。

  • 01:55:00 このセクションでは、講演者が OpenCL を使用して画像に畳み込みフィルターを実行する例を示します。このプロセスには、イメージ全体を処理し、1 つのデータ次元のグループ内で 8 x 8 のローカル サイズの作業項目を使用するカーネルのセットアップが含まれます。出力イメージはデバイス側に保存され、CL 読み取りイメージを使用してホストに読み戻すことができます。次に、その結果が、ホスト側でフィルターを実行することによって生成された、フィルター処理された参照画像と比較されます。 2 つの画像は視覚的に同一であり、結果が確認されています。最後に、ホスト側とデバイス側の両方のリソースが解放されます。
OpenCL Examples (I)
OpenCL Examples (I)
  • 2017.09.29
  • www.youtube.com
Lectures on OpenCL Examples (I)
 

大並列サポート ベクター分類のための SYCL、OpenCL、CUDA、および OpenMP の比較 ( WOCL / SYCLcon 2022 )



大並列サポート ベクター分類のための SYCL、OpenCL、CUDA、および OpenMP の比較

このビデオでは、大規模並列サポート ベクター マシン分類について、さまざまなハードウェア プラットフォーム上での SYCL、OpenCL、CUDA、および OpenMP のパフォーマンスを比較しています。講演者は、Parallel Fibonacci と呼ばれる実装による行列ベクトル乗算の並列化について説明します。これは、マルチGPU 実行をサポートしますが、バイナリ分類と密な計算のみをサポートします。テストに使用されるハードウェアには、Nvidia A100 および RTX 380 GPU、AMD Radeon Pro 7 GPU、Intel Core E9-10-09020X CPU が含まれます。結果は、CUDA が Nvidia GPU の最速のバックエンドであるのに対し、OpenCL が CPU の最速のバックエンドであることを示しています。 SYCL はユーザーフレンドリーですが、Hipsicle は DPC++ や OpenCL よりも高速で安価に使用できます。さらに、講演者は、FPGA でのパフォーマンスの調査、MPI を介した分散システムのサポートの追加、混合精度計算と NVIDIA のテンソル コアのような特殊な機械学習ハードウェアの使用など、将来の作業についても説明します。

  • 00:00:00 ビデオのこのセクションでは、講演者が、SYCL、OpenCL、CUDA、OpenMP などのさまざまな並列プログラミング言語の比較を紹介し、特に大規模並列サポート ベクター マシン (SVM) 分類での使用法に焦点を当てています。マルチベンダーのハードウェア。講演者はサポート ベクター マシンを紹介し、バイナリ分類のための教師あり機械学習におけるその使用法について概説します。しかしながら、従来のサポートベクターマシンは、凸二次計画問題を逐次的に解くという問題があった。この問題を解決するために、スピーカーは最小二乗サポート ベクター マシンの定式化を使用します。これにより、問題は線形方程式系を解くことに帰着します。講演者は、Parallel Fibonacci と呼ばれるライブラリの実装の詳細についても説明します。

  • 00:05:00 このセクションでは、講演者が最新の C++ で書かれた PLSS VM について説明します。単一のテンプレート パラメーターを使用して、単精度浮動小数点型と倍精度浮動小数点型を切り替えることができます。講演者は、CG アルゴリズムの中で最も計算量が多い部分である行列ベクトル乗算の並列化についても話します。 4 つの異なるバックエンド (OpenMP、CUDA、OpenCL、Signal) を実装し、マルチGPU 実行をサポートしました。ただし、現在サポートされているのはバイナリ分類と密な計算のみであり、そのままの状態でのマルチクラス分類はサポートされていません。さらに、OpenMP バックエンドは他の実装とは大きく異なり、GPU バックエンド (CUDA、OpenCL、SYCL) については 1 つの CG を実装し、それを 3 つのバックエンドすべてに使用して、コードの重複と潜在的なバグを削減しました。

  • 00:10:00 ビデオのこのセクションでは、使用されたハードウェアとテストの方法論が説明されています。焦点は 4 つの異なるプラットフォーム、つまり Nvidia A100 および RTX 380 GPU、AMD Radeon Pro 7 GPU、Intel Core E9-10-09020X CPU にあり、これらの結果について説明します。 Nvidia A100 および RTX 380 GPU の N ポイント スケーリングと、AMD Radeon Pro 7 GPU のデータ ポイントと機能のスケーリングを調べたところ、両方の NVIDIA でデータ ポイントの数が増加するにつれてランタイムが同様に増加することがわかりました。 GPU。これらの中で、Cuda が最も高速なバックエンドであることが判明し、次に OpenCL が続きます。また、N サイト コンピューティングで生成されたルーフライン モデルは、階層カーネルの定式化が ND 範囲の対応するものよりもメモリに依存する傾向があることを示しました。全体として、AMD のランタイムは NVIDIA のランタイムよりも長くなります。

  • 00:15:00 このセクションでは、ビデオで、さまざまなハードウェア プラットフォームでの SYCL、OpenCL、CUDA、および OpenMP のパフォーマンスの比較について説明します。 Nvidia GPU では実行時間の増加は見られず、最速のバックエンドは OpenCL でした。ただし、AMD GPU のパフォーマンスは予想よりも悪く、おそらくブロック サイズが微調整されていないことが原因でした。 Intel Core E9 CPU は Nvidia GPU と同様の動作をし、OpenCL が最速のバックエンドでした。 OpenMP の方が高速な小規模なデータ セットを除いて、DPC++ が最も高速でした。 DPC++ 階層カーネルの定式化は、すべてのハードウェア プラットフォームでインディー レンジの対応物よりも遅く、最適化の可能性があることを示しています。最後に、OpenCL チート コンパイルのオーバーヘッドは、Nvidia GPU で最も速く、Intel Iris Xe Max GPU で最も遅くなりますが、内蔵キャッシュを使用すると、後続の実行でオーバーヘッドを削減できます。

  • 00:20:00 トランスクリプトのこのセクションでは、発表者が、NVIDIA、AMD、Intel など、さまざまなベンダーのハードウェアをターゲットにするためのさまざまな並列プログラミング言語とフレームワークでのテストの結果について説明します。彼らは、NVIDIA GPU のみをターゲットにする必要がある場合、テストで最速のパフォーマンスを示した CUDA が依然として最良の選択肢であると指摘しています。 CPU のみを対象とする場合、OpenMP は良いスタート地点となりますが、テストでは最高のパフォーマンスは得られませんでした。異なるベンダーのハードウェアをターゲットにする必要がある場合は、OpenCL または SYCL をお勧めします。ただし、新しいアルゴリズムを最初から実装する場合は、SYCL の方が使いやすいため、より適しています。 Hipsicle は、安価に使用でき、GPU 上で DPC++ や OpenCL よりも高速な最適なオプションであり、将来的には OpenMP バックエンドを最適化し、ComputeCPP などの他の信号実装を調査する予定です。

  • 00:25:00 このセクションでは、講演者が、さまざまな並列コンピューティング フレームワークを使用したサポート ベクトル分類実装の今後の作業と改善について説明してビデオを締めくくります。彼らは、FPGA などのさまざまなハードウェアでのパフォーマンスを調査し、MPI を介して分散システムのサポートを追加し、混合精度計算と NVIDIA のテンソル コアのような特殊な機械学習ハードウェアの使用の影響を調査する予定です。彼らは、これらの改善により、大規模なデータセットへの実装の速度と効率が向上すると考えています。
2022 Conference Program
2022 Conference Program
  • 2022.05.22
  • Tim Lewis
  • www.iwocl.org
OpenCL allows a programmer to offload a sequence of commands to a heterogeneous accelerator, such as a GPU. For embedded devices the overhead of building a command sequence can be expensive, and many applications require the same pipeline of commands to be repeatedly enqueued in a loop. For example, in computer vision where the same command...
 

libclcxx を使用して OpenCL カーネルでさらにリッチな C++ を実現する ( WOCL / SYCLcon 2022 )



libclcxx を使用して OpenCL カーネルでさらにリッチな C++ を実現

このビデオでは、オープンソース カーネル開発への C++ ライブラリの統合を可能にする libclcxx の使用について説明します。このプロジェクトは、より多くの C++ 機能を開発者に公開することを目的として、C++ でのメタ プログラミングに不可欠なライブラリである型特性を統合します。このビデオでは、型特性ライブラリがアドレス空間とベクトル型を操作する機能を通じて OpenCL カーネルのパフォーマンスを最適化する方法を紹介します。このビデオでは、開発者がライブラリを試して、C++ との互換性を最大限に高めながら開発サイクルの短縮に貢献することを奨励しています。このライブラリは、C++ リファレンス ページと同様のスタイルで酸素のドキュメントを提供し、開発者が新しい機能を簡単にナビゲートできるようにします。

  • 00:00:00 このセクションでは、Anastasia の Stulova が、オープン ソース カーネル開発で C++ ライブラリを使用できるようにするための lipclcxx の使用について説明します。 C++ for OpenCL カーネル言語には C++ 機能がありますが、ライブラリのサポートがないため、提示されている制限に対処することが重要です。その結果、オープンソース カーネル開発者にさらに多くの C++ 機能を公開することを目的として、lipcxcxx を統合する Leap clcxx プロジェクトが作成されました。さらに、Tulva 氏は、typetraits は C++ での完全なメタ プログラミングを容易にするために不可欠なライブラリであり、名前空間 std を拡張して既存の特性の特殊化を提供すると同時に、オープン セル ベクトル型などの新しい特性を追加すると主張しています。新しいライブラリは、C++ リファレンス ページと同様のスタイルで酸素のドキュメントを提供し、開発者が新しい機能を簡単にナビゲートできるようにします。

  • 00:05:00 このセクションでは、ビデオでは、特にアドレス空間とベクトルのトレードに関して、型特性ライブラリの使用によって OpenCL カーネルのパフォーマンスがどのように向上するかについて説明します。このビデオでは、ライブラリを使用してさまざまなポインター型のテンプレート関数を作成する方法と、型からアドレス空間を削除することで OpenCL 環境の問題をどのように解決できるかを示す例が提供されています。さらに、ビデオでは、ベクトル サイズのトレードを含めることで計算がどのように効率化されるかを示し、リダクション アルゴリズムの実装をベクトル タイプにどのように適用できるかを強調しています。全体として、OpenCL カーネルで型トレードを使用すると、さらにリッチな C++ プログラミングが可能になります。

  • 00:10:00 このセクションでは、ベクトル サイズを条件として OpenCL カーネルでアラーム追加関数を定義する方法を講演者が説明します。ベクトル サイズが異なると、異なる実装が選択され、渡された型がベクトル型でない場合はバッファから 1 つの項目が返されることが明確にされています。講演者はまた、開発サイクルを短縮するために、実験して貢献し、C++ との最大限の互換性を得るように開発者に勧めます。不足している機能やバグに関するフィードバックを要求し、プロジェクト ページ上の既存の問題に関するディスカッションに参加することを奨励します。
Reaching Even Richer C++ in OpenCL Kernels with use of libclcxx
Reaching Even Richer C++ in OpenCL Kernels with use of libclcxx
  • 2022.05.22
  • www.youtube.com
Presented at: IWOCL / SYCLcon 2022.Additional Information and Slides: https://www.iwocl.org/iwocl-2022/programIWOCL NewsletterSignup to receive regular updat...
 

OpenCL を超えた SYCL: hipSYCL のアーキテクチャ、現状、将来の方向性 (IWOCL / SYCLcon 2020)



OpenCL を超えた SYCL: hipSYCL のアーキテクチャ、現状、将来の方向性

hipSYCL プロジェクトは、OpenCL ではなく HIP プログラミング モデルを通じて GPU をターゲットとする SYCL のオープンソース実装です。これは、コンパイラ コンポーネント、シックル インターフェイス、および安全なランタイムで構成されます。セキュア コンパイラはカーネルを識別し、ローカル メモリ割り当てを処理し、シグナリング メカニズムを実装します。ディスパッチ関数は、ユーザーが提供したカーネルに基づいて特定のアイテムを作成し、最適化された関数をrock primで定義できます。将来の方向性は、複数のバックエンドを許可し、静的コンパイル モデルの制限を取り除くことです。操作送信モデルは、より高いタスク スループットを実現するためにバッチ送信に移行しており、hipSYCL はソース コード レベルで相互運用可能であり、hip および CUDA との混合と一致が可能です。オープンソース プロジェクトとして、貢献者を歓迎します。

  • 00:00:00 このセクションでは、講演者が hipSYCL プロジェクトの背後にある動機について説明します。hipSYCL プロジェクトは、OpenCL を使用する代わりに HIP プログラミング モデルを通じて GPU を直接ターゲットにするオープンソース SYCL 実装です。目的は、他のプログラミング モデルで発生する可能性のある導入の摩擦を回避しながら、コードを最適化し、ベンダー提供のプロファイラーとデバッガーを使いやすくすることです。講演者はまた、hipSYCL を SYCL および CUDA の相互運用性で利用可能な他のソリューションと比較し、HIP プログラミング モデルを使用しているため、hipSYCL を CUDA の相互運用性の最終段階に位置づけています。

  • 00:05:00 このセクションでは、ビデオで hipSYCL がどのように動作するか、およびその 3 つの主要コンポーネント (コンパイラ コンポーネント、シックル インターフェイス、セキュア ランタイム) について説明します。コンパイラ コンポーネントにより、コンパイラは CUDA と鎌の両方を理解できるようになり、ソース コード レベルでの相互運用性が可能になります。セキュア ランタイムはデータ管理とタスクのスケジューリングを処理し、一方、sickle インターフェイスは、sickle 名前空間内のクラスと関数で構成されます。さらにビデオでは、sickle は考えられるすべてのユースケースをカバーする実装を構築するために使用できる柔軟なソリューションであると述べています。アクセラレータをターゲットにするには、カーネルを識別してアクセラレータ用にコンパイルする専用のコンパイラ コンポーネントが必要です。

  • 00:10:00 ビデオのこのセクションでは、講演者が hipSYCL の安全なコンパイラがどのように機能するかについて説明します。彼らは、コンパイラがカーネルを識別し、どのコードをデバイスに出力する必要があるかを判断し、ローカル メモリ内でカーネルをどのように割り当てるかを処理する必要があると説明しています。鎌特有の診断機能も将来の開発の優先事項として言及されています。講演者は、Cycle CC と呼ばれるコンパイラー ラッパーを使用することで、ヒップ セキュア コンパイラー コンポーネントの使用が比較的簡単であり、コンパイラーの正しい呼び出しとリンク、インクルード パスの設定方法などの複雑さを隠蔽していると説明します。彼らは、カーネルを呼び出すには少々のトリックが必要であることと、それがどのように行われるかを説明します。さらに、現時点ではコルーチンと Hip イベントを使用したシグナリング メカニズムが、動的なアウトオブオーダー処理のために hipSYCL で使用されていますが、これのマイナス面についても説明します。

  • 00:15:00 このセクションでは、講演者は、ディスパッチ関数を使用してユーザー提供のカーネルに基づいて特定のアイテムを作成する方法と、ユーザー提供のカーネルでディスパッチ関数をインスタンス化することによって並列 for および secure を実装する方法について説明します。カーネル。ただし、最初は、すべてのコードがホスト コードとして渡されます。ここで、ユーザー提供のカーネルはホスト ラムダであり、直接呼び出すことができないため、HIP カーネルと呼ばれるダミー属性が追加されます。この属性は、適切なクリックによってのみ置き換えられます。初期解析が完了し、hipSYCL プラグインが引き継いだ後の属性。 HipSYCL と CUDA の両方で優れたメモリ パフォーマンスを実現し、hipSYCL を使用することで、ソース コード レベルで Hip と CUDA の相互運用性を実現できます。

  • 00:20:00 このセクションでは、講演者はイプシロンを使用したロックプリムを使用して最適化されたリダクションを実装する方法について説明します。彼らは、マクロ zip secure platform cuda を使用して最適化された関数を定義するか、ホストとデバイスとしてマークされている良いプラットフォーム Rockem を定義することを提案しています。ターゲット プラットフォーム用にコンパイルする場合は、最適化された関数が呼び出されますが、それ以外の場合はフォールバック関数が呼び出されます。講演者は、rock prim のようなベンダーに最適化されたライブラリは、ターゲット ハードウェアに関するより多くの知識を持っているため、より高速なパフォーマンスを実現します。hipSYCL はまだ適合前であり、イメージやオープン ステートの相互運用性などのいくつかの機能が欠けていますが、実際の用途にはまだ使用できると説明しました。 -世界のアプリケーション。ただし、純粋なライブラリ サイクルの実装に問題があるため、CPU パック上で調整された並列フォールは遅くなります。

  • 00:25:00 このセクションでは、講演者が、基本並列形式または階層並列形式を使用した場合と、CPU 上の hipSYCL で nd range 並列形式を使用した場合のパフォーマンスの違いについて説明します。後者では、各ワーク グループ内の作業項目と同じ数の脅威を起動する必要があるため、パフォーマンスが大幅に低下します。次に講演者は、hipSYCL の将来の方向性について語ります。それは、任意のバックエンドを同時にアクティブにすることを可能にし、静的コンパイル モデルに関する制限を取り除く新しいランタイムを作成することです。また、ハードウェア使用率を最適化するために、n 個の循環使用が M 個のバックエンド キューにマップされるエンドツーエンド マッピングにも移行しています。さらに、メンテナンスと実験を容易にするために、新しいランタイムと既存の SYCL インターフェイスが厳密に分離されます。

  • 00:30:00 このセクションでは、講演者が hipSYCL の操作サブミット モデルに加えられた改善について説明します。シグナルベースの送信モデルからバッチ送信モデルに移行しています。このモデルでは、処理が完了したことをランタイムに通知するのが操作のバッチごとに 1 回だけ行われるため、タスクのスループットが向上します。講演者は、オペレーションが送信され、デッキ ビルダーによって処理され、オペレーションが収集および発注されるプロセスについて説明します。次に、デッキ スケジューラは、実行キューをオペレーションに割り当てます。その後、そのキューがバックエンド エグゼキュータに送られ、カーネルが実行され、どのような同期オペレーションが必要であるかが判断されます。この構成のコスト見積もりはデッキ スケジューラに戻され、さらに最適化されるか、そのままの操作が送信されます。講演者は、パッケージ リポジトリとインストール スクリプトを通じて hipSYCL を入手する方法についても説明します。

  • 00:35:00 このセクションでは、hipSYCL が CPU、ビデオ GPU、および AMD GPU 用の SICL の実装であることについて説明します。これは、低レベルのベンダー API ヒップおよび CUDA の上に構築されているため、ソース コード レベルで相互運用可能です。これにより、開発者は Hip と CUDA を組み合わせて使用できるため、最新の低レベルのハードウェア最適化やベンダー最適化ライブラリへのアクセスを必要とするさまざまな HPC やその他のユースケースに適しています。さらに、特定のハードウェア向けに高度に最適化されたコード パスの作成が可能になり、カーネルのパフォーマンスは通常の Hip または CUDA と同等になることが期待されます。オープンソース プロジェクトとして、貢献者はいつでも歓迎されており、興味のある人は GitHub ページで詳細を学ぶことができます。
SYCL beyond OpenCL: The architecture, current state and future direction of hipSYCL
SYCL beyond OpenCL: The architecture, current state and future direction of hipSYCL
  • 2020.04.28
  • www.youtube.com
This video was presented at the online version of IWOCL / SYCLcon 2020.Authors: Aksel Alpay and Vincent Heuveline (Heidelberg University) Additional Informat...
 

SYCL: 未来はオープン、並列、異種混合 (Core C++ 2022 )



SYCL: 未来はオープン、パラレル、異種混合です

SYCL プログラミングに関するこのビデオでは、複雑なモデルにはアクセラレータ システムによって処理能力の向上が必要となるため、生産性を向上させ、より多くの開発者を引きつけるために抽象化レベルを上げる必要性を強調しています。ソフトウェアのポータビリティと OneAPI は、デバイスが CPU、GPU、およびその他のデバイスで動作できるようにするため、その重要性が強調されています。オープン、並列、異種混合プログラミング モデルである SYCL の利点についても説明し、講演者はコードを最適化しパフォーマンスを向上させるために利用できる多数のオンライン リソースとツールを強調しました。講演者は視聴者に、oneapi.io とその YouTube チャンネルにアクセスしてリソースやサポートを求めるよう勧めています。

  • 00:00:00 このセクションでは、生産性を向上させ、より多くの開発者を引き付けるために抽象化レベルを上げる必要性について講演者が説明します。モデルがより複雑になるにつれて、計算能力の需要が急速に増加します。講演者は忍者ギャップについて言及しており、これはアセンブリや Cuda 開発者などの下位レベルの専門家を見つけて雇用することの難しさを指します。抽象化レベルを上げるとパフォーマンスの低下につながるため、増大する計算能力の需要を満たすために GPU や GAUDI などの AI アクセラレータが必要になります。

  • 00:05:00 このセクションでは、講演者は最速のパフォーマンスを達成するためのアクセラレータの必要性について説明しますが、アプリケーションの全範囲をカバーするには 1 つのアクセラレータでは不十分であると述べています。 ASIC のようなアクセラレータと CPU など、CPU とアクセラレータを組み合わせた異種システムが必要です。講演者は、ソフトウェアの移植性と、使用するハードウェアに関係なく、プラットフォームやオペレーティング システムごとに再コーディング、再コンパイル、再構築する必要がなく、コードがあらゆるマシンやデバイス上で実行できることの重要性を強調しました。 OneAPI は、ソフトウェア スタックを合理化し、ライブラリとツールを統合してオープン、無料、クロスデバイスのソフトウェア ポータビリティを確保する業界の取り組みです。つまり、ソフトウェア スタックは CPU、GPU、その他のデバイスで動作できます。 OneAPI は、開始するために必要なものがすべて揃った基本ツールキットを提供します。

  • 00:10:00 このセクションでは、講演者は、OneAPI ベースのツールキットを使用することの威力と、C++ ライブラリに異種混合性を追加するように設計された Data Policy++ コンパイラの概念について説明します。事前定義されたポリシーを使用すると、OpenCL や CUDA の下位レベルの詳細をあまり知らなくても、CPU や GPU に簡単にアクセスできます。コンパイラは、周囲にあるメモリを制御して切り離し、例外コードを処理し、並列コンピューティングを作成する機能を提供します。

  • 00:15:00 ビデオのこのセクションでは、講演者は、優れたヘテロジニアス コンピューティング機能を実現するには、3 つのことが必要であると説明しています。 1 つ目は、デバイスを検出してその情報を取得する機能です。ここで、スピーカーは、システムに接続されているすべてのデバイスを検出して一覧表示する簡単なコードを示します。 2 番目の要件は、デバイスのステータスに関するリアルタイムの情報です。これにより、使用率と温度の監視が可能になり、ユーザーが CPU と GPU を切り替えることもできます。 3 番目の要件は、デバイスとホスト間でメモリを効率的かつシームレスに交換できる機能です。これは、SYCL の 2 つの主な方法、バッファと統合チャート メモリを通じて実現されます。

  • 00:20:00 このセクションでは、講演者が、オープン、並列、異種混合プログラミング モデルである SYCL を使用する利点について説明します。 SYCL を C++ に追加すると、GPU、CPU、ARM、FPGA などの複数のデバイスで実行できるコードを作成できます。講演者は、SYCL を複数のデバイスで動作させる方法のオンライン リソースや例が多数あると述べました。 Intel Advisor は講演者が推奨するツールで、コードの最適化に役立ち、特定の機能を GPU にオフロードするオプションを提供します。講演者は、コードの実行を大幅に高速化し、プログラム全体のパフォーマンスを向上させることができるこのツールを使用することの重要性を強調しました。

  • 00:25:00 このセクションでは、講演者は、複数のベンダーが複数のデバイスでコードを利用できるようにする最速の方法として SYCL を使用することを推奨し、リソースとサポートについては oneapi.io Web サイトと彼の YouTube チャンネルにアクセスするよう視聴者に勧めています。彼はまた、特定の例では SYCL が CUDA よりも高速である可能性にも言及していますが、SYCL の主な利点は移植性であることを強調しています。SYCL を使用すると、さまざまなデバイスで実行できる単一のプラットフォームにコーディングできるため、複数のプラットフォームを作成する必要がなくなります。さまざまなデバイスに応じたコーディングの決定。さらに、講演者はあらゆる質問に答え、ユーザーが SYCL を使い始めるのに役立つ Jupyter ノートブックや Intel Devcloud へのアクセスなどのリソースを提供します。
Core C++ 2023
Core C++ 2023
  • Oleh Zasadnyy, GDG Lviv
  • corecpp.org
Core C++ 2023
 

Python での GPU アクセラレーション



Python での GPU アクセラレーション

このビデオでは、グラフィックス プロセッシング ユニットの能力を活用して Python プログラミングで GPU アクセラレーションを実現する方法を説明しています。これにより、データ並列処理により最大 10 倍の速度向上が可能になります。 GPU コンピューティングの 2 つの標準である OpenCL と CUDA が簡単に紹介され、ビデオでは Python での行列乗算に Pi OpenCL と CUDA を使用する方法が示されています。講演者は、行列乗算のためのグローバル メモリとカーネルの使用法を説明し、行列と行列の積の 1 つの要素を計算するために使用されるアルゴリズムについても説明します。 C と Python による GPU アクセラレーションのコードについて、行列の内部表現とメモリ割り当ての理解に重点を置いて説明します。講義の演習は、GPU コンピューティングをさらに探求するための基礎を提供します。

  • 00:00:00 このセクションでは、ビデオでは、データの並列処理を実現し、グラフィックス処理ユニットの能力を活用してプログラムを高速化する方法として GPU コンピューティングを紹介します。グラフィックス処理ユニットは、1 秒あたり数十億回の浮動小数点演算を処理し、高速化を実現します。 GPU コンピューティングの 2 つの標準である OpenCL と CUDA が、Nvidia の Kepler、Pascal、Volta などのハイエンド GPU の例とともに簡単に紹介されます。 GPU コンピューティングの大規模並列の側面は、GPU を占有状態に保つ方法として強調されており、多くの場合、十分な数のスレッドのスケジューリングが必要になります。このビデオでは、科学および工学分野におけるハードウェア アクセラレータの潜在的な応用についても言及しています。

  • 00:05:00 ビデオのこのセクションでは、講演者が 1 テラフロップスのピーク パフォーマンスを備えた Kepler から、7.9 テラフロップスを超える現行世代に至る GPU アクセラレーションの進化について説明します。超並列コンピューティングのプログラミング モデルは、単一命令複数データのアプローチに従っており、データはスレッドのブロックに分割され、各ブロックは少なくとも 1 つのスレッドを実行します。講演者は、並列プログラミングのオープン スタンダードであるオープン コンピューティング言語について触れ、GPU コンピューティングに加えてマルチコアおよびマルチスレッド コンピューティングをカバーします。

  • 00:10:00 このセクションでは、講演者が Python での GPU アクセラレーションのための OpenCL と Pi OpenCL の使用について説明します。 OpenCL は、もともと NVIDIA グラフィックス カードでサポートされていたが、廃止された一般標準です。ただし、Apple が始めたものなので、MacBook ではうまく動作します。 Pi OpenCL は定型コードを削減し、カーネルに集中しやすくすることで OpenCL プログラミングを簡素化します。 NumPy 配列もサポートしていますが、データの並列処理によりデータ構造がより制限されます。講演者は、テスト目的で 2 つの整数行列の行列乗算に Pi OpenCL を使用する方法をデモンストレーションします。

  • 00:15:00 このセクションでは、講演者が OpenCL を使用して Python で行列乗算に GPU を使用する方法を説明します。まず、OpenCL や NumPy などの必要なライブラリをインポートします。講演者はまた、使用したグラフィックス カードが 64 ビット演算をサポートしていないため、32 ビット浮動小数点演算を選択したことにも言及しました。次に、行列を定義し、ランダムな整数を生成し、そのタイプを 32 ビットのフロー行列に変更します。次に、講演者は、デバイス上で対応する行列を定義し、キューを作成する際に必要な定型コードについて説明します。最後に、講演者はプログラムの実行時にコンパイルされる行列乗算用のカーネルを定義し、GPU で行列を乗算する方法をデモンストレーションします。

  • 00:20:00 このセクションでは、講演者が Python プログラミングにおける GPU アクセラレーションの文脈における「グローバル」の概念を説明します。 Global は、行列がグラフィックス カードのグローバル メモリに存在し、すべてのスレッドにデータへのアクセスを提供することを示します。ディメンションは短い整数として渡され、各スレッドには一意の識別番号が付けられます。行列の乗算プロセスは、行列の行と列のインデックス付けを通じてほぼすべての部分を独立して実行できるため、GPU アクセラレーションの恩恵を受けます。行列は C 言語で 1 つの長い配列として保存され、ポインタによってメモリ内の位置が決定されます。

  • 00:25:00 このセクションでは、講演者が行列-行列積の 1 つの要素を計算するための C アルゴリズムと、一般に行列の次元での 3 次演算である行列-行列乗算の潜在的な高速化について説明します。ただし、GPU とカーネルの起動を使用すると、操作を線形に簡素化できるため、コストが大幅に削減され、速度が大幅に向上します。講演者はまた、操作を実行する最も簡単な方法は Python を使用し、明示的にコンパイルする必要がない一方で、スーパーコンピューターで使用される実際のアルゴリズムでは GPU 上の共有メモリと、本書で説明されている内容を超えるコンパイル プロセスを利用することにも言及しました。ビデオ。講演者は、PiCUDA と PiOpenCL を使用すると、プログラマは下位レベルのコンパイルおよびリンク プロセスを気にすることなく、より高いレベルでコードを開発できるという考えを強調しました。

  • 00:30:00 このセクションでは、ビデオで Python での GPU アクセラレーションのための CUDA のインストールについて説明します。 CUDA を使用するには、ユーザーは NVIDIA GPU とドライバーをインストールする必要があります。講義では、システムが適切にセットアップされているかどうかを確認するための手順が説明され、発表者は、この技術が高度にインタラクティブな並列コンピューティングであると述べています。講師は、優れたグラフィックス カードを搭載したハイエンドのラップトップから優れたパフォーマンスを得ることができると説明します。次に、コースでは例として行列の乗算を紹介します。発表者は、通常はプログラムを CPU 上で実行する必要があり、GPU は計算負荷の高い部分のみを高速化すると述べています。最後に、講義では、GPU 上の対応する行列へのメモリの割り当てと、結果の行列の初期化について説明し、NumPy による割り当ては C による割り当てよりも優れていると述べています。さらに、この段階ではコンパイルは必要ありません。

  • 00:35:00 このセクションでは、C での GPU アクセラレーションのコードについて説明します。 C の行列は行単位で格納され、コードはこの事実を利用します。 2 次元構造でスレッドのブロックを起動するための構文は、スレッドを明示的に計算するために使用されます。明示的に括弧で囲んだループは、ポインター演算を回避するために使用されます。この関数は次元とデータへのポインターを受け取ります。これには、入力の行列 A と B、および結果の行列 C_gpu が含まれます。 GPU によって実行されるカーネル関数内の関数内での印刷は不可能な場合があるため、デバイスへのメモリ コピーは印刷前に終了する必要があり、デバイスからホストへのメモリ コピーはデータを印刷する前に実行する必要があります。最後に、pyCUDA は piOpenCL や PyCUDA よりも新しいものであると述べて、この議論は終了します。

  • 00:40:00 このセクションでは、講演者が Python での GPU アクセラレーションについて説明します。これは CUDA を対象としていますが、他の GPU で実行するための取り組みも進行中です。コンパイルと実行の両方を処理するため、後続の実行が大幅に高速になります。スクリプト環境内に留まりながら、Python で GPU カーネルを開発することが可能です。ただし、GPU がどのように動作するか、および C 構文を使用して内部で行列がどのように表現されるかを理解する必要があります。講義の演習は自由に行うことができ、GPU コンピューティングを探求する 2 番目のプロジェクトの基礎を提供できます。全体として、これはプログラマーやソフトウェア開発者が GPU で実行される機能を開発する方法についてのアイデアを提供することを目的とした入門セクションでした。
GPU acceleration in Python
GPU acceleration in Python
  • 2022.02.10
  • www.youtube.com
This lecture introduces PyOpenCL and PyCUDA to define and run functions on General Purpose Graphics Processing Units (GPUs). The running example is a basic ...
 

OpenCL 3.0 発表プレゼンテーション (IWOCL / SYCLcon 2020)



OpenCL 3.0 発表プレゼンテーション

このビデオでは、業界における低レベルの並列プログラミングにおける OpenCL 3.0 の重要性に焦点を当てて、OpenCL 3.0 のリリースについて説明します。 OpenCL 3.0 は API に新しい機能を追加しませんが、OpenCL がより多くの開発者やデバイスに利用できるようにするためのエコシステムの再調整を提供します。発表者は、DSP ライト プロセッサの拡張機能の追加、将来の機能のロードマップ、OpenCL Vulcan のスピリット カーネルを生成できるオープンソース カーネル言語コンパイラの成長するエコシステムについても説明します。作業グループが今後数か月にわたる実装の第一波に向けて準備を進める中、仕様を最終決定するためにユーザーからのフィードバックが奨励されています。

  • 00:00:00 このセクションでは、NVIDIA と Khronos グループの Neil Travis が、OpenCL 3.0 の立ち上げと、業界における低レベル並列プログラミングの標準の重要性について説明します。 OpenCL は GPU ベンダーによって広く使用されており、アプリケーション、エンジン、ライブラリでの使用が増えています。 OpenCL 3.0 のリリースは、OpenCL がさらに多くの開発者やデバイスに利用できるようにすることを目的として、API に新しい機能を追加するのではなく、エコシステムの再調整を提供します。 OpenCL 3.0 では、ポイントを超えたすべての 2x 機能がオプションになり、ベンダーは顧客に必要な機能の提供に集中できるようになり、コア機能の水準を引き上げる機会がリセットされます。

  • 00:05:00 このセクションでは、OpenCL 3.0 は、グローバルとグローバルの間で 2D および 3D データを転送するための DSP ライト プロセッサ用の拡張機能が追加された、すべての OpenCL 2.x 機能をクエリするように設計された統合 API を同梱する新しい仕様であると説明されています。ダイレクト メモリ アクセス (DMA) トランザクションを介して、ローカル メモリを柔軟かつ非同期に保存します。 OpenCL 3.0 には OpenCL C++ 仕様は含まれていませんが、他の実装では C++ for OpenCL オープン ソース フロントエンド コンパイラを使用して、OpenCL C と C++17 の多くを混合して Spir-V カーネルを生成することが推奨されています。 OpenCL のロードマップには、業界での採用に向けて最初に拡張機能として新機能を出荷し、将来のコア仕様に組み込む前に機能を成熟させて実証できるようにすることが含まれています。 OpenCL ワーキング グループは、プロファイルを、実装の柔軟性とアプリケーションの移植性のバランスをとり、ターゲット市場の断片化を回避するための重要なツールともみなしています。

  • 00:10:00 このセクションでは、発表者は、OpenCL Vulcan 用のスピリット カーネルを生成したり、他の API で実行するシェーダーにさらに変換したりできる、clang や lvm を含むオープンソース カーネル言語コンパイラの成長するエコシステムについて説明します。金属として。これにより、OpenCL ドライバーを使用せずに Apple プラットフォーム上で OpenCL アプリケーションを使用できるようになります。発表者は、オープンソース変換パイプラインを使用して LLVM で生成されたスピリット カーネルを DXi L に変換する OpenCL 12 プロジェクトについても言及し、言語コンパイラーがランタイムから独立して革新できるようにします。 OpenCL 3 の仕様は暫定的なものであり、作業グループが今後数か月にわたる実装の第 1 波に向けて準備を進める中で、仕様を最終決定するためにユーザーからのフィードバックが奨励されます。
OpenCL 3.0 Launch Presentation
OpenCL 3.0 Launch Presentation
  • 2020.05.07
  • www.youtube.com
This video was presented as part of the panel discussion at the online version of IWOCL / SYCLcon 2020, and was presented by Neil Trevett, Khronos Group Pres...
理由: