取引におけるOpenCL

 

OpenCLは、CPU(中央処理装置)、GPU(グラフィックスプロセッシングユニット)、その他の特殊なプロセッサやハードウェアアクセラレータなど、さまざまな種類のハードウェアプラットフォームで実行できるプログラムを作成するためのオープンソースフレームワークです。ソフトウェア開発者は、ベンダーやアーキテクチャに関係なく、複数のデバイスで実行できるコードを作成できるようになります。

OpenCL APIとランタイムは、特定のプラットフォーム非依存性を提供し、OpenCL対応デバイスで実行できるコードの作成を可能にします。また、開発者がデバイス、メモリ、カーネルの実行を明示的に制御できるようにする一連の低レベルAPIも提供するため、アプリケーションをきめ細かく制御できます。

OpenCLは、科学計算、画像およびビデオ処理、機械学習などの分野で広く使用されています。デバイス全体で並列コンピューティング能力が利用され、より高速で効率的なアプリケーション実行を実現します。

OpenCLの最も重要な利点の1つは、CPUよりもはるかに高速な計算を可能にするGPUの処理能力を利用できるということです。これは、科学モデリング、画像とビデオの処理、機械学習など、大量の計算を必要とするアプリケーションに特に役立ちます。 

OpenCLは、さまざまなコンピューティングデバイスの能力を活用できるアプリケーションを開発するための柔軟なフレームワークを備えているため、高性能コンピューティングアプリケーションを開発する人にとって貴重なツールになります。


MQL5は2012年からOpenCLをサポートしています。詳細については、MQL5リファレンスのOpenCLでの作業を参照してください。また、OpenCLプログラムを操作するためのクラスも参照してください。

OpenCLの使用例は、MQL5\Scripts\Examples\OpenCLにあります。

MetaTrader5のOpenCLの例

以下は、MQL5でのOpenCL Seascapeの例です。




関連記事:

 

OpenCL の概要



OpenCL 入門 (1)

「OpenCL の紹介」ビデオでは、CPU、GPU、FPGA などの複数のタイプのデバイスをサポートする、高性能異種データ並列計算のための低レベル言語としての OpenCL について説明しています。 OpenCL は 2008 年にオープン スタンダードとなり、Intel、Nvidia、AMD などの企業から業界で多大なサポートを受けてきました。 OpenCL は、より優れたツール、機能、Nvidia のサポートを備えた CUDA とよく比較されますが、OpenCL はより多くのデバイスをサポートしているため、メーカー間でより広く普及しています。講演者は、個人プロジェクトの場合、より優れたツールと最適化のために CUDA の使用を提案しますが、さまざまな GPU をサポートする必要があるプロフェッショナル製品には OpenCL を推奨します。

  • 00:00:00 このセクションでは、講演者は、高性能の異種データ並列計算のための低レベル言語として OpenCL を紹介します。 OpenCL は、CPU、GPU、FPGA などの複数のタイプのデバイスをサポートでき、C 99 に基づいているため、デバイス間の移植性が可能です。 OpenCL はベクトルを表現するための一貫した方法も提供し、共有数学ライブラリと精度を保証する OpenCL 認定プロセスを備えています。講演者は、OpenCL が 2008 年にオープン スタンダードとなり、Intel、Nvidia、AMD などの企業や、Ericsson、Nokia、Texas Instruments などの組み込みデバイス メーカーから多大な業界サポートを受けていると指摘しました。 OpenCL は、より優れたツール、機能、Nvidia のサポートを備えた CUDA とよく比較されますが、OpenCL はより多くのデバイスをサポートしているため、メーカー間でより広く普及しています。
     
  • 00:05:00 このセクションでは、講演者が CUDA と OpenCL の違いと、さまざまな目的でどちらを選択すべきかについて説明します。個人プロジェクトの場合、講演者は、より優れたツール、デバッガー、最適化のために CUDA を使用することを提案します。ただし、さまざまな GPU をサポートする必要があるプロフェッショナル向け製品の場合、講演者は OpenCL を使用することを推奨しています。OpenCL が非 Nvidia GPU をサポートする唯一の方法であり、複数の企業のサポートを受けて進化しているからです。コースに関して、講演者はより良いツールと効率的なコーディングのために CUDA を使用することを提案していますが、すべてのコンピューティング リソースを活用するには OpenCL の方が使いやすいかもしれません。
Introduction to OpenCL (1)
Introduction to OpenCL (1)
  • 2016.04.06
  • www.youtube.com
Introduction to OpenCL: What is it, what is it good for, how does it compare to CUDA.
 

OpenCL は何に適していますか?



OpenCL は何に適していますか? (2)

ビデオの講演者は、データ並列および単精度の計算集約型プログラムに OpenCL を使用する利点について語ります。 GPU はグラフィックス用に設計されており、メモリ操作に対する数学操作の割合が高いため、理想的です。講演者は、高強度のループは GPU が優れている数学演算により多くの時間を費やすのに対し、低強度のループはメモリ アクセスの待機にほとんどの時間を費やすと説明します。このセクションでは、大量のデータに対して同じ独立した操作を実行するデータ並列処理についても説明します。講演者は、OpenCL での単精度と倍精度の使用についても説明します。倍精度は単精度の 2 倍のデータを必要とするため、実行コストが高くなります。

  • 00:00:00 このセクションでは、講演者は、OpenCL がデータ並列および単精度の計算集約型プログラムに適していることを説明します。 GPU はグラフィックス用に設計されており、メモリ操作に対する数学操作の割合が高く、計算量が多いため、この種のプログラムに適しています。数学は高速ですが、メモリは遅いため、多数の数学演算を行うとマシンが忙しくなり、メモリ アクセスによって速度が低下します。講演者は、低強度のループはほとんどの時間をメモリの待機に費やすのに対し、高強度のループは演算処理に多くの時間を費やし、そこが GPU の優れた点であると説明します。このセクションでは、大量のデータに対して同じ独立した操作を実行することを意味するデータ並列処理についても説明します。例には、画像内のピクセルの変更やグリッド上のポイントの更新などが含まれます。
     
  • 00:05:00 このセクションでは、講演者が OpenCL でデータの並列実行がどのように機能するかを説明します。彼は、これは本質的に大量のデータに対する独立した操作を必要とし、これをデータ並列実行と呼ぶと述べています。講演者は続けて、この種の実行では、異なる色のピクセルに対して演算を実行するときに発生する可能性があるなど、データに対して行われる計算の変動によりパフォーマンスが低下する可能性があると説明しました。次に、OpenCL での単精度と倍精度の使用について説明し、倍精度は単精度の 2 倍のデータを必要とするため、実行コストが高くなると述べています。
What is OpenCL Good for? (2)
What is OpenCL Good for? (2)
  • 2016.04.06
  • www.youtube.com
Overview of the kind of problems OpenCL is good at accelerating: computational intensity, parallelism.
 

OpenCL のローカル ディメンションとグローバル ディメンション



OpenCL のローカル ディメンションとグローバル ディメンション (3)

このビデオでは、OpenCL のグローバル ディメンションとローカル ディメンションの概念と、コード実行の並列性を指定するためにそれらがどのように使用されるかを詳しく説明します。グローバル ディメンションは、カーネル実行ごとに実行されるスレッドまたは作業項目の数を決定する 1D、2D、または 3D 配列です。たとえば、グローバル ディメンションが 1,000 個のポイントを持つ 3D 配列である場合、各ポイントでスレッドまたはワークアイテムが実行されます。一方、ローカル ディメンションは、グローバル ディメンションを、一緒に実行されるローカル ワークグループまたはスレッドのグループに分割し、同期を容易にします。同期は同じワークグループ内でのみ許可されるため、必要な同期を可能にするローカル ディメンションを選択することが重要です。要約すると、グローバル ディメンションは各カーネル実行のスレッドまたは作業項目の数を確立し、ローカル ディメンションはグローバル ディメンションを同期を可能にするワークグループに分割します。同期は同じワークグループ内でのみ実行できるため、適切なローカル ディメンションを選択することが重要です。

Local and Global Dimensions in OpenCL (3)
Local and Global Dimensions in OpenCL (3)
  • 2016.04.06
  • www.youtube.com
How to specify parallelism in OpenCL kernels with global dimensions and local dimensions. How to choose the right dimensions.
 

OpenCL のローカル ディメンションに関する問題



OpenCL のローカル ディメンションの問題 (4)

このビデオでは、同期の制限やデバイスの使用率など、OpenCL のローカル ディメンションに関連するいくつかの問題について説明します。同期は GPU 上の同じワークグループに制限され、グローバル同期は高価であり、カーネル実行の最後にのみ使用できます。ハードウェアの無駄を避けるためには、適切なローカル ワークグループ サイズを選択することが重要であり、講演者は、物理的なハードウェア サイズの倍数の寸法を選択することを提案しています。このビデオの最後では、最適なパフォーマンスを実現するための最適な寸法を見つけるための試行錯誤のアプローチを推奨しています。

  • 00:00:00 このセクションでは、OpenCL でローカル ディメンションを選択する際の同期とデバイスの使用率に関連する 2 つの問題についてビデオで説明します。ローカル ワークグループのサイズは、コードの複雑さに応じて 512 スレッド、最大 1024 スレッドに制限されており、同期は同じワークグループ内でのみ発生します。このビデオでは、縮小アプリケーションを使用して、同期の仕組みとワークグループのサイズによる制限について説明します。このビデオでは、同期機能が限られているのは、GPU のスケーラビリティのニーズと、チップ上の他の場所で任意の同期をサポートするコストが原因であるとしています。

  • 00:05:00 このセクションでは、ビデオで OpenCL のローカル ディメンションの問題について説明します。最初の例は、スピン ロックを使用すると、スケジューラが前進する保証がないためにデッドロックがどのように発生するかを示しています。このビデオでは、グローバル同期はカーネル実行の最後にのみ実行できるため、コストがかかり、プログラマがアルゴリズムを慎重に計画する必要があることも説明しています。もう 1 つの問題は、ローカル ワークグループのサイズがコンピューティング ユニットのサイズと一致しない場合のデバイス使用率です。これによりハードウェアの一部が無駄になるため、この問題を回避するには、プログラマは問題にうまく対処し、ハードウェアのサイズにうまく適合する寸法を選択する必要があります。

  • 00:10:00 このセクションでは、講演者が OpenCL のローカル ディメンションの選択に影響を与える要因について説明します。彼らは、GPU では、物理ハードウェア サイズの倍数で 2,000 以上の作業項目 (ビデオ 64 と AMD の場合は 16 または 3,200 など) を持つことが最善であると説明しています。 CPU の場合、CPU コアの数が 2 倍であることが最適ですが、これは使用されているアルゴリズムによって異なります。講演者は、最高のパフォーマンスが達成されるまで試行錯誤することを提案します。
Issues with local dimensions in OpenCL (4)
Issues with local dimensions in OpenCL (4)
  • 2016.04.06
  • www.youtube.com
Handling reductions with local dimensions and problems with spin locks and device utilization on GPUs.
 

OpenCL コンピューティング カーネル



OpenCL コンピューティング カーネル (5)

講師は、OpenCL カーネルは並列コンピューティングに使用される C99 コードであると説明します。カーネルは何千回も並行して実行され、計算の内部ループとなります。ベクトル、正確な丸めと変換、組み込み関数などの OpenCL 機能により、精度が保証されます。 OpenCL のユーティリティ関数は、ID、ディメンション、グループ ID などの作業項目に関する情報を提供し、調整可能な柔軟なカーネルの作成を可能にします。ただし、OpenCL ライブラリ関数を使用すると、優先順位と精度をトレードオフすることになります。これは、並列コード操作の並べ替えが実行シーケンスに影響を与え、結果を変更する可能性があり、すべてのデバイスで確定的な実行が不可能になるためです。

  • 00:00:00 このセクションでは、OpenCL カーネルは基本的に単なる C99 コードであり、並列で実行される計算を指定するために使用されるとインストラクターが説明します。コードは何千回も並行して実行され、計算の内部ループになります。次に、インストラクターは C 関数の例と、OpenCL カーネルを使用してそれを並列実行する方法を示します。また、ベクトル、丸めや変換を制御する明示的な機能、精度が保証された組み込み関数など、OpenCL のいくつかの機能についても説明します。 OpenCL のユーティリティ関数は、作業項目 ID、ディメンション、特定のディメンションの最大数、グループ ID などの各作業項目に関する情報も提供します。これは、どの作業を行うべきかを賢明に判断できる柔軟なカーネルを作成するのに役立ちます。 。全体として、OpenCL は可用性と精度を保証することで、移植可能でパフォーマンスの高いコードを作成する機能を強化します。

  • 00:05:00 このセクションでは、OpenCL 準拠ライブラリ関数を使用する場合の優先順位と精度の間のトレードオフについて講演者が説明します。これらの関数はテスト時の精度を保証しますが、アプリケーションがすべての OpenCL マシンで同じ結果を生成するとは限りません。その理由は、コンパイラーが並列コード内の操作の順序を変更し、実行順序に影響を与え、最終結果を変更する可能性があるためです。したがって、これらのライブラリ関数に基づいてコードを構築することが推奨されますが、すべてのデバイスでの決定的な実行は保証できません。
OpenCL Compute Kernels (5)
OpenCL Compute Kernels (5)
  • 2016.04.06
  • www.youtube.com
How to write compute kernels in OpenCL for parallelism, OpenCL utility functions and intrinsics.
 

OpenCL ランタイム アーキテクチャ



OpenCL ランタイム アーキテクチャ (6)

このビデオでは、メモリ バスを介して接続された GPU や CPU などのデバイスを含む、OpenCL プラットフォームのアーキテクチャについて説明します。 OpenCL コンテキストは、プラットフォーム内のデバイスのグループ化としても説明され、デバイス間の最適化されたデータ転送が可能になります。コマンド キューは、さまざまなデバイスに作業を送信する手段として導入されていますが、自動分散がないため、デバイス間での作業の分散は手動で行う必要があります。

OpenCL Runtime Architecture (6)
OpenCL Runtime Architecture (6)
  • 2016.04.06
  • www.youtube.com
OpenCL architecture: devices, queues, contexts, compute units, data transfer and utilizing multiple devices.
 

OpenCL でのデータの移動



OpenCL でのデータの移動 (7)

このビデオでは OpenCL でのデータ移動について説明しており、講演者はホスト メモリと GPU の間でデータをコピーするために必要な手動手順と、グローバル メモリとローカル メモリの速度の違いについて説明しています。 GPU のグローバル メモリはアクセスが高速ですが、ホスト メモリから GPU へのデータの取得は遅くなります。 OpenCL のローカル メモリは、大規模な帯域幅でパフォーマンスを向上させることができますが、手動割り当てが必要なため、キャッシュよりも使用するのが困難です。最新の Nvidia GPU では、ローカル メモリを手動で管理するか、代わりにキャッシュとして使用するかを選択できます。推奨されるアプローチは、ローカル データの移動を最適化する前にキャッシュから開始することです。

  • 00:00:00 このセクションでは、講演者が OpenCL でのデータ移動の仕組みと、ホスト メモリから GPU にデータをコピーしたり、その逆にデータをコピーしたりするために必要な手動の手順について説明します。 GPU にはホスト メモリよりもはるかに高速にアクセスできるグローバル メモリがありますが、PCIe バスが原因でホスト メモリから GPU へのデータの取得は遅くなります。 GPU には膨大な帯域幅を持つローカル メモリもあり、それを使用するとパフォーマンスが大幅に向上します。ただし、ローカル メモリへのデータの割り当てとコピーは、各計算ユニットで手動で行う必要があり、面倒な作業になります。

  • 00:05:00 このセクションでは、講演者は OpenCL のローカル メモリ (16 ~ 48 キロバイトの範囲) と、それが 1 秒あたり数千ギガバイトのより高い帯域幅をどのように提供できるかについて話します。ただし、ローカル メモリはキャッシュよりも使いにくいです。キャッシュは、データごとにメモリの異なる部分を割り当てる必要がなく、最近使用したデータを自動的に配置しますが、ローカル メモリは手動で割り当てる必要があるからです。最新の Nvidia GPU では、ローカル メモリを手動で管理するかキャッシュとして使用するかを選択できます。推奨されるアプローチは、ローカル データの移動を最適化する前にキャッシュから開始することです。
Data Movement in OpenCL (7)
Data Movement in OpenCL (7)
  • 2016.04.06
  • www.youtube.com
Host to device transfer speeds, local memory.
 

OpenCL Hello World



OpenCL ハローワールド (8)

このビデオでは、OpenCL を使用してプログラムを作成し、それを GPU デバイスに送信するプロセスが説明されています。講演者は、プログラムの構築、カーネルとメモリ オブジェクトの作成、CPU と GPU 間のデータのコピーの手順を説明します。また、カーネルの引数とディメンションの設定、カーネルの実行、GPU からの結果の取得のプロセスについても説明します。講演者は、複雑なカーネルでは CPU と GPU の両方で最適なパフォーマンスが得られない可能性があり、パフォーマンスを向上させるには修正が必要になる可能性があると述べています。彼らは、OpenCL でのプログラミングのプロセスを、望ましい結果が得られるまで操作が繰り返される数学の問題を解くことに例えています。

  • 00:00:00 このセクションでは、講演者が OpenCL のセットアップとそれを使用したプログラムの作成に必要な手順を説明します。まず、デバイスとプラットフォームをセットアップし、コマンドを実行するためのコンテキストを作成する必要があります。次に、さまざまなデバイスに作業を送信するためのコマンド キューが作成されます。次に、コードがコンパイルされて、キューに送信できるカーネル オブジェクトが取得されます。メモリ オブジェクトはデバイス間でデータを交換するために作成され、引数はカーネルに設定されます。その後、カーネルは実行のためにキューに入れられ、データがデバイスから CPU にコピーされて戻されます。最後に、すべてのコマンドを完了する必要があり、期待どおりにデータが返されるように待機が実装されます。講演者は、デバイスを使用して x の正弦を並列計算する OpenCL Hello World プログラムの例についても説明します。

  • 00:05:00 ビデオのこのセクションでは、講演者が OpenCL を使用してプログラムを作成し、それを GPU デバイスに送信するプロセスについて説明します。彼らはプログラムを構築することから始めますが、初回は時間がかかりますが、2 回目以降は時間がかかりません。次に、CL create kernel を呼び出して、プログラム内の特定のカーネルに対するカーネル オブジェクトを作成します。その後、メモリ オブジェクトを作成し、デバイス上にスペースを割り当て、キュー書き込みバッファの CL を使用して CPU から GPU にデータをコピーします。次に、スピーカーはカーネルの引数と次元を設定し、Q nd range カーネルの CL を使用してカーネルを実行します。最後に、スピーカーは GPU から結果を取得し、CLfinish を呼び出してすべてが完了するのを待ちます。講演者は、複雑なカーネルでは CPU と GPU の両方で最適なパフォーマンスが得られない可能性があり、パフォーマンスを向上させるには修正が必要になる可能性があると述べて締めくくりました。

  • 00:10:00 このセクションでは、講演者は、プログラミングでは、望ましい最終出力が得られるまで特定のコマンドを繰り返すことがよくあると説明します。彼はこれを、正しい答えに到達するまで一連の操作を繰り返し実行する数学の問題を解くことに例えています。同氏は、このプロセスは OpenCL を使用する場合にも似ており、目的の結果が得られるまでプログラミング コマンドが複数回繰り返されると指摘しています。
OpenCL Hello World (8)
OpenCL Hello World (8)
  • 2016.04.06
  • www.youtube.com
Writing a simple Hello World parallel program in OpenCL for GPUs: device setup, kernel compilation, copying data.
 

その他の OpenCL 機能



その他の OpenCL 機能 (9)

このビデオでは、デバイスのクエリ、画像処理、イベントなどの OpenCL の追加機能について説明します。ユーザーは cl_get_device_info コマンドを使用してデバイスの詳細を確認できますが、これらの値は必ずしも完全に正確であるとは限りません。 OpenCL の 2D および 3D 画像タイプのネイティブ サポートは、CPU でのハードウェア サポートがないと速度が低下する可能性がありますが、GPU ではハードウェア アクセラレーションによって高速化されます。イベントは、非同期コマンドの実行や複数のデバイスを操作する場合に不可欠であり、デバイス間の同期を必要とするさまざまなデバイスへの合図として機能します。講演者は、イベントを使用して、カーネルをそれぞれのイベントでキューに入れ、出力をコピーし、イベントが同期を提供するのを待つことによって、カーネル B がカーネル A の終了を待ってから実行されるようにする例を示しました。

  • 00:00:00 このセクションでは、デバイスのクエリ、画像の処理、OpenCL イベントなどの OpenCL の追加機能について講演者が説明します。 cl_get_device_info コマンドを使用してデバイスをクエリすると、ユーザーは、コンピューティング ユニットの数、クロック周波数、グローバル メモリ サイズなどのデバイスに関する情報を確認できます。ただし、講演者は、これらの値は期待どおりに正確ではない可能性があると警告しています。 OpenCL は 2D および 3D 画像タイプをネイティブにサポートしており、線形補間、エッジの回り込み、またはエッジでのクランプが可能です。これらの機能は GPU ではハードウェア アクセラレーションされますが、ハードウェア サポートのない CPU では遅くなります。最後に、イベントは、非同期コマンドの実行や複数のデバイスを操作する場合に重要です。これは、さまざまなデバイスのキューが相互に非同期であり、デバイス間の同期が必要になるためです。

  • 00:05:00 このセクションでは、講演者が OpenCL でのイベントとその使用法について説明します。すべてのエンキュー コマンドの最後には、リスト内のイベントの数、待機リスト、および返されたイベントの 3 つの情報が含まれます。これらを使用すると、ユーザーはイベントを返して追跡し、カーネルが完了したかどうかを確認したり、カーネルが完了するまで他の処理を待機させたり、プロファイリング情報を取得したりすることもできます。講演者は、イベントを使用して、GPU 上のカーネル B が CPU 上のカーネル A が終了するのを確実に待機し、実行前にその出力を GPU にコピーする例を示しました。これには、カーネルをイベントでキューに入れ、コピーを実行し、そのイベントを待機し、同期を確保するために 2 番目のカーネルにコピーを待機させることが含まれます。
More OpenCL Features (9)
More OpenCL Features (9)
  • 2016.04.06
  • www.youtube.com
System information, Image types, events.
 

OpenCL パフォーマンスのヒントと概要



OpenCL パフォーマンスのヒントと概要 (10)

このビデオでは、データ転送の最小化、メモリ アクセスの最適化、プロデューサー/コンシューマー カーネルの使用、ベクトルと高速数学関数の利用など、OpenCL のパフォーマンスを最適化するためのヒントについて説明します。講演者は、GPU に適したアプリケーションは、データが並列であり、計算量が多く、グローバル同期を回避し、単精度で快適で、小さなキャッシュで管理できる必要があることを強調しました。 OpenCL でパフォーマンスが低下した場合は、アルゴリズムを再検討してメモリの局所性、共有メモリまたはローカル メモリを最適化し、ワークアイテム間の不必要な同期を避ける必要がある場合があります。

  • 00:00:00 このセクションでは、講演者が OpenCL のパフォーマンスを最適化するためのヒントについて説明します。これには、データをデバイス上にできるだけ長く保持することで CPU と GPU 間のデータ転送を最小限に抑えることや、プロデューサー/コンシューマー カーネル チェーンを使用することなどが含まれます。講演者はまた、メモリの結合を最適化し、GPU 上のローカル メモリを管理することで、メモリ アクセスを最適化することの重要性を強調しました。さらに、講演者は、ベクトルを使用すると特定のハードウェアのパフォーマンスが向上し、特定の数学関数の高速またはネイティブのバリアントを使用すると速度が大幅に向上する可能性があると述べています。最後に、講演者は、データ並列性、計算集約型、グローバル同期不要、単精度で快適、小規模なキャッシュで管理可能など、GPU に適したアプリケーションの特性について説明します。

  • 00:05:00 このセクションでは、講演者は、OpenCL でパフォーマンスが低下している場合は、アルゴリズムを再考し、並列処理パターンによりよく適合するアルゴリズムを選択する必要があるかもしれないと示唆しています。これには、メモリの局所性を最適化するためのコードの順序や構造の変更、共有メモリまたはローカル メモリの利用、作業項目間の不必要な同期の回避などが含まれる場合があります。
OpenCL Performance Tips and Summary (10)
OpenCL Performance Tips and Summary (10)
  • 2016.04.06
  • www.youtube.com
OpenCL kernel and runtime performance optimizations, checklist for using OpenCL.