OpenCL: testes internos de implementação em MQL5 - página 20

 

Os códigos serão adicionados:

ERR_OPENCL_NOT_SUPPORTED           5100    
ERR_OPENCL_INTERNAL                5101
ERR_OPENCL_INVALID_HANDLE          5102
ERR_OPENCL_CONTEXT_CREATE          5103
ERR_OPENCL_QUEUE_CREATE            5104
ERR_OPENCL_PROGRAM_CREATE          5105
ERR_OPENCL_TOO_LONG_KERNEL_NAME    5106
ERR_OPENCL_KERNEL_CREATE           5107
ERR_OPENCL_SET_KERNEL_PARAMETER    5108
ERR_OPENCL_EXECUTE                 5109
ERR_OPENCL_WRONG_BUFFER_SIZE       5110
ERR_OPENCL_WRONG_BUFFER_OFFSET     5111
ERR_OPENCL_BUFFER_CREATE           5112
 
Rosh:

Os códigos serão adicionados:

Obrigado, então o que falta é uma função para verificar a validade do punho.

Só aceitamos das funções CL o valor do ponteiro, não o ponteiro em si, pelo que o armazenamento do ponteiro em locais diferentes causará uma situação de tentar remover um processo inválido (seja ele contexto, tampão, programa ou núcleo).

função requerida:

bool CLCheckHandle(int handle);
 
E também é necessário programar o tamanho da memória do dispositivo, porque os widgets têm menos memória do que os CPU, e todos os contextos simultaneamente existentes utilizam a mesma memória.
 
Urain:
E também é necessário obter programmaticamente o tamanho da memória do dispositivo, porque as visões têm menos memória do que as CPU, enquanto todos os contextos simultaneamente existentes utilizam a mesma memória.

Seria bom obter a temperatura da placa (e do CPU também) por meios mql padrão, a fim de dosear a carga.

// Porque tenho andado um pouco agitado... :)

 
MetaDriver:
Alguém lê este fio? É como um monólogo :)
 
Não há nenhuma funcionalidade no OpenCL para obter temperatura e carga GPU.
A obtenção das propriedades dos objectos OpenCL será em breve.
Será também organizado um controlo do manuseamento.
 
mql5:
1. não há nenhuma funcionalidade no OpenCL para obter a temperatura e carga da GPU.
2. As propriedades de busca de objectos OpenCL estarão disponíveis em breve.
3. a verificação do manuseamento será também organizada.

1. eu sei. Não tem de ser através do OpenCL, tem de ser através do sistema. A ideia é apenas tornar a funcionalidade nativa (sem chamadas DLL de programas mql5).

Aqui estão algumas funções excelentes:

TerminalInfoInteger

Devolve um valor inteiro de uma propriedade ambiental correspondente de um programa mql5.

TerminalInfoString

Retorna um valor de string de uma propriedade de ambiente correspondente de um programa mql5

MQL5InfoInteger

Retorna um valor do tipo inteiro de uma propriedade correspondente de um programa mql5 em execução

MQL5InfoString

Devolve um valor de tipo string de uma propriedade correspondente de um programa de mql5 lançado

Seria bom e lógico acrescentar:

SystemInfoInteger e portanto

SystemInfoString

que dá acesso a toda a informação necessária sobre o ambiente do sistema: número de núcleos, nome e tamanho do sistema operativo, quantidade de memória (total), quantidade de memória disponível (RAM e espaço em disco), etc., etc.

Afinal, o terminal não funciona em espaço vazio e eterno. Caso contrário, parece muito arenoso.

2, 3.

4. não se esqueça de implementar um acesso de buffer normal (cl_Read/WriteBuffer), especificando ambos os offsets de início (tanto o offset mql-array como o offset no cl-buffer). Caso contrário, quase todas as matrizes têm de ser copiadas duas vezes - será que precisamos mesmo delas? Não estamos a escrever em OpenCL para perder tempo a reescrever do nada em nada. Isso não é justo. :)

 
MetaDriver:
...

4. certificar-se de que já tem um acesso de buffer normal (cl_Read/WriteBuffer), especificando ambos os offsets iniciais (tanto o offset mql-array como o offset cl-buffer). Caso contrário, quase todas as matrizes têm de ser copiadas duas vezes - será que precisamos mesmo delas? Não estamos a escrever em OpenCL para perder tempo a reescrever do nada em nada. Isso não é justo. :)

Esclareça o que quer dizer com isso.

Ainda não me deparei com as situações que está a descrever até agora.

 
Urain:

Especifique o que quer dizer com isso.

Para que serve, ainda não encontrei as situações que descreve.

Não há problema. Aqui está um exemplo recente. A construção da família Ema.

...........  
 while(limit/(cl_BufLength-1)>0)
     {
       for(int i=0;i<CountLine;i++)
         {
          dOut[i]=EmaBuffer[i].B[limit];  // переписываем начальные значения Ema
                            // в промежуточный массив, поскольку напрямую с указанного смещения 
                            // загрузить в буфер невозможно.
         }
       CLBufferWrite(cl_Mem_Out,dOut,0,CountLine*sizeof(double));  // загружаем в gpu
       for(int i=1;i<cl_BufLength;i++)
         {
          dIn[i]=price[limit-i];                 // переписываем цены
                                                // То же самое с ценами.
         }
       CLBufferWrite(cl_Mem_In,dIn);  // загружаем в gpu

       CLExecute(cl_Krn,1,kOfs,kWork);
.........
..........

Nada de exótico é necessário. Só quero que seja como aqui:

int  ArrayCopy(
   void  dst_array[],       // куда копируем
   void  src_array[],       // откуда копируем
   int   dst_start=0,       // с какого индекса пишем в приемник
   int   src_start=0,       // с какого индекса копируем из источника
   int   cnt=WHOLE_ARRAY    // сколько элементов
   );

 
MetaDriver:

Não há problema. Aqui está um exemplo recente. Construir a família Ema

Nada de exótico é necessário, só quero que seja como aqui:

int  ArrayCopy(
   void  dst_array[],       // куда копируем
   void  src_array[],       // откуда копируем
   int   dst_start=0,       // с какого индекса пишем в приемник
   int   src_start=0,       // с какого индекса копируем из источника
   int   cnt=WHOLE_ARRAY    // сколько элементов
   );



Sim, já percebi, não se quer que algoritmos mais complicados e que a memória se sobreponha à utilização

//Выполняет OpenCL программу.
bool  CLExecute(int          kernel,                 // хендл на кернел OpenCL
                uint         work_dim,               // размерность пространства задач 
                const uint&  global_work_offset[],   // начальное смещение индексов
                const uint&  global_work_size[]     // общее количество индексов
                );

e pretende ser capaz de compensar na fase de cópia.

Não quero copiar 100000 elementos e depois fazer 998000 shift. Mas devemos deixar a variante com o turno que temos agora, porque permite não copiar muitas vezes os mesmos dados, mas levá-los para uma nova tarefa a partir de um buffer CL já preparado com um novo turno.

SZY também seria bom poder sobrescrever, realocando ou sobrescrevendo parte dos dados no buffer CL, então os novos dados recebidos do tick poderiam ser adicionados sem ter de comprar todos os dados. Em tempo real, isto é pouco útil, mas no testador é.