OpenCL 操作

OpenCLプログラムは OpenCL1.1以上をサポートするビデオカード上の計算を実行するために使用されます。現代のビデオカードには、着信されたデータストリームを同時に単純な数学的操作を実行することが出来る小さな専用プロセッサの数百人が含まれています。OpenCLの言語は、並列コンピューティングを整理し、特定クラスのタスクためのより大きな速度を提供します。

グラフィックカードによっては double 型の数の操作はデフォルトでは無効にされています。これはコンパイルエラー5105 につながります。double 型数値のサポートを有効にするには #pragma OPENCL EXTENSION cl_khr_fp64 : enable ディレクティブをお使いのプログラムに追加してください。グラフィックカードが double をサポートしない場合は、ディレクティブの使用はサポートを有効にしません。

OpenCL用のソースコードは別のCLファイルに書き込むことをお勧めします。これらのファイルは後にリソース変数を使用してMQL5プログラムに組み込むことができます。

OpenCL プログラムでのエラー処理

OpenCLプログラムで直近のエラーに関する情報を取得するには、エラーコードとテキスト記述を取得できるようにするCLGetInfoIntegerおよびCLGetInfoString関数を使用します。

OpenCLの直近のエラー コード: 直近のOpenCLエラーを取得するには、CLGetInfoIntegerを呼び出します。handleパラメータは無視されます(ゼロに設定できます)。エラーの説明:https://registry.khronos.org/OpenCL/specs/3.0-unified/html/OpenCL_API.html#CL_SUCCESS

不明なエラーコードの場合、「unknown OpenCL error N」という文字列が返されます。N はエラーコードです。例:

//--- 直近のエラーコードを取得するとき、最初のhandleパラメータは無視される
intcode= (int)CLGetInfoInteger(0,CL_LAST_ERROR);

OpenCLエラーの文字での説明:直近のOpenCLエラーを取得するには、CLGetInfoStringを呼び出します。エラー コードは、handleパラメータとして渡す必要があります。

エラーの説明:https://registry.khronos.org/OpenCL/specs/3.0-unified/html/OpenCL_API.html#CL_SUCCESS. エラーコードの代わりにCL_LAST_ERRORが渡された場合、関数は最後のエラーの説明を返します。例:

//--- 直近のOpenCLエラーのコードを取得する
int   code= (int)CLGetInfoInteger(0,CL_LAST_ERROR);
stringdesc;// エラーのテキスト記述を取得
 
//--- エラーコードを使用してエラーのテキスト記述を取得
if(!CLGetInfoString(code,CL_ERROR_DESCRIPTION,desc))
desc="cannot get OpenCL error description,"+ (string)GetLastError();
Print(desc);
 
//--- 最初にコードを取得せずに最後のOpenCLエラー記述を取得するには、CL_LAST_ERROR を渡す  
if(!CLGetInfoString(CL_LAST_ERROR,CL_ERROR_DESCRIPTION,desc))
desc="cannot get OpenCL error description,"+ (string)GetLastError();
Print(desc);;

これまでのところ、エラー記述として内部列挙の名前が示されています。そのデコードはhttps://registry.khronos.org/OpenCL/specs/3.0-unified/html/OpenCL_API.html#CL_SUCCESSで確認できます。たとえば、CL_INVALID_KERNEL_ARGS 値は、「一部のカーネル引数が設定されていないか無効な場合に、カーネルをキューに入れるときに返される」ことを意味します。

OpenCL でプログラムを実行するための関数

関数

アクション

CLHandleType

OpenCL ハンドルの型をENUM_OPENCL_HANDLE_TYPE 列挙の値として返します。

CLGetInfoInteger

OpenCL オブジェクトまたはデバイスから整数プロパティ値を返します。

CLContextCreate

OpenCL コンテキストを作成します。

CLContextFree

OpenCL コンテキストを削除します。

CLGetDeviceInfo

OpenCL ドライバからデバイスプロパティを受け取ります。

CLProgramCreate

OpenCLプログラムをソースコードから作成します。

CLProgramFree

OpenCLプログラムを削除します。

CLKernelCreate

OpenCL start 関数を作成します。

CLKernelFree

OpenCL start 関数を削除します。

CLSetKernelArg

OpenCL 関数のパラメータを設定します。

CLSetKernelArgMem

OpenCL バッファを OpenCL 関数のパラメータをして設定します。

CLSetKernelArgMemLocal

ローカルバッファをカーネル関数の引数として設定します。

CLBufferCreate

OpenCL バッファを作成します。

CLBufferFree

OpenCL バッファを削除します。

CLBufferWrite

配列を OpenCL バッファに書き込みます。

CLBufferRead

OpenCL バッファを配列に読み込みます。

CLExecute

OpenCLプログラムを実行します。

CLExecutionStatus

OpenCLプログラム実行ステータスを返します。

参照

OpenCL, リソース