跳至内容
使用OpenCL工作

使用OpenCL工作

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