OpenCL: pruebas de implementación interna en MQL5 - página 20

 

Se añadirán los códigos:

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:

Se añadirán los códigos:

Gracias, entonces lo que falta es una función que compruebe la validez del mango.

Sólo aceptamos de las funciones CL el valor del puntero, no el puntero en sí, por lo que almacenar el puntero en diferentes lugares provocará una situación de intento de eliminación de un proceso no válido (ya sea contexto, buffer, programa o kernel).

función requerida:

bool CLCheckHandle(int handle);
 
Y también es necesario obtener programáticamente el tamaño de la memoria del dispositivo, porque los widgets tienen menos memoria que la de la CPU, y todos los contextos existentes simultáneamente utilizan la misma memoria.
 
Urain:
Y también es necesario obtener programáticamente el tamaño de la memoria del dispositivo, porque las visiones tienen menos memoria que las CPU, mientras que todos los contextos existentes simultáneamente utilizan la misma memoria.

Sería bueno obtener la temperatura de la tarjeta (y de la CPU también) por medios estándar de mql para dosificar la carga.

// Porque he estado un poco alborotado... :)

 
MetaDriver:
¿Alguien lee este hilo? Es como un monólogo :)
 
No hay ninguna funcionalidad en OpenCL para obtener la temperatura y la carga de la GPU.
La obtención de las propiedades de los objetos OpenCL estará disponible próximamente.
También se organizará la comprobación de las manillas.
 
mql5:
1. no hay ninguna funcionalidad en OpenCL para obtener la temperatura y la carga de la GPU.
2. La obtención de propiedades de objetos OpenCL estará disponible en breve.
3. También se organizará la comprobación de las manillas.

1. Lo sé. No tiene que ser a través de OpenCL, tiene que ser a través del sistema. La idea es simplemente hacer la funcionalidad nativa (sin llamadas DLL de programas mql5).

Aquí hay algunas funciones excelentes:

TerminalInfoInteger

Devuelve un valor entero de una propiedad de entorno correspondiente de un programa mql5.

TerminalInfoString

Devuelve un valor de cadena de una propiedad de entorno correspondiente de un programa mql5

MQL5InfoInteger

Devuelve un valor de tipo entero de una propiedad correspondiente de un programa mql5 en ejecución

MQL5InfoString

Devuelve un valor de tipo cadena de una propiedad correspondiente de un programa mql5 lanzado

Sería bueno y lógico añadir:

SystemInfoInteger y por lo tanto

SystemInfoString

que proporciona acceso a toda la información necesaria sobre el entorno del sistema: número de núcleos, nombre y tamaño del sistema operativo, cantidad de memoria (total), cantidad de memoria disponible (libre) (RAM y espacio en disco), etc., etc.

Después de todo, el terminal no funciona en el espacio eterno vacío. Por lo demás, tiene un aspecto muy arenoso.

2, 3.

4. Asegúrate de implementar un acceso normal al buffer (cl_Read/WriteBuffer), especificando ambos offsets de inicio (tanto el offset de la matriz mql como el del buffer cl). De lo contrario, casi todas las matrices tienen que ser copiadas dos veces - ¿realmente lo necesitamos? No estamos escribiendo en OpenCL para perder tiempo reescribiendo de la nada a la nada. Eso no es justo. :)

 
MetaDriver:
...

4. asegúrate de que ya tienes un acceso normal al buffer (cl_Read/WriteBuffer), especificando ambos offsets de inicio (tanto el offset de mql-array como el offset de cl-buffer). De lo contrario, casi todas las matrices tienen que ser copiadas dos veces - ¿realmente lo necesitamos? No estamos escribiendo en OpenCL para perder tiempo reescribiendo de la nada a la nada. Eso no es justo. :)

Aclare lo que quiere decir con eso.

Hasta ahora no me he encontrado con las situaciones que describes.

 
Urain:

Especifique qué quiere decir con eso.

Para qué sirve, aún no me he encontrado con las situaciones que describes.

No hay problema. He aquí un ejemplo reciente. Construyendo la familia 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);
.........
..........

No hace falta nada exótico. Sólo quiero que sea como aquí:

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

 
MetaDriver:

No hay problema. He aquí un ejemplo reciente. Construyendo la familia Ema

No se requiere nada exótico, sólo quiero que sea como aquí:

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



Sí, lo entiendo, no quieres algoritmos más complicados y excesos de memoria por usar

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

y quieres ser capaz de compensar en la fase de copia.

No quiero copiar 100000 elementos y luego hacer 998000 desplazamientos. Pero debemos dejar la variante con desplazamiento que tenemos ahora, porque permite no copiar muchas veces los mismos datos, sino tomarlos para una nueva tarea desde un buffer CL ya preparado con un nuevo desplazamiento.

SZY también estaría bien poder sobrescribir reasignando o sobrescribiendo parte de los datos en el buffer de CL, entonces se podrían añadir los nuevos datos recibidos del tick sin tener que comprar todos los datos. En tiempo real esto apenas es útil, pero en el probador sí.