Работа с OpenCL

Программы на OpenCL предназначены для выполнения вычислений на видеокартах с поддержкой стандарта OpenCL 1.1 или выше. Современные видеокарты содержат сотни небольших специализированных процессоров, которые могут одновременно выполнять простые математические операции над входящими потоками данных. Язык OpenCL берёт на себя организацию таких параллельных вычислений и позволяет добиться огромного ускорения для некоторого класса задач.

На некоторых видеокартах по умолчанию отключен режим работы с числами типа double, что приводит к возникновению ошибки компиляции 5105. Для включения режима поддержки чисел double в текст OpenCL-программы нужно добавить директиву #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 игнорируется при получении кода последней ошибки
int code = (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);
string desc// для получения текстового описания ошибки
 
//--- используем код ошибки для получения текстового описания ошибки
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_DESCRIPTIONdesc))
   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, описание для него "Returned when enqueuing a kernel when some kernel arguments have not been set or are invalid."

 

Функции для выполнения программ на OpenCL:

Функция

Действие

CLHandleType

Возвращает тип OpenCL хендла в виде значения из перечисления ENUM_OPENCL_HANDLE_TYPE

CLGetInfoInteger

Возвращает значение целочисленного свойства для OpenCL-объекта или устройства

CLGetInfoString

Возвращает строковое значение свойства для OpenCL-объекта или устройства

CLContextCreate

Cоздает контекст OpenCL

CLContextFree

Удаляет контекст OpenCL

CLGetDeviceInfo

Получает свойство устройства из OpenCL драйвера

CLProgramCreate

Создает OpenCL программу из исходного кода

CLProgramFree

Удаляет OpenCL программу

CLKernelCreate

Создает функцию запуска OpenCL

CLKernelFree

Удаляет функцию запуска OpenCL

CLSetKernelArg

Выставляет параметр для функции OpenCL

CLSetKernelArgMem

Выставляет буфер OpenCL в качестве параметра функции OpenCL

CLSetKernelArgMemLocal

Задаёт локальный буфер в качестве аргумента kernel-функции

CLBufferCreate

Создает буфер OpenCL

CLBufferFree

Удаляет буфер OpenCL

CLBufferWrite

Записывает массив в буфер OpenCL и возвращает количество записанных элементов

CLBufferRead

Читает буфер OpenCL в массив и возвращает количество прочитанных элементов

CLExecute

Выполняет OpenCL программу

CLExecutionStatus

Возвращает состояние выполнения OpenCL программы

Смотри также

OpenCL, Ресурсы