使用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, 资源