Ошибки, баги, вопросы - страница 3253

 

Оказалось, что работа класса Convas чувствительна к длине пути каталога, откуда будет запущена программа.

Так, при длине пути 104 символа всё ещё работает, и где то в промежутке до 128 символов перестаёт работать. Все варианты длины перебирать, что бы найти точное значение, не стал. Никаких ошибок при этом не удалось получить. Сведения об этой особенности конваса тоже не нашёл в документации. Причем остальной код программы (в примере не приведён) работает без нареканий.

Код для воспроизведения:

#include <Canvas\Canvas.mqh>

int WidthMonitor = 640;  //monitor screen width
int HeighMonitor = 480;  //monitor screen height

CCanvas Canvas;

void OnStart ()
{
  ResetLastError ();

  string canvasName = "TestConvasLongPath";
  if (!Canvas.CreateBitmapLabel (canvasName, 5, 35, WidthMonitor, HeighMonitor, COLOR_FORMAT_ARGB_RAW))
  {
    Print ("Error creating Canvas: ", GetLastError ());
    return;
  }

  ObjectSetInteger (0, canvasName, OBJPROP_HIDDEN, false);
  ObjectSetInteger (0, canvasName, OBJPROP_SELECTABLE, true);

  Canvas.Erase         (COLOR2RGB (clrBlack));
  Canvas.FillRectangle (3, 3,  WidthMonitor - 4, HeighMonitor - 4, COLOR2RGB (clrWhite));

  Canvas.Update ();
  Print (GetLastError ());

  return;
}

Как работает:

norm

как не работает:

Error

 
Aleksey Vyazmikin #:

Прошу подсказать, будет ли работать карта GeForce GTX 1660s с OpenCL в MT5? Или по прежнему только карты от AMD?

Да, Nvidia карты (как и все другие устройства с OpenCL) поддерживаются.

В последнем релизе мы включили поддержку упрощенных устройств, которые не поддерживали double математику. Теперь поддержка полная, включая те карты, которые максимально поддерживали только float вычисления.
 
Renat Fatkhullin #:
Да, Nvidia карты (как и все другие устройства с OpenCL) поддерживаются.

В последнем релизе мы включили поддержку упрощенных устройств, которые не поддерживали double математику. Теперь поддержка полная, включая те карты, которые максимально поддерживали только float вычисления.

Спасибо!

Я пока только почитал статьи по OpenCL на сайте, но сложилось ощущение, что под разные карты надо адаптировать код, если это так, то как же с агентами это будет работать, если у разных компьютеров разные карты? Сколько карт будет поддерживаться, т.е. смогу я к агентам на одном компьютере привязать 2-3 карты, агент 1 - карта А, агент 2 - карта Б, агент 3 - карта В?

 
Не могу понять, как считается?

MathAverageDeviation

Рассчитывает среднее отклонение элементов массива

 
Andrey Dik #:

Оказалось, что работа класса Convas чувствительна к длине пути каталога, откуда будет запущена программа.

Так, при длине пути 104 символа всё ещё работает, и где то в промежутке до 128 символов перестаёт работать. Все варианты длины перебирать, что бы найти точное значение, не стал. Никаких ошибок при этом не удалось получить. Сведения об этой особенности конваса тоже не нашёл в документации. Причем остальной код программы (в примере не приведён) работает без нареканий.

Код для воспроизведения:

Как работает:

как не работает:


Андрей, обрати внимание как в CCanvas создаётся имя графического ресурса:

//+------------------------------------------------------------------+
//| Create dynamic resource                                          |
//+------------------------------------------------------------------+
bool CCanvas::Create(const string name,const int width,const int height,ENUM_COLOR_FORMAT clrfmt)
  {
   Destroy();
//--- prepare data array
   if(width>0 && height>0 && ArrayResize(m_pixels,width*height)>0)
     {
      //--- generate resource name
      m_rcname="::"+name+(string)ChartID()+(string)(GetTickCount()+MathRand());
      //--- initialize data with zeros
      ArrayInitialize(m_pixels,0);
      //--- create dynamic resource
      if(ResourceCreate(m_rcname,m_pixels,width,height,0,0,0,clrfmt))
        {
         //--- successfully created
         //--- complete initialization
         m_width =width;
         m_height=height;
         m_format=clrfmt;
         //--- succeed
         return(true);
        }
     }
//--- error - destroy object
   Destroy();
   return(false);
  }
//+------------------------------------------------------------------+

Отсюда и плясать нужно с именем своего объекта - оно должно быть коротким и уникальным.

 
Artyom Trishkin #:

 и уникальным.

Ну, как бы, нет.
 
Artyom Trishkin #:

Андрей, обрати внимание как в CCanvas создаётся имя графического ресурса:

Отсюда и плясать нужно с именем своего объекта - оно должно быть коротким и уникальным.

У меня так 

string canvasName = "TestConvasLongPath";

даже если бы было так

string canvasName = "T";

это не решает проблему длинного имени пути.

Проблема не в длинном названии объекта а в невозможности работать канваса в папках с длинным именем пути. Попробуй с моим примером, если не сильно лень, убедишься сам)

Речь именно о длине пути, где лежит программа, а не в имени объекта канваса. Ведь любой другой код MQL5 пашет и не кашляет.

Но, как бы то ни было, должна быть получена ошибка, если есть какие то проблемы в канвасе, а её нет.

 
Aleksey Vyazmikin #:

Спасибо!

Я пока только почитал статьи по OpenCL на сайте, но сложилось ощущение, что под разные карты надо адаптировать код, если это так, то как же с агентами это будет работать, если у разных компьютеров разные карты? Сколько карт будет поддерживаться, т.е. смогу я к агентам на одном компьютере привязать 2-3 карты, агент 1 - карта А, агент 2 - карта Б, агент 3 - карта В?

Прелесть открытой OpenCL спецификации в том, что код единый для всех устройств.

Это CUDA является жестко закрытой технологией только под NVIDIA карты. Поэтому мы отказались от нее.

Мы также расширим поддержку OpenCL 3.0, чтобы улучшить производительность (особенно shared memory) и упростить код.


В настройках OpenCL можно управлять всеми устройствами, сортируя их по рейтингу и отключая ненужные. Терминал и тестеры будут использовать более-менее равномерно все разрешенные устройтва.


 

Просмотр Журнала в отдельном окне:

2022.10.03 09:14:51.430    Trades    '00000': modify order ...
2022.10.03 09:14:51.433    Trades    '00000': accepted modify order ...
2022.10.03 09:14:51.434    Trades    '00000': modify order ...

Да вы издеваетесь!) Где секунды?

 
Renat Fatkhullin #:

Прелесть открытой OpenCL спецификации в том, что код единый для всех устройств.

Это CUDA является жестко закрытой технологией только под NVIDIA карты. Поэтому мы отказались от нее.

Мы также расширим поддержку OpenCL 3.0, чтобы улучшить производительность (особенно shared memory) и упростить код.


В настройках OpenCL можно управлять всеми устройствами, сортируя их по рейтингу и отключая ненужные. Терминал и тестеры будут использовать более-менее равномерно все разрешенные устройтва.


Про разную подгонку кода под железно я читал тут.

У меня таких настроек в терминале нет, карта стоит сейчас HD7950. Однако, если я правильно понял, то я смогу дать работать устройству вместе с агентом для удаленной оптимизации, правильно? Но я не понимаю, как привязываться агент будет к устройству, или предполагается, что все агенты будут использовать устройство по очереди, тогда не будет ли это наоборот тормозить процесс?

OpenCL: от наивного кодирования - к более осмысленному
OpenCL: от наивного кодирования - к более осмысленному
  • www.mql5.com
В данной статье продемонстрированы некоторые возможности оптимизации, открывающиеся при хотя бы поверхностном учете особенностей "железа", на котором исполняется кернел. Полученные цифры весьма далеки от предельных, но даже они показывают, что при том наборе возможностей, который имеется здесь и сейчас (OpenCL API в реализации разработчиков терминала не позволяет контролировать некоторые важные для оптимизации параметры - - в частности, размер локальной группы), выигрыш в производительности в сравнении с исполнением хостовой программы очень существенен.
Причина обращения: