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

 

16. OpenCL の例: 画像の回転



16. OpenCL の例: 画像の回転

このビデオでは、画像の回転と、OpenCL を使用してそれを実装する方法について説明します。画像内の各ピクセルには座標があり、特定のカラー スケールを表します。回転には、元の座標と新しい座標および回転角度を考慮した式に基づいてピクセルを新しい位置に移動することが含まれます。講演者は、単一ピクセルの新しい位置を計算するために各ワークアイテムを割り当てることを提案し、入力分解を使用してグローバル ワークスペース全体をより小さなワーク グループに分割し、操作をより効率的に実行できるようにします。デバイス上のバッファからホスト上のバッファに画像を転送するプロセスについても、エラーのチェックと経過時間の計算に重点を置いて説明します。

  • 00:00:00 このセクションでは、ビデオで画像の回転とその背後にある計算について説明します。画像内の各ピクセルには座標があり、特定のカラー スケールを表すことが説明されています。回転には、元の座標と新しい座標および回転角度を考慮した式に基づいて、ピクセルを新しい位置に移動することが含まれます。このビデオでは、各ワークアイテムを割り当てて単一ピクセルの新しい位置を計算し、入力分解を使用してグローバル ワークスペース全体を小さなワーク グループに分割して、操作をより効率的にすることを提案しています。

  • 00:05:00 このセクションでは、画像の回転を実装するために OpenCL で画像をワーク グループに分割する方法を講演者が説明します。画像は水平領域と垂直領域に分割され、それぞれに画像の幅と高さが 16 の倍数であると仮定した 16 の作業グループがあります。次に、講演者は、画像の回転を実行するために使用されるカーネル関数を紹介します。この関数は、元の関数などの引数を受け取ります。宛先データ、画像の寸法、回転パラメータ。カーネル関数内で、スピーカーは、回転パラメーターを使用して各ピクセルの新しい位置がどのように計算されるか、および境界チェックを実行した後にピクセルのコンテンツが元の位置から新しい位置にどのようにコピーされるかを説明します。

  • 00:10:00 このセクションでは、OpenCL を使用して画像を回転する方法を講演者が説明します。このプロセスには、座標をチェックし、それらが画像の寸法内で正の値であることを確認することが含まれます。次に、物理メモリの位置を決定する計算を使用して、ピクセル情報が元の位置から新しい位置にコピーされます。このセクションにリストされているコード例は、この実装と以前の行列乗算の違いを示しています。 OpenCL API の C++ バインディングは、プラットフォームへのクエリ、デバイスの取得、コマンド キューの作成、およびデータ移動用のバッファーの宣言を行うための環境をセットアップするために使用されます。カーネルがコンパイルされ、カーネルを実行するためのパラメータが設定されます。これは、結果をホストに読み取ることで完了します。

  • 00:15:00 このセクションでは、講演者がデバイス上のバッファからホスト上のバッファに画像を転送するプロセスについて説明します。講演者は、このプロセスには clEnqueueReadBuffer 関数を使用してデバイス上のバッファを読み取り、サイズ、オフセット、およびホスト上のバッファへのポインタを指定することが含まれると説明しました。さらに、講演者は、if ステートメントを使用してこのプロセス中にエラーをチェックすることの重要性を指摘し、clGetEventProfilingInfo 関数を使用してコードのこの部分の経過時間を計算する方法を示しました。
OpenCL Example: Image Rotation
OpenCL Example: Image Rotation
  • 2020.06.05
  • www.youtube.com
This video explains the math behind the image rotation and the code implementation.
 

17. OpenCL サンプル画像回転デモ



17. OpenCL サンプル画像回転デモ

「OpenCL サンプル イメージ回転デモ」チュートリアルでは、プログラムが処理する C コードとイメージ ファイルを含むさまざまなフォルダーを含むデモのソース コードについて説明します。このビデオでは、入力イメージと出力イメージのバッファーの作成、元のイメージのデバイス バッファーへのコピー、カーネル引数の設定、イメージ全体として定義されたグローバル サイズでのカーネルの実行、出力データのホストへの読み取りまでを説明します。カーネル関数は回転パラメータを受け取り、各ピクセルの新しい座標を計算し、境界チェックを使用してピクセル情報を新しい位置にコピーします。このプログラムには、回転した画像を BMP 形式で保存する機能も含まれており、完了後にすべてのリソースが解放されます。デモでは、元の画像のピクセルを正常に読み取り、計算して、回転された画像を作成します。

  • 00:00:00このセクションでは、プレゼンターが画像回転デモのソース コードの概要を説明します。これには、メインおよびサポート C コード ファイルを含むさまざまなフォルダーと、プログラムが処理する画像ファイルが含まれます。このコードには、Mac OS および Altera OpenCL プラットフォーム用のヘッダー ファイル、バッファーおよびカーネル パラメーターの定義が含まれており、イメージ ファイルを開いたり、その形式を変換したりするためのサポート関数を利用します。このコードには、出力バッファの作成と乱数による初期化も含まれています。最後に、コードはコマンド キュー、プログラム オブジェクト、およびカーネル オブジェクトを作成し、カーネル関数名を指定します。

  • 00:05:00このセクションでは、スピーカーは入力および出力イメージのバッファーの作成、元のイメージのデバイス バッファーへのコピー、カーネル引数の設定、イメージ全体として定義されたグローバル サイズでカーネルの実行のプロセスを説明します。そして出力データをホストに読み戻します。カーネル関数は、宛先およびソースのバッファー ポインター、画像の寸法、および回転パラメーターを受け取り、各ピクセルの新しい座標を計算し、境界チェックを使用してピクセル情報を新しい位置にコピーします。このプログラムには、回転した画像を BMP 形式で保存する機能も含まれており、完了後にすべてのリソースが解放されます。

  • 00:10:00このセクションでは、講演者が Avatar FPGA プラットフォームを使用した OpenCL サンプル画像回転デモをデモンストレーションします。これは、猫の元の画像を取得し、それを時計回りに 45 度回転させ、保存されるものと同じサイズの新しい画像を生成します。画像回転フォルダーに新しい名前が付けられます。このデモでは、元の画像のピクセルを正常に読み取って計算して、回転された画像を作成することが示されています。
OpenCL Example Image Rotation Demo
OpenCL Example Image Rotation Demo
  • 2020.06.05
  • www.youtube.com
This video walks through the code of Image Rotation and demonstrates the results.
 

18. OpenCL の例: 画像の畳み込み



18. OpenCL の例: 画像の畳み込み

「OpenCL の例: 画像コンボリューション」ビデオでは、ぼかしフィルターなどのフィルターを適用することで、隣接するピクセルからの情報を使用して画像内の各ピクセルを変更する画像コンボリューションについて説明します。このビデオでは、画像畳み込み関数のシード実装を提供し、画像データ型用に設計された OpenCL の「画像」データ構造を紹介して、グラフィックス プロセッサでの効率的な処理を可能にします。このビデオでは、OpenCL を使用して画像畳み込み作業を行うために画像とフィルター データをデバイスにコピーする方法と、画像にアクセスするための OpenCL サンプラー オブジェクトの使用方法を示します。このビデオでは、ワークアイテムを取得し、フィルターの行と列を反復処理して画像オブジェクトからピクセル情報を取得し、それらをフィルター ピクセルと乗算し、それらを sum 変数に累積する方法も示します。最後に、ビデオでは、OpenCL 画像オブジェクトを使用してピクセル値を更新する方法を示します。

  • 00:00:00 このセクションでは、ビデオで画像の畳み込みについて説明します。これは、隣接するピクセルからの情報を使用して画像内の各ピクセルの値を変更する操作です。これは、ぼかしフィルターなどのフィルターを元の画像に適用することによって行われます。このフィルターは、隣接するピクセルの加重平均を取得して、それらの値の差を減らします。このビデオでは、3x3 フィルターを画像の小さな領域に適用し、要素ごとの乗算と合計を使用して、フィルターされた画像内の各新しいピクセルの値を計算する方法を示します。ただし、ビデオでは、このようなフィルタリング操作を画像全体に適用する場合、隣接する 8 つのピクセルすべてを持たない境界ピクセルについて慎重に考慮する必要があると述べています。このビデオでは、ぼかしやエッジ検出など、画像に適用してさまざまな効果を実現できるいくつかのフィルターの例も示しています。

  • 00:05:00 「OpenCL の例: 画像畳み込み」ビデオのこのセクションでは、講演者は、画像のすべてのピクセルを調べてフィルターを適用する画像畳み込み関数のシード実装を提供します。また、画像データ型用に特別に設計された「image」と呼ばれる新しいデータ構造を OpenCL に導入し、グラフィックス プロセッサでより効率的に処理できる長い命令シーケンスを可能にします。画像オブジェクトは、指定された形式、サイズ、その他のパラメーターを使用して作成できます。このビデオでは、デバイス側で 2D 画像バッファーを作成する方法を示します。

  • 00:10:00 セクションでは、OpenCL を使用した画像畳み込み作業のために、画像とフィルター データをデバイスにコピーするプロセスについて説明します。このセクションでは、画像にアクセスする方法を説明するために使用される OpenCL サンプラー オブジェクトについても紹介します。アドレッシング モード、フィルタリング モード、および正規化された座標の使用は、サンプラー オブジェクトに対して指定されます。このセクションでは、カーネル関数と、オブジェクト プロパティを指定するための「read-only」および「constant」キーワードの使用についても説明します。これにより、OpenCL ランタイムがグローバル メモリ内の特定の定数領域にフィルター オブジェクトを配置できるようになります。

  • 00:15:00 OpenCL 画像畳み込み例のこのセクションでは、講演者は get_global_id を使用してワークアイテムを取得し、フィルターの半値幅を計算し、フィルター インデックスを初期化し、フィルターの行と列を反復処理する手順を実行します。 、そして read_image 関数を使用して画像オブジェクトからピクセル情報を取得します。次に、ピクセル情報がフィルター内のピクセルと乗算され、sum 変数に蓄積されます。このプロセスはフィルター内のすべてのピクセルに対して繰り返され、画像の畳み込みで隣接するピクセル情報を使用できるようになります。

  • 00:20:00 このセクションでは、ビデオ チュートリアルで、画像オブジェクトを使用して OpenCL 画像畳み込みのピクセル値を更新する方法を示します。カーネルが正常に実行されたら、次のステップは、Q 読み取りイメージで CL を使用してイメージを読み取り直すことです。この関数は、最初の引数としてコマンド Q、出力イメージ オブジェクト、および完了まで読み取りをブロックする必要があることを示す true 値を受け取ります。画像オブジェクトの作成に使用される原点と領域のパラメータが、画像データが保存されるホスト側のバッファとともに提供されます。
OpenCL Example: Image Convolution
OpenCL Example: Image Convolution
  • 2020.06.07
  • www.youtube.com
This video introduces the principles of image convolution and how to implement it in OpenCL.
 

19. デモ: OpenCL の例 - 画像畳み込み



19. デモ: OpenCL の例 - 画像畳み込み

このビデオでは、ぼかし、鮮明化、エッジ鮮明化、検出、包含フィルターなどのさまざまなフィルターを定義する OpenCL 画像畳み込みの例について説明しています。発表者は、フィルター値の初期化、ファイルからの BMP 画像データの読み取り、入力および出力画像オブジェクトの作成、カーネルを実行するためのカーネル引数の設定を実演します。このビデオでは、サンプラーの作成、境界外のピクセルの処理方法の定義、カーネルの起動、ピクセル データのファイルへの保存、BMP 形式に必要なヘッダーの作成についても説明しています。最後に、2 つのバッファーの値を比較して結果を検証し、浮動計算によるわずかな偏差はあるものの黄金の結果と一致するフィルター処理されたイメージを作成します。

  • 00:00:00 ビデオのこのセクションでは、発表者が OpenCL 画像畳み込みサンプルのコードを説明します。このコードは、ブラー、シャープ、エッジシャープ、検出、および包含フィルターなどのさまざまなフィルターを定義します。発表者は、特定のフィルター (この場合はエッジ検出フィルター) をテストする方法をデモンストレーションします。また、フィルター値の初期化、ファイルからの BMP イメージ データの読み取り、入力および出力イメージ オブジェクトの作成、カーネルを実行するためのカーネル引数の設定方法についても説明します。このビデオでは、サンプラーを作成する方法と、境界の外側にあるピクセルを処理する方法を定義する方法についても説明します。

  • 00:05:00 このセクションでは、発表者が OpenCL を使用した画像畳み込みの例を示します。このプレゼンテーションでは、カーネルの起動、ピクセル データのファイルへの保存、BMP 形式に必要なヘッダーの作成、2 つのバッファーの値を比較することによる結果の検証など、ホスト上でフィルターを実行するために必要な手順が示されています。この演習の目的は、浮動計算によるわずかな偏差だけで黄金の結果と一致するフィルター処理されたイメージを作成することです。全体として、このプレゼンテーションでは、OpenCL カーネル関数からの出力をコンパイル、実行、検証する方法を強調しています。
Demo: OpenCL Example - Image Convolution
Demo: OpenCL Example - Image Convolution
  • 2020.06.07
  • www.youtube.com
This demonstrates the example of Image Convolution.
 

20. 講義 5 OpenCL 同時実行モデル



20. 講義 5 OpenCL 同時実行モデル

この講義では、複数のコマンド キュー、キューイング モデル、OpenCL カーネルの作業項目、作業グループなどの OpenCL ランタイムと同時実行モデルについて説明します。同期ポイントはコマンドの実行を管理するために使用され、待機イベントはデバイス側のコマンド キュー内のコマンドを同期するために使用されます。この講義では、OpenCL における非同期操作の重要性を強調し、イベントを使用してコマンド間の依存関係を指定する方法について説明します。講師は、イベント完了のためのコールバック関数の使用についても説明し、パフォーマンス調整のためのプロファイリングの重要性を強調します。さらに、この講義では、パイプラインおよび並列実行モデルを含む、システム内の複数のデバイスの OpenCL 同時実行モデルについても説明します。最後に、講師はカーネル イベントを使用した実行モデルの実装をデモンストレーションします。これにより、異なるカーネルの並列実行が可能になります。

OpenCL 同時実行モデルでは、ローカル同期を備えたワーク グループを使用して実行の並列性を実現することで、複数の作業項目を独立して実行してパフォーマンスを向上させることができますが、作業項目が多すぎるとリソースの競合が発生する可能性があります。ワークアイテムは独自のプログラム カウンターを維持する責任があり、問題の次元と問題のサイズを理解することは、GPU 処理要素を活用するワークアイテムを設計するために重要です。 OpenCL はワークグループ バリアを使用してワークアイテム間の高度な同期を実現しますが、同じカーネル実行の異なるワークグループ内のワークアイテム間の同期をサポートするメカニズムはありません。同じワークグループ内のワークアイテムを同期するにはバリア API を使用しますが、グローバル スケールでの同期にはイベントと待機イベントを使用します。カーネル関数は、グローバル メモリとローカル メモリ内のメモリ オブジェクトへのポインタを使用し、すべての処理要素にアクセスできるローカル メモリをワーク グループ内のデータ共有に使用できます。この講義では、OpenCL コンパイラに依存せずにデバイス上のカーネルとして C 関数を使用できるようにするネイティブ カーネル、キュー内のネイティブ カーネル API を使用して OpenCL メモリ オブジェクトをユーザー関数に渡すこと、および組み込みカーネル関数についても説明します。 OpenCL の動き推定拡張機能。ビデオ内の隣接するフレーム間の動きを推定する画像処理に使用されます。

  • 00:00:00 このセクションでは、OpenCL コマンド、キューイング モデル、複数のコマンド キュー、OpenCL カーネルの作業項目、作業グループなどの OpenCL ランタイムと同時実行モデルについて学習します。 OpenCL はタスク並列ホスト制御モデルであり、タスクを並列実行するためにカーネルが使用されます。複数のソフトウェア スレッドがホスト上で実行され、同じコマンド キュー上で動作する場合と動作しない場合があるため、コマンド キューはスレッドセーフです。 OpenCL では非同期操作が重要であり、データの移動やその他の操作は将来のある時点でキュー内で実行されます。ホストがデバイスと対話する最小単位はコマンドであり、コマンドの完了はコマンド キューの同期ポイントでのみ保証されます。この同期は、ホスト許可キュー内のコマンド間、およびデバイス側コマンド キュー内のコマンド間で行われます。

  • 00:05:00 このセクションでは、QAPI のブロッキング読み取り引数と、それを使用して同期ポイントを設定する方法に焦点を当てます。ブロッキング読み取りを true に設定すると、この API をブロッキング読み取り操作にすることができ、読み取り操作が完了するまで他のメモリ操作が停止されます。また、この講義では、QAPI でのイベントを使用してコマンド間の依存関係を指定する方法についても説明します。これは、複数のコマンド、データ転送、計算を含む複雑な操作に役立ちます。さらに、キュー内の Co を使用して送信されたコマンドは非同期で処理され、エラー状態やプロファイリング データを返すことができないため、イベントはコマンド自体よりも多くのコマンドに関する情報を提供できます。ただし、コマンドに関連付けられたイベントを生成すると、CL get events info API を使用してコマンドに関する情報を照会できます。

  • 00:10:00 このセクションでは、OpenCL 同時実行モデル、特にコマンドの実行を管理するための同期ポイントの使用について説明します。同期する方法の 1 つは待機イベントの使用です。この場合、ホストは特定のイベントが発生するまでブロックできますが、キュー API にはコマンド間同期用の待機イベントがいくつかあります。一方、バリア操作は、アウトオブオーダー キューに使用される特別なコマンドであり、同期ポイントになります。マーカーも同様の目的を果たしますが、実行をブロックするのではなく、暗黙的な入力イベントとして機能し、出力イベントによって先行コマンドの完了ステータスを通知します。コマンドに関するその他の情報 (エラー条件など) は、CIL イベント情報取得 API を使用して照会できます。
     
  • 00:15:00 このセクションでは、ホストとデバイス間のデータ フローを制御するために使用される OpenCL のコマンド API とイベント API について講師が説明します。同氏は、コマンド API を使用すると、ユーザーがコマンド キューにコマンドを送信できるようになり、カーネルの実行、バッファの読み取りと書き込み、メモリ マッピングなどのさまざまな操作を実行できると説明しました。イベント API を使用すると、ユーザーは送信されたコマンドの実行ステータスをクエリし、コンテキスト内でプロファイリングを適用できます。また、キュー内のコマンドの特定の実行ステータスが発生したときにトリガーされるイベント コールバック関数についても説明します。コールバック関数を使用すると、単純なタスクを実行し、OpenCL アプリケーションが利用できる出力データを提供できます。講師は、コールバック関数はできるだけ早く完了する必要があり、ブロック関数であってはいけないと強調しています。

  • 00:20:00 このセクションでは、講演者はイベントの完了を処理するコールバック関数の設定について説明します。完了イベントを宣言した直後にコールバック関数を設定することは、イベントに関連付けられたコマンドがまだないため、有効な場所ではありません。有効なイベントは、カーネルがコマンド キューに追加されたときなど、コマンドが関連付けられた後にのみ作成されます。コールバック関数はスレッドセーフであり、迅速に完了し、高価なシステム ルーチンを呼び出さない必要があります。コマンドの実行ステータスと時間を判断するのに役立つため、パフォーマンス チューニングに関してはプロファイリングを有効にすることも重要です。 clq プロファイリング有効フラグは、プロファイリングを有効にするために使用されます。

  • 00:25:00 このセクションでは、ユーザーがキュー内のイベントに関する情報を取得できるようにする OpenCL プロファイリング API について講演者が説明します。プロファイリングを有効にすると、キューからコマンドの開始時間と終了時間などの情報が提供され、実行時間の計算に使用できます。また、特定のコマンドに関連付けられず、任意の方法で使用できるユーザー イベントについても説明します。ユーザー イベントを作成し、読み取りコマンドを待機させると、ユーザー イベントが完了するまで読み取り操作がブロックされ、コマンドの順序をより具体的に制御できるようになります。

  • 00:30:00 このセクションでは、スピーカーがコマンドの実行順序を制御する方法と、順序が乱れたキューを使用してパフォーマンスを向上させる方法について説明します。デフォルトでは、コマンド キュー内のコマンドは順番に実行されますが、柔軟性とパフォーマンスの向上を実現するために、アウトオブオーダー キューを使用できます。講演者は、複数のイベントとバッファ オブジェクトを含むアウトオブオーダー キューを設定する具体的な例を示します。この例には、ノンブロッキング、書き込み専用、および読み取り専用のバッファーを使用した書き込み操作と読み取り操作が含まれています。ユーザーイベントとイベントステータスについても説明します。全体として、このセクションでは、アウトオブオーダーキューの作成と、パフォーマンスを向上させるためのコマンドの実行順序の最適化について包括的に理解します。

  • 00:35:00 このセクションでは、OpenCL API を使用して浮動小数点数をホスト入力バッファからデバイスのメモリ バッファにコピーする方法を講師が説明します。このコードには、実行ユニット ディメンションのセットアップ、2 つのカーネル関数の起動、および完了イベントの待機が含まれています。この講義では、2 つのカーネル関数が別個のコマンドであることも強調し、ホスト側で出力データを読み取り、イベントを待機し、クリーンアップを実行する方法を示します。全体として、このセクションでは、ホストとデバイス間でデータをコピーおよび処理するための 4 つの OpenCL コマンドの使用方法を示します。

  • 00:40:00 このセクションでは、コマンド キューとイベントが OpenCL コマンドの実行をどのように制御するかを見ていきます。イベントを使用して依存関係を設定することで、コマンドが特定の順序で実行されるようにすることができます。ただし、アウトオブオーダーキュー内のコマンドの順序を入れ替えても、コマンドの実行には影響しません。ただし、インオーダー キューを使用してコマンドを交換すると、デッドロックが発生する可能性があります。
    したがって、潜在的な問題を回避するには、依存関係を適切に設定し、適切なキュー タイプを使用することが重要です。さらに、複数のコマンド キューと、それらを使用して OpenCL プログラムの同時実行性を向上させる方法について学びます。

  • 00:45:00 このセクションでは、講師がシステム内の複数のデバイスの OpenCL 同時実行モデルについて説明します。各デバイスには独自のコマンド キューが必要で、単一のデバイスに複数のコマンド キューを持つことも可能ですが、一般的には使用されません。一般に、OpenCL を使用する複数のデバイスは、パイプラインまたは並列という 2 つの異なる実行モデルを使用します。パイプラインモデルでは、複数のデバイスが存在しても、1 つのデバイスが別のデバイスからの結果を待ち、パイプラインを形成します。一方、並列モデルでは、デバイスはバッファーと並行して独立して動作し、独立して実行されます。この講義には、OpenCL プラットフォーム上のコンテキスト内の複数のコマンド キュー、独自のコマンド キューを持つ 2 つのデバイス、および OpenCL での実装の例も含まれています。

  • 00:50:00 このセクションでは、OpenCL のパイプラインと並列実行モデルについて学びます。パイプライン モデルでは、データは 2 つのカーネル間で共有され、カーネル 0 が最初に実行され、カーネル 1 は完了を待ってから次の計算に進みます。イベントと API 呼び出しを使用してこのモデルが実装されていることがわかります。対照的に、並列モデルは、タスク間に依存関係がなく、カーネルが異なるデバイス上で同時に実行できる場合に使用されます。この例には、GPU デバイス 0 と 1、CPU デバイス 2 の 3 つのデバイスがあり、それぞれに別個のコマンド キューがあります。カーネル 0 とカーネル 1 は並列実行するために別々に起動され、完了すると CPU カーネル 2 が起動できるようになります。

  • 00:55:00 このセクションでは、講演者は、異なるカーネルの並列実行を可能にするカーネル イベントを作成することによって OpenCL で実行モデルを構築する方法について説明します。最初の 2 つの API 呼び出しは、大佐 0 と大佐 1 用の 2 つの個別の GPU キューを作成するために使用されます。次に、3 番目の API 呼び出しは CPU カーネルを起動し、実行前に両方の GPU カーネルの完了を待ちます。ここで説明するアプローチでは、イベントを使用して CPU カーネルと GPU カーネル間の依存関係を生成しますが、GPU カーネルを並行して実行することもできます。講演者は、計算の 1 つのコピーまたはインスタンスを定義する OpenCL ワークアイテムの概念と、ハードウェア デバイス上の最小単位である処理要素についても説明します。

  • 01:00:00 このセクションでは、パフォーマンスをスケールアップするために複数の作業項目を独立して実行できるようにする OpenCL 同時実行モデルについて説明します。ワーク グループは、コンピューティング ユニットにマップされるグローバル実行スペース内の一連の作業項目であり、実行時にある程度の並列処理を達成する方法としてローカル同期が可能になります。ただし、コンピューティング ユニットにマッピングする作業項目が多すぎると、リソースの競合が発生する可能性があります。その場合、すべての処理要素を常にビジー状態に保ち、1 つのバッチでワーク グループを完了するのに十分な量の作業を発行する必要があります。

  • 01:05:00 ビデオのこのセクションでは、講演者が OpenCL 同時実行モデルと、作業項目をハードウェア スレッドまたはコンテキストにグループ化する方法について説明します。作業項目は、作業項目をマッピングして OpenCL フレームワークからディスパッチするときに、独自のプログラム カウンターを維持する責任があります。講演者は、作業項目は GPU 処理要素を実現し、活用するように設計する必要があると説明します。問題のサイズと現在作業中の要素の次元を理解することが重要です。スピーカーは、問題の次元、グローバル サイズ、ローカル サイズを理解するために使用できる一連の組み込み関数を提供します。さらに重要なことに、実際のデータ項目が何であるかを調べるためのインデックスとしてグローバル ID とローカル ID を取得するために使用できます。現在の作業項目で作業する必要があります。 OpenCL 同時実行モデルのさまざまな側面を説明するために、簡単なカーネルの例も提供されています。

  • 01:10:00 このセクションでは、グローバル空間の ID 番号を取得して計算するための get global ID メソッドで使用するアドレスを計算するカーネル関数について説明します。次に、カーネル関数はそのアドレスを配列のインデックスとして使用し、結果を 2 で乗算し、その積を別のバッファに割り当てます。講師は続けて、次元 0 のグローバル ID を使用して計算対象の要素を決定する方法と、次元 1 のグローバル ID がこれまでに処理された行数を決定するのにどのように役立つかを説明します。その考え方は、各ワークアイテムが一意の要素で計算を実行し、どの要素でも計算が繰り返されないようにして、GPU または CPU サイクルを節約することです。

  • 01:15:00 このセクションでは、ビデオで OpenCL 同期の仕組みと、ハードウェアベースの順序付けを保証することが難しい理由について説明します。 OpenCL は、プログラムがどこで実行されるかわからないクロスプラットフォーム API フレームワークであるため、ハードウェアベースの順序を保証できません。 OpenCL は、マルチスレッドをサポートするデバイス上で実行されますが、そのようなデバイス上で個別に実行されるオペレーティング システムはありません。これは、実行キューからスレッドを削除するマスター カーネルや OS カーネルがないことを意味します。その結果、セマフォまたは同様のメカニズムを使用するときにデッドロックが発生するリスクがあります。作業項目間で高度な同期を実行するために、OpenCL はワークグループ バリアを使用します。ただし、OpenCL には、同じカーネル実行の異なるワークグループ内の作業項目間の同期をサポートするメカニズムがありません。ワークグループ内または同じコンピューティング上でのデータ共有をサポートするには、すべての処理要素にアクセスできるローカル メモリを使用できます。

  • 01:20:00 このセクションでは、OpenCL の同じワークグループ内のワークアイテムを同期するためのバリア操作の使用について学習します。バリア API は同期ポイントとして使用され、ワーク グループ内の他のすべての作業項目もバリアに到達するまで、作業項目はバリアを超えて続行できません。これにより、続行する前に、グループ内のすべての作業項目に同じデータが含まれることが保証されます。 OpenCL のグローバル同期ラインを使用すると、イベントと待機イベントを使用してグローバル スケールで同期できますが、ワーク グループ内では作業項目レベルで同期を実行するためにバリア操作を利用する必要があります。

  • 01:25:00 このセクションでは、OpenCL のカーネル関数とその引数 (グローバル メモリとローカル メモリ内のメモリ オブジェクトへのポインタ) について学びます。ローカル メモリは計算ユニット内に存在し、その計算ユニット内の処理要素によって共有されます。カーネル関数は、グローバル ID とローカル ID を使用して、グローバル メモリからデータを読み取り、それをローカル バッファ内の対応する要素に割り当てます。同じ代入ステートメントで作業するすべての作業項目を同期するには、ワークグループ バリアとローカル メモリ オフェンスが同期ポイントとして使用されます。同期後、カーネル関数はローカル バッファ内のデータに対して操作を実行し、結果をグローバル メモリ内の出力バッファ内の対応する場所に保存します。

  • 01:30:00 このセクションでは、OpenCL のネイティブ カーネルの概念を紹介します。これにより、OpenCL コンパイラに依存せずにデバイス上のカーネルとして C 関数を使用できるようになります。ネイティブ カーネルを呼び出すための API は、「アンボックス化」と呼ばれるスキームを使用して C 関数に引数を渡すためのメカニズムとともに提供されます。この講義では、引数を渡す例を示します。これには、OpenCL 環境から取得される OpenCL バッファなどのメモリ オブジェクトへの定数とポインタを渡すことが含まれます。

  • 01:35:00 このセクションでは、インキュー ネイティブ カーネル API を使用して OpenCL メモリ オブジェクトをユーザー関数に渡す方法を講師が説明します。 API では、渡されるメモリ オブジェクトの数と、それらのそれぞれの場所をリストで指定する必要があります。これには、メモリ オブジェクトと定数のプレースホルダが含まれます。これらは対話型の受け渡しが必要なため、メモリ オブジェクトとは区別されます。組み込みカーネルはデバイス固有であり、特殊なハードウェア リソースを利用しますが、汎用ではなく、異なるデバイス間で同じ機能を持たない場合があります。

  • 01:40:00 このセクションでは、ビデオ内の隣接するフレーム間の動きを推定する画像処理に使用される、OpenCL 用の社内動き推定拡張機能などの組み込みカーネル関数について学びます。この拡張機能はハードウェア アクセラレーションまたは埋め込みファームウェア機能を提供し、OpenCL Web サイトでさらに詳しく調べることができます。
Lecture 5 OpenCL Concurrency Model
Lecture 5 OpenCL Concurrency Model
  • 2018.10.13
  • www.youtube.com
OpenCL Runtime and Concurrency Model (please refer to Chapter 5 of textbook)
 

21. マップリデュースの概念



21. マップリデュースの概念

MapReduce の概念は、このビデオで説明されています。これには、マッピング フェーズとそれに続くリダクション フェーズを使用して、大きな問題を小さなサブ問題に分割することが含まれます。このアプローチは、Google がデータセンターのコンピューター上で膨大な量のデータを処理するために使用しています。このビデオでは、プロセッサがどのように独立して動作し、作業対象のデータをプロセッサに割り当て、完了時にキーと値のペアが生成されるかを示す例が示されています。次に、キーと値のペアが異なるプロセッサのグループによって処理され、リダクション フェーズで最終結果が得られます。このアプローチでは、ワークロードを複数のマシンに分散することで、大規模なデータセットを効率的に処理できます。

  • 00:00:00 このセクションでは、講演者は、大きな問題を分解して効率的に対処できる小さな問題を取得するというコンテキストで MapReduce の概念について説明します。彼らは、分解のための 2 つの主な戦略、つまり分割と征服と分散と収集を特定しており、これらは問題の性質やハードウェアの制限に応じて同じ意味で使用されます。彼らは、2004 年に Google によって最初に提案された MapReduce アプローチは、大きな問題を小さなサブ問題に分割し、マッピング フェーズとそれに続くリダクション フェーズを使用してそれらを個別に処理すると説明しています。これらは、Google がこの概念を使用して、検索エンジンのクエリや Web ページにサービスを提供するデータセンター内のコンピューター上で膨大な量のデータを処理する方法を示しています。

  • 00:05:00 このセクションでは、MapReduce アプローチについて、マッピングとリダクションの 2 つの段階を通して説明します。最初の段階では、処理するデータをプロセッサに割り当てます。これにより、完了時にキーと値のペアが生成されます。リダクションとして知られる第 2 段階では、プロセッサが第 1 段階からキーと値のペアを受け取り、指定された「T」に対応する値に対してリダクションを実行します。このアプローチは、元の問題がサブ問題に分割されるとプロセッサーが独立して動作できるため効率的であり、さまざまなサイズの問題に拡張可能です。このビデオでは、プロセッサに割り当てられた 6 つのブロックを持つ入力を使用してこのアプローチをどのように適用できるかを具体的な例で示し、このアプローチの潜在的な効率を示しています。

  • 00:10:00 このセクションでは、マップ リデュースの概念が提供され、プロセッサが加算を実行して元の入力を 6 つの等しいサイズの部分に結合してバランスを確保する方法について説明します。各キーと値のペアは、異なるプロセッサによるマッピング プロセス中にほぼ同時に生成されます。次の段階では、これらのキーと値のペアを異なるプロセッサのグループで処理して、最終結果を取得します。最後に、リダクション ステージでこれらのキーと値のペアが結合され、プロセッサは単一のキーワード値 1 に基づいていくつかのリンクのリストを構築します。

  • 00:15:00 このセクションでは、講演者が MapReduce でのマッピングのプロセスについて説明します。これには、タスクを並列実行できる小さなサブタスクに分割することが含まれます。これは、分析する必要がある各キーワードのリストを作成することによって行われます。リスト内の各項目は、そのキーワードに関連付けられた値を表します。これにより、ワークロードが複数のマシンに分散され、大規模なデータセットを効率的に処理できるようになります。
Map Reduce Concept
Map Reduce Concept
  • 2020.06.14
  • www.youtube.com
This video introduce the basic concept of MapReduce
 

22. Map Reduce の例: WordCount と Weblink



22. Map Reduce の例: WordCount と Weblink

この YouTube ビデオでは、MapReduce を適用して、大きなテキスト ファイル内の各単語の出現をカウントし、Web ページ URL の関係を分析する方法を示しています。 MapReduce を使用すると、ドキュメントを小さなセクションに分割するマッピング段階で、各プロセッサが個別に特定のキーワードをターゲットにすることができます。削減段階では、単語キーに基づいてキーと値のペアをグループ化し、値を合計して各単語の合計出現数を取得します。 Web ページ分析の場合、マッピング プロセスには、URL をキーとして、リンクされた Web ページのリストを値として持つキーと値のペアの作成が含まれます。また、削減ステージでは、Web ページ間の関係を示す最終マップを構築します。

  • 00:00:00 このセクションでは、MapReduce の具体的な動作例を示します。つまり、数十万の英単語が含まれる大きなテキスト ファイル内の各単語の出現数をカウントします。これは、各プロセッサが特定のキーワードを対象として、さまざまなキーワードを個別にカウントできるため、MapReduce の理想的な使用例です。マッピング段階では、ドキュメントを小さな部分に分割し、各プロセッサが同様のサイズのセクションを受け取り、興味深い単語のキーと値のペアの出現をカウントします。削減段階では、単語キーに基づいてすべてのキーと値のペアをグループ化し、値を合計して各単語の合計出現数を取得します。この例では、URL をキーワードとして実装したり、さまざまな Web サイトの Web リンク関係を分析したりすることで、Web ページのアクセスをカウントするために使用できる MapReduce の多用途性を示しています。

  • 00:05:00 このセクションでは、講演者は、MapReduce を使用して多数の Web ページ URL とそのリンクを分析し、それらの間の関係を示すグラフを作成する方法を説明します。マッピング プロセスには、タプルを小さなチャンクにグループ化し、それらをマッピング プロセッサに割り当てて、キーとして URL と、キーからリンクされる値として Web ページのリストを含むキーと値のペアを構築することが含まれます。次に、削減段階では、複数のキーを異なるプロセッサーで処理でき、キーと値のペアを使用して最終マップを構築し、Web ページ間の関係を示します。
Map Reduce Example: WordCount and Weblink
Map Reduce Example: WordCount and Weblink
  • 2020.06.14
  • www.youtube.com
This video introduce MapReduce concept with two examples: word count and web link relationship.
 

23. OpenCL デバイスでの MapReduce の考慮事項



23. OpenCL デバイスでの MapReduce の考慮事項

この YouTube ビデオでは、OpenCL デバイスでの MapReduce の使用を中心に説明し、メモリ構造、作業編成、ローカル/グローバル リダクションに焦点を当てています。講演者は、OpenCL デバイス上で多数の処理要素を活用する利点に言及し、MapReduce を使用して大規模なデータセットを効率的に処理しながら、さまざまなメモリ階層を使用することを強調しました。また、OpenCL デバイスでの MapReduce の使用に関連する 5 つのステップについても詳しく説明しており、マッピング プロセス、ローカル リダクション、作業項目の同期、グローバル バリア、および最終結果の生成をカバーしています。

  • 00:00:00 このセクションでは、OpenCL デバイス上の MapReduce が従来の CPU 環境とどのように異なるかに焦点を当てます。主な違いはメモリ構造にあります。メモリ構造は階層的であり、それぞれサイズとデータの可視性が異なるプライベート メモリ、ローカル メモリ、およびグローバル メモリで構成されます。プライベート メモリはワークアイテム自体にのみ表示されますが、ローカル メモリはコンピューティング ユニット内のすべてのワークアイテムに表示されますが、ユニット間では表示されません。一方、グローバル メモリはすべての作業項目に表示されます。 OpenCL デバイス上の多数の処理要素を活用することは可能性をもたらしますが、メモリ構造を考慮する必要があります。

  • 00:05:00 このセクションでは、講演者は、OAKLAND データセットのような問題に対処するために、OpenCL デバイス上で操作を実行するための MapReduce の使用について説明します。彼らは、さまざまな作業項目を使用し、作業対象の行列内の各要素に計算を割り当てる必要性を説明しています。プライマリ メモリとローカル メモリを含むメモリ階層の使用は重要であり、講演者は、削減の一部にグローバル メモリの代わりにローカル メモリを使用する利点を指摘しました。これらは、ワークグループがどのように編成され、ワークアイテムに割り当てられた各データチャンクに対してマッピング操作がどのように実行されるかについて詳しく説明します。この方法で MapReduce を使用すると、OpenCL デバイスを使用して大規模なデータセットを効率的に処理できます。

  • 00:10:00 このセクションでは、講演者が OpenCL デバイス上の MapReduce におけるローカルおよびグローバル リダクションの概念について説明します。ローカル リダクションは、各処理要素によって生成されたキーと値のペアに対して実行されますが、グローバル リダクションは、グローバル メモリ内の複数のワーク グループの結果を結合します。 OpenCL デバイスに MapReduce を実装する際の課題は、マッピング段階で生成されるキーと値のペアの数が不明であり、中間結果にメモリ スペースを適切に割り当てる必要があることです。さらに、ローカル インタラクションの結果はローカル メモリに保存する必要があり、さまざまなメモリ階層を考慮する必要があります。

  • 00:15:00 このセクションでは、講演者が OpenCL デバイス上の MapReduce の 5 つのステップについて説明します。最初のステップには、マッピング プロセスとローカル リダクション ステージの一部を実行するワークアイテム グループが含まれます。 2 番目のステップには、削減を実行する前に作業項目を同期するためのローカル バリアを実行することが含まれます。 3 番目のステップは、各グループのローカル ID ゼロのワークアイテムに、他のワークアイテムによって生成されたキーと値のペアを前処理させることです。 4 番目のステップでは、すべてのワーカーが終了するまでさらなる実行を防ぐグローバル バリアの実行が含まれます。最後に、5 番目のステップでは、各ワークグループの結果を組み合わせて最終結果を生成し、その前にすべての作業項目が完了していることを確認します。
Considerations of MapReduce on OpenCL device
Considerations of MapReduce on OpenCL device
  • 2020.06.14
  • www.youtube.com
This video introduces specifics of implementing MapReduce on OpenCL devices.
 

24. MapReduce の例: デモによる文字列検索



24. MapReduce の例: デモによる文字列検索

このビデオでは、文字列検索の実装に焦点を当てて、OpenCL プログラミングと MapReduce のさまざまな側面を示します。講演者は、ローカル修飾子を使用してメモリを宣言および割り当てる方法を説明し、カーネル関数では動的メモリ割り当てが許可されていないことを指摘しました。また、ベクトル データ型を導入し、要素ごとの加算とメモリ アクセスを簡素化する方法を示します。主な焦点は、MapReduce を使用した文字列検索の実装です。入力テキストは作業項目に分割され、キーワードを検索するためのマップ関数に割り当てられます。各ワークアイテムは、テキストのチャンクをパターン ベクトルと比較しながらこのプロセスを実行します。ローカル結果は衝突を防ぐためにアトミック インクリメントによって取得され、最終結果は各作業項目の結果を集約することによって取得されます。スピーカーは、必要な引数や初期化方法など、カーネル関数の詳細な説明も提供します。

  • 00:00:00 このセクションでは、講演者が OpenCL でのローカル メモリ割り当てについて説明し、文字列検索カーネル関数のコンテキストでそれを行う方法を示します。ローカル メモリは、「local」修飾子を使用して宣言され、内側の角括弧を使用して指定されます。講演者は、カーネル関数では動的なメモリ割り当てが許可されていないため、ホスト プログラムでカーネル引数の設定 API を使用してローカル メモリ領域を割り当てていると述べました。さらに、講演者はベクトル データ型を紹介します。これにより、同じ型の複数の要素を持つ配列に対する操作がより高速かつ簡単になります。

  • 00:05:00 このセクションでは、OpenCL カーネル関数で要素ごとの加算にベクトル データ型を使用する方法を講演者が説明します。ベクトルを使用すると、加算と代入のプロセスが簡素化され、演算はベクトル内のすべての単一要素に適用されます。ベクトルの初期化は、特定の値を使用して明示的に行うことも、ベクトル内のすべての要素に対して単一の値を繰り返すことによって行うこともできます。講演者は、特に各要素が文字またはバイトである文字の配列を操作する場合に、コンパクトなメモリ アクセスがベクトル型からどのようにメリットを受けるかについても説明します。

  • 00:10:00 このセクションでは、講演者が MapReduce を使用して文字列検索を実装する方法をデモを交えて説明します。検索は、入力テキストに対して 16 文字の文字パターンを使用して実行されます。メッセージ ベクトルの最初の 8 文字を使用して速度をどのように利用するかを説明し、異なる順序でアトムにアクセスする方法も示します。文字ベクトルの各部分に値を割り当てる方法について詳しく説明し、例を示し、入力テキストを検索するカーネル関数の構築方法 (関数に必要な引数や初期化方法など) を説明します。最後に、全体的な結果がどのように得られるのか、そしてそれらの結果が何を意味するのかについて説明します。

  • 00:15:00 このセクションでは、MapReduce サンプルの文字列検索の初期化プロセスとローカル メモリ フェンス内の同期ポイントについて講演者が説明します。元の文書内の文字はグループに分割され、各グループには対応するキーワードを検索するための特定の文字セットが割り当てられます。グローバル ID とアイテムごとのキャラクターは、各グループに割り当てられた作業の開始点を識別するために使用されます。全体として、このセクションでは、MapReduce の技術的側面と文字列検索におけるそのアプリケーションについての洞察を提供します。

  • 00:20:00 このセクションでは、講演者がデモを使用して文字列検索を実行するための MapReduce の実装について説明します。入力データはワークアイテムに分割され、各ワークアイテムはテキストの塊内のキーワードを検索するためのマップ関数に割り当てられます。講演者は、テキストの塊がメモリにロードされ、文字のウィンドウが移動してキーワードを検索する方法を実演します。 16 文字がロードされたベクトルが比較に使用され、結果はチャンクの別のベクトルに格納されます。このプロセスは作業項目ごとに繰り返され、各作業項目の結果を集計することで最終結果が得られます。

  • 00:25:00 このセクションでは、ユーザーが入力したキーワードに対応するテキスト ベクトルとパターン ベクトルを比較することで、バッテリーが特定の章にどのように割り当てられるかをビデオで説明しています。比較演算では 2 つのベクトルのすべての要素が比較され、各要素に対して 1 または 0 が生成されます。キーワードがある場合、比較の結果によって、その特定の章に割り当てられるバッテリーの値が決まります。チェック ベクトルの最初の 4 つの要素の有効ビットによって、キーワードがあるかどうかが決まります。条件が true の場合、つまりすべての有効ビットが 1 である場合、キーワードが見つかり、ローカル結果がインクリメントされます。これは、プログラムが一致を見つけたことを示します。

  • 00:30:00 このセクションでは、講演者が String Search MapReduce の例がどのように機能するかを説明します。コードは複数のワークグループで構成されており、各グループはブロックに分割されたテキスト内の特定のキーワードをチェックします。目的は、各ブロックにキーワードが存在するかどうかを確認することです。結果が true の場合、衝突を防ぐためにコメントはアトミック インクリメントを使用してインクリメントされます。ブロック内のすべてのキーワードがチェックされた後、グローバル メモリにアクセスする操作が完了していることを保証するためにバリアが使用されます。次に、ループはウィンドウを右に移動して次の 16 文字のセットをチェックし、このプロセスがワークグループごとに繰り返されます。最後に、衝突を防ぐためにアトミック追加を使用して、ローカル結果カウンターがグローバル結果に追加されます。

  • 00:35:00 このセクションでは、講演者がデモを使用して文字列検索用の MapReduce サンプルの実装を説明します。カーネル関数について説明します。ローカル メモリが初期化され、カウンタがリセットされ、プログラムは Pope ID を使用してオフセットを計算し、一度に 16 バイトをテキスト ベクトルにロードします。次に、関数は結果を比較し、first of all およびリダクション関数を使用してグローバル リダクションを実行します。 GitHub 上のサンプル コードが示され、スピーカーは、パターン、テキスト要素、テキスト バッファー、項目の文字、元のテキストの全長、画像のサイズなどの引数の概要を説明します。最後に、彼はグローバル サイズが利用可能なリソースと、目的の文字列を見つけるプロセスに関与する正式な科学にどのように依存するかについて話します。

  • 00:40:00 このセクションでは、MapReduce を利用してテキスト ファイル内の特定の単語を検索する例を講師が説明します。目標は、テキスト ファイル内の特定の単語の出現を 4 つカウントすることです。講師は、プロセスをより深く理解するためにソース コードとランタイムを確認することを提案します。
MapReduce Example: String Search with Demo
MapReduce Example: String Search with Demo
  • 2020.06.14
  • www.youtube.com
This video explains the implementation of string search on OpenCL device using MapReduce approach. Vector instructions and operations are briefly explained. ...
 

25. OpenCL の例: 基数ソート



25. OpenCL の例: 基数ソート

このビデオでは、基数ソートの概念が紹介されています。基数ソートでは、ソートされる要素の実際の値ではなく、数値表現に基づいて、より大きなソート問題をより小さなサブセットに分割します。講演者は、8 つの数値を 16 進数表現の最下位桁で並べ替える例を示します。 OpenCL shuffle 関数と shuffle2 関数は、並べ替えプロセス中に要素を効率的に再配置するために使用されます。このビデオでは、OpenCL を使用してシャッフル操作を実行する方法と、基数ソートのためにカーネル関数でシャッフル命令を使用する方法も説明しています。さらに、このビデオでは、radix sort Eight sort Eight と呼ばれるカーネル関数について説明します。この関数は、入力ベクトルを 2 進数の値に基づいて 0 と 1 のバケットに分割することで、OpenCL の配列を効果的にソートします。

  • 00:00:00 このセクションでは、ビデオでは基数ソートの概念を紹介します。基数ソートは、大規模なソート問題をサブセットごとにソートされた小さなソート問題に分割します。並べ替えプロセスは、要素自体の値ではなく、要素の数値表現に基づいて実行されます。講演者は、8 つの数値をソートする例を示します。ソートは 16 進数表現の最下位桁に基づいています。並べ替えプロセスは数回の繰り返しで行われ、数字が最も重要でない桁に従ってバケットに配置され、数字が昇順に並べ替えられるまでさらに桁ごとに繰り返されます。

  • 00:05:00 ビデオのこのセクションでは、スピーカーは、最初に数値の最上位桁に基づいてバケットに整理することにより、一連の数値に基数ソートを適用する方法を示しています。次に、最下位桁を使用してプロセスを繰り返し、各数値のすべての桁を調べ終わるまで続行します。講演者は、基数ソートの各ステップは本質的にシャッフルであり、OpenCL のシャッフル関数を使用すると、ソート プロセス中に要素を効率的に再配置できると述べました。最後に、講演者は、ソートする必要がある要素のインデックスを指定するためにマスクを使用する方法の例を示し、2 つのベクトルとマスク配列を使用してこの概念を適用する方法を示します。

  • 00:10:00 このセクションでは、OpenCL の shuffle 関数と shuffle2 関数の使用方法について説明します。 shuffle 関数は、指定されたマスクに基づいて入力ベクトルの元の値をシフトまたはシャッフルして新しい出力ベクトルを作成する出力ベクトルを作成します。 shuffle2 関数は似ていますが、1 つではなく 2 つの入力ベクトルを受け取ります。マスクのサイズとデータ型は戻り値の要素と一致する必要があり、データ型は符号なし整数型である必要があります。さらに、返される因子は入力ベクトルと同じデータ型およびコンポーネント数を持ち、マスク ベクトルのコンポーネント内の選択された数のビットのみが重要になります。 shuffle2 の K の値は、入力ベクトルの成分の数によって異なります。

  • 00:15:00 このセクションでは、OpenCL を使用してシャッフル操作を実行する方法を講演者が説明します。これらは、入力ベクトルとマスクを受け取り、マスクによって入力ベクトルから選択された値に基づいてベクトルを出力するシャッフル操作の例を示しています。また、マスク値を使用して、出力ベクトルを構築するために入力ベクトルからどの値を選択するかを決定する方法についても説明します。講演者は、文字を含む 2 つの入力ベクトルを含む 2 番目の例を示し、マスクを使用して入力ベクトルから選択された値に基づいて出力ベクトルを構築する方法を説明します。

  • 00:20:00 このセクションでは、基数ソートのための OpenCL サンプルのカーネル関数でのシャッフル命令の使用についてビデオで説明しています。カーネル関数は「シャッフル テスト」という名前で、浮動小数点ベクトルと文字 16 要素ベクトルの 2 つの引数を取ります。このビデオでは、整数ベクトルをマスクとして使用し、4 要素の浮動小数点ベクトルを入力として使用して 8 つの浮動小数点数を含む出力ベクトルを構築する例を示しています。ビデオではさらに、2 進数の最下位桁を調べ、それを使用して奇数を選択し、新しいベクトルを作成することにより、カーネル関数でソートがどのように機能するかを説明します。

  • 00:25:00 ビデオのこのセクションでは、ベクトル内の要素の最下位桁に基づいてマスクを構築し、基数ソート アルゴリズムを使用して要素をソートする方法をスピーカーが説明します。要素を指定されたベクトルにコピーし、要素の最下位桁に基づいてマスクを構築することにより、関数 shuffle を使用して元のベクトルと指定されたベクトルから値を取得し、新しいベクトルを構築できます。このプロセスでは、基本数値を 2 進数に基づいて 2 つのバケット (0 と 1) に分類します。

  • 00:30:00 このセクションでは、radix sort Eight sort Eight と呼ばれるカーネル関数について学びます。この関数は、入力ベクトルを 2 進数の値に基づいて 0 と 1 のバケットに分割することで機能します。カーネル関数は、2 つのカウンター (0 カウントと 1 カウント) を使用してデータ配列をソートするためのバッファーとして使用される共用体構造体を定義します。 CMP 値 1 は、値を比較する 2 進数を決定するために使用され、関数は、ビデオ内の図に対応する 2 つの配列、マスク 1、およびデータを使用して、並べ替えられた要素を保存します。 for ループには、並べ替える 8 つの数値を処理するための 8 回の反復があり、J は 0 から 8 まで移動して、0 と 1 のバケットに入れる要素の数を決定します。 Radix sort Eight sort Eight は、OpenCL で配列をソートする効果的な方法です。

  • 00:35:00 このセクションでは、講演者は基数ソートがどのように機能するかを説明します。これには、各位置の対応する桁に従ってデータセット内の値をソートすることが含まれます。プロセスは最下位桁から始まり、最上位桁に向かって進みます。講演者は例を使用して、シャッフル操作を実行して最終的な出力ベクトルを作成する前に、1 と 0 で終わる値が異なる配列にどのように分離されるかを示します。他の桁についてもこの処理を繰り返し、最終結果をグローバルバッファに格納します。
OpenCL Example: Radix Sort
OpenCL Example: Radix Sort
  • 2020.03.26
  • www.youtube.com
OpenCL Example: Radix Sort using Shuffle Function