Trabalhando com OpenCL

Programas em OpenCLsão utilizados para a realização de cálculos sobre placas de vídeo que suportam OpenCL 1.1 ou superior. Placas de vídeo modernas contêm centenas de pequenos processadores especializados que podem executar simultaneamente operações matemáticas simples, com fluxos de dados de entrada. A linguagem OpenCL organiza computação paralela e proporciona maior velocidade para uma certa classe de tarefas.

Em algumas placas de vídeo, o modo com números de tipo double está desativado por padrão, o que leva a o erro de compilação 5105. Para ativar o modo de suporte de números double, no texto do programa OpenCl, é preciso adicionar a diretiva #pragma OPENCL EXTENSION cl_khr_fp64 : enable. No entanto, se a placa de vídeo não suportar double, a desativação dessa diretiva não irá ajudar.

É recomendado escrever o código-fonte OpenCL em arquivos CL separados, que podem então ser ligados ao programa MQL5 usando variáveis ​​de recursos.

Processamento de erros em programas OpenCL

Para obter informações sobre o erro mais recente no OpenCL, use as funções CLGetInfoInteger e CLGetInfoString, que proporcionam um código de erro e uma descrição de texto.

Código do último erro OpenCL: Para obter o erro OpenCL mais recente, use a chamada CLGetInfoInteger. Aqui o parâmetro handle é ignorado, ou seja, não importa (você pode especificar zero). Descrição de erros: https://registry.khronos.org/OpenCL/specs/3.0-unified/html/OpenCL_API.html#CL_SUCCESS.

Para o código de erro desconhecido, "unknown OpenCL error N" é retornado, aqui N é o código de erro. Exemplo:

//--- o primeiro identificador de parâmetro é ignorado ao receber o código do último erro
int code = (int)CLGetInfoInteger(0,CL_LAST_ERROR);

Descrição de texto do erro OpenCL: Para obter o erro OpenCL mais recente, use a chamada CLGetInfoString. Aqui é necessário passa o código de erro como parâmetro handle.

Descrição de erros: https://registry.khronos.org/OpenCL/specs/3.0-unified/html/OpenCL_API.html#CL_SUCCESS. Se for passado CL_LAST_ERROR no lugar do código do erro, então a função retornará a descrição do último erro. Exemplo:

//--- obtém o código do último erro OpenCL
int    code = (int)CLGetInfoInteger(0,CL_LAST_ERROR);
string desc// obtém a descrição de texto do erro
 
//--- usa o código de erro para obter uma descrição de texto do erro
if(!CLGetInfoString(code,CL_ERROR_DESCRIPTION,desc))
   desc = "cannot get OpenCL error description, " + (string)GetLastError();
Print(desc);
 
//--- para obter a descrição do último erro OpenCL sem obter o código primeiro, é necessário passar CL_LAST_ERROR  
if(!CLGetInfoString(CL_LAST_ERROR,CL_ERROR_DESCRIPTIONdesc))
   desc = "cannot get OpenCL error description, " + (string)GetLastError();
Print(desc);;

Atualmente, como explicação do erro, é fornecido o nome da enumeração interna cuja decodificação pode ser encontrada na página https://registry.khronos.org/OpenCL/specs/3.0-unified/html/OpenCL_API.html#CL_SUCCESS. Por exemplo, se o valor CL_INVALID_KERNEL_ARGS for recebido, a descrição dele será "Returned when enqueuing a kernel when some kernel arguments have not been set or are invalid."

Funções para os programas em execução em OpenCL:

Função

Ação

CLHandleType

Retorna o tipo do manipulador de OpenCL como valor da enumeração ENUM_OPENCL_HANDLE_TYPE

CLGetInfoInteger

Retorna o valor da propriedade de uma integer para um objeto ou dispositivo OpenCL

CLContextCreate

Cria um contexto OpenCL

CLContextFree

Remove um contexto OpenCL

CLGetDeviceInfo

Receives device property from OpenCL driver

CLProgramCreate

Cria um programa OpenCL a partir de um código fonte

CLProgramFree

Remove um programa OpenCL

CLKernelCreate

Cria uma função de partida OpenCL

CLKernelFree

Remove uma função de partida OpenCL

CLSetKernelArg

Define um parâmetro para a função OpenCL

CLSetKernelArgMem

Define um buffer OpenCL como um parâmetro da função OpenCL

CLSetKernelArgMemLocal

 

CLBufferCreate

Cria um buffer OpenCL

CLBufferFree

Exclui um buffer OpenCL

CLBufferWrite

Grava um array num buffer OpenCL

CLBufferRead

Lê um buffer de OpenCL num array

CLExecute

Executa um programa OpenCL

CLExecutionStatus

 

Também Veja

OpenCL, Recursos