使用OpenCL工作
使用OpenCL工作
OpenCL 程序用来执行支持OpenCL 1.1或更高版本视频卡上的计算. 现代视频卡包含数百个小型专用处理器,可以同时与输入数据流进行简单的数学运算. OpenCL语言组织了并行计算并且为一类特定任务提供了更快的速度.
在一些图形卡中默认禁止处理double类型数字。这可能会导致编译错误5105。若要启用支持double类型数字,请添加以下指令到您的OpenCL程序:#pragma OPENCL EXTENSION cl_khr_fp64 : enable。但是,如果图形卡不支持double型,启用该指令则不会有帮助。
建议以单独的CL文件编写OpenCL源代码,稍后将其包含进使用资源变量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=“无法获取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程序执行状态。 |