OpenCL: внутренние тесты реализации в MQL5 - страница 20

Rashid Umarov
Админ
16579
Rashid Umarov  

Коды будут добавлены:

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
Nikolay Demko
13933
Nikolay Demko  
Rosh:

Коды будут добавлены:

Спасибо, тогда не хватает функции проверки хендла на валидность.

Мы же принимаем от CL функций лишь значение указателя, а не сам  указатель, поэтому при хранении указателя в разных местах будет возникать ситуация попытки удалить невалидный процесс (будь то контекст, буффер, программу или ядро).

требуется функция:

bool CLCheckHandle(int handle);
Nikolay Demko
13933
Nikolay Demko  
И ещё нужно программно получать размер памяти девайса, а то ведь у видях памяти поменьше чем оперативы у проца, а все одновременно существующие контексты пользуют одну память.

Vladimir Gomonov
8292
Vladimir Gomonov  
Urain:
И ещё нужно программно получать размер памяти девайса, а то ведь у видях памяти поменьше чем оперативы у проца, а все одновременно существующие контексты пользуют одну память.

Хорошо бы штатными средствами mql получать температуру карты (да и CPU тоже), чтоб нагрузку дозировать.

// А то я тут не на шутку разошёлся.. :)


Nikolay Demko
13933
Nikolay Demko  
MetaDriver:
А вообще эту ветку кто то читает? а то вроде как монологом постим :)
Ilyas
1420
Ilyas  
Нет в OpenCL функционала получить температуру и загрузку GPU.
Получение свойств OpenCL объектов будет в ближайшее время.
Проверку хендлов тоже организуем.
Vladimir Gomonov
8292
Vladimir Gomonov  
mql5:
1.  Нет в OpenCL функционала получить температуру и загрузку GPU.
2.  Получение свойств OpenCL объектов будет в ближайшее время.
3.  Проверку хендлов тоже организуем.

1.  Я знаю. Это не надо через OpenCL,  это надо через систему.  Идея всего лишь в том, чтоб функционал был нативным (без вызовов DLL из mql5-программ).

Вот есть прекрасные функции:

TerminalInfoInteger

Возвращает значение целого типа соответствующего свойства окружения mql5-программы

TerminalInfoString

Возвращает значение типа string соответствующего свойства окружения mql5-программы

MQL5InfoInteger

Возвращает значение целого типа соответствующего свойства запущенной mql5-программы

MQL5InfoString

Возвращает значение типа string соответствующего свойства запущенной mql5-программы

Замечательно и логично было бы к ним добавить:

  SystemInfoInteger  и, соответственно

  SystemInfoString 

с возможностью получения необходимой информации о системном окружении: кол-во ядер, имя и разрядность операционки, количество памяти (всего), количество доступной (свободной) памяти (ОЗУ и дисковой) и т.д. и т.п.

Всё-таки терминал не в пустом бесконечном пространстве вечности работает. А то как-то уж совсем по песочному получается.

2, 3.  Ура.

4. Обязательно сделайте уже нормальное обращение к буферам (cl_Read/WriteBuffer) с указанием обоих стартовых смещений (и смещение mql-массива и смещение в cl-буфере). Иначе приходится дважды копировать почти все массивы.  Оно нам надо? Мы ж на OpenCL пишем не для того чтоб терять время на переписывание из пустого в порожнее. Так не честно. :)

Nikolay Demko
13933
Nikolay Demko  
MetaDriver:
...

4. Обязательно сделайте уже нормальное обращение к буферам (cl_Read/WriteBuffer) с указанием обоих стартовых смещений (и смещение mql-массива и смещение в cl-буфере). Иначе приходится дважды копировать почти все массивы.  Оно нам надо? Мы ж на OpenCL пишем не для того чтоб терять время на переписывание из пустого в порожнее. Так не честно. :)

Уточни что ты имеешь в виду.

Для чего это нужно, я пока не столкнулся с ситуациями которые ты описуешь.

Vladimir Gomonov
8292
Vladimir Gomonov  
Urain:

Уточни что ты имеешь в виду.

Для чего это нужно, я пока не столкнулся с ситуациями которые ты описуешь.

Не вопрос. Вот недавний пример. Построение семейства 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);
.........
..........

Ничего экзотического не требуется.  Просто хочу, чтоб как здесь было:

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



Nikolay Demko
13933
Nikolay Demko  
MetaDriver:

Не вопрос. Вот недавний пример. Построение семейства Ema

Ничего экзотического не требуется.  Просто хочу, чтоб как здесь было:

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



Ага, я кажется понял, тебя не устраивает усложнение алгоритмов и перерасход памяти от применения

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

и ты хочешь иметь возможность смещения ещё на этапе копирования.

ЗЫ Чтоб не нужно было копировать 100000 элементов а потом делать 998000 смещение. Но вариант со смещением что есть сейчас нужно оставить тк он позволяет не копировать много раз одни и те же данные, а брать их для новой задачи из уже готового CL буффера с новым смещением.

ЗЫ а ещё хорошо бы иметь возможность дописывать переразбивая размер либо писать поверх часть данных в CL буффер, тогда вновь поступившие данные от тика можно добавить не купирую все данные. В реалтайме это врядли пригодится, а вот в тестере волне.