使用OpenCL工作

OpenCL 程序用来执行支持OpenCL 1.1或更高版本视频卡上的计算. 现代视频卡包含数百个小型专用处理器,可以同时与输入数据流进行简单的数学运算. OpenCL语言组织了并行计算并且为一类特定任务提供了更快的速度.

在一些图形卡中默认禁止处理double类型数字。这可能会导致编译错误5105。若要启用支持double类型数字,请添加以下指令到您的OpenCL程序:#pragma OPENCL EXTENSION cl_khr_fp64 : enable。但是,如果图形卡不支持double型,启用该指令则不会有帮助。

建议以单独的CL文件编写OpenCL源代码,稍后将其包含进使用资源变量MQL5程序。

处理OpenCL程序中的错误

若要获取有关OpenCL程序中最后一个错误的信息,请使用允许获取错误代码和文本描述的CLGetInfoIntegerCLGetInfoString函数。

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=“无法获取OpenCL错误描述,”+ (string)GetLastError();
Print(desc);
 
//--- 若要在不先获取代码的情况下,获取最后一个OpenCL错误的描述,请传递CL_LAST_ERROR  
if(!CLGetInfoString(CL_LAST_ERROR,CL_ERROR_DESCRIPTION,desc))
 desc=“无法获取OpenCL错误描述,”+ (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开始函数

CLKernelFree

移除OpenCL开始函数

CLSetKernelArg

为OpenCL函数设置一个参数

CLSetKernelArgMem

设置OpenCL缓冲作为OpenCL函数的参数

CLSetKernelArgMemLocal

设置本地缓冲区作为内核函数参数

CLBufferCreate

创建OpenCL缓冲

CLBufferFree

删除OpenCL缓冲

CLBufferWrite

写入数组到OpenCL缓冲

CLBufferRead

读取OpenCL缓冲到数组

CLExecute

运行OpenCL程序

CLExecutionStatus

返回OpenCL程序执行状态。

另见

OpenCL, 资源