Trabajo con OpenCL

Los programas en OpenCL sirven para ejecutar los cálculos en las tarjetas gráficas con el soporte del estándar OpenCL 1.1 o superior. Las tarjetas gráficas modernas cuentan con centenares de pequeños procesadores especializados que son capaces de realizar simultáneamente las operaciones matemáticas sencillas con los flujos de datos entrantes. El lenguaje OpenCL se encarga de estos cálculos paralelos y permite alcanzar una aceleración increíble para algunos tipos de tareas.

En algunas tarjetas gráficas, por defecto, está desactivado el modo de trabajo con los números del tipo double lo que provoca el error de compilación 5105. Para activar el modo del soporte de los números double, hay que insertar la siguiente directiva en el texto del programa OpenCL: #pragma OPENCL EXTENSION cl_khr_fp64 : enable. No obstante, si la tarjeta gráfica no soporta double, la inserción de esta directiva no servirá de nada.

Es recomendable escribir el código fuente de OpenCL en archivos CL aparte, que después se puedan incluir en el programa MQL5 con la ayuda de las variables de recurso.

Procesamiento de archivos en programas OpenCL

Para obtener la información sobre el último error en un programa OpenCL, se usarán las funciones CLGetInfoInteger y CLGetInfoString, que permiten obtener el código de error y la descripción textual.

Código de error OpenCL: para obtener el último error OpenCL, use la llamada CLGetInfoInteger, en este caso, además, el parámetro handle será ignorado, es decir, no tendrá ningún valor (se puede indicar cero). Descripción de errores: https://registry.khronos.org/OpenCL/specs/3.0-unified/html/OpenCL_API.html#CL_SUCCESS.

Para un código de error desconocido, se retornará la línea "unknown OpenCL error N", donde N será el código de error. Ejemplo:

//--- el primer parámetro de handle se ignorará al obtener el último código de error
int code = (int)CLGetInfoInteger(0,CL_LAST_ERROR);

Mensaje textual del error OpenCL: para obtenr el último error OpenCL, use la llamada CLGetInfoString, en este caso, además, como parámetro handle se transmitirá el código del error.

Descripción del error: https://registry.khronos.org/OpenCL/specs/3.0-unified/html/OpenCL_API.html#CL_SUCCESS. Si se transmite CL_LAST_ERROR en lugar del código de error, la función retornará la descripción del último error. Ejemplo:

//--- obtener el último código de error de OpenCL
int    code = (int)CLGetInfoInteger(0,CL_LAST_ERROR);
string desc// para obtener una descripción de texto del error
 
//--- use el código de error para obtener una descripción textual del error
if(!CLGetInfoString(code,CL_ERROR_DESCRIPTION,desc))
   desc = "cannot get OpenCL error description, " + (string)GetLastError();
Print(desc);
 
//--- para obtener la descripción del último error de OpenCL sin obtener primero el código, se deberá transmitir CL_LAST_ERROR  
if(!CLGetInfoString(CL_LAST_ERROR,CL_ERROR_DESCRIPTIONdesc))
   desc = "cannot get OpenCL error description, " + (string)GetLastError();
Print(desc);;

Hasta ahora, como descripción del error se daba el nombre de la enumeración interna, cuya decodificación se puede ver en la página. https://registry.khronos.org/OpenCL/specs/3.0-unified/html/OpenCL_API.html#CL_SUCCESS. Por ejemplo, si se obtiene el valor CL_INVALID_KERNEL_ARGS, la descripción del mismo será "Returned when enqueuing a kernel when some kernel arguments have not been set or are invalid."

Funciones para ejecutar programas en OpenCL:

Función

Acción

CLHandleType

Devuelve el tipo de manejador OpenCL como un valor de la enumeración ENUM_OPENCL_HANDLE_TYPE

CLGetInfoInteger

Devuelve el valor de una propiedad de números enteros para el objeto o dispositivo OpenCL

CLContextCreate

Crea el contexto OpenCL

CLContextFree

Elimina el contexto OpenCL

CLGetDeviceInfo

Recibe la propiedad del dispositivo desde el controlador de dispositivo OpenCL

CLProgramCreate

Crea un programa OpenCL desde el código fuente

CLProgramFree

Elimina un programa OpenCL

CLKernelCreate

Crea la función del arranque OpenCL

CLKernelFree

Elimina la función del arranque OpenCL

CLSetKernelArg

Establece un parámetro para la función OpenCL

CLSetKernelArgMem

Establece el búfer OpenCL como el parámetro de la función OpenCL

CLSetKernelArgMemLocal

Define el búfer local como argumento de la función núcleo

CLBufferCreate

Crea el búfer OpenCL

CLBufferFree

Elimina el búfer OpenCL

CLBufferWrite

Escribe un array en el búfer OpenCL

CLBufferRead

Lee el búfer OpenCL en un array

CLExecute

Ejecuta un programa OpenCL

CLExecutionStatus

Retorna el estado de ejecución del programa OpenCL

Véase también

OpenCL, Recursos