Многопоточность в MQL5

 
Мне понабилась многопоточность и я решил снова попробовать OpenCL на CPU Intel.

CLBufferWrite() / CLBufferRead() ооооооооочень мммммммедленные!!! Только на них уходит 20 мин теста. Форумы советуют CL_MEM_USE_HOST_PTR для прямого доступа, но в MQL5 его нет.

Один только CLExecute() (многопоточный) выполняется 17 мин теста. Однопоточный код на MQL5 за 16 мин теста.

Не годится OpenCL на моем Intel Core i7-9700K !!! И в 2021 году можно хотябы OpenCL 1.2 в MQL5 добавить (уже 3.0 вышла официально).

И я теперь точно представляю, как должна выглядеть многопоточность в MQL5.

=============================

Многопоточность в MQL5

В настройках терминала установка количества ядер CPU (Все по умолчанию).

В Облаке только 1 ядро.

При Отладке использует 1 поток, просто функция вызывается последовательно Н раз.

// Системные функции:
bool ThreadRun(int count_max, void *funcname, args...);
bool ThreadRun(int count_max, arr &returns[], void *funcname, args...);
true - все потоки выполнились без ошибок
false - GetLastError()

ini ThreadNumber();

thread // указание для компилятора на ограничения
int myThread(double &x, double &y, double w)
{
   const int index = ThreadNumber();
   y[index] = x[index] * w;
   return (int)(y[index] * 100.0);
   /*
   Запрещено вызывать функции, которые что-то изменяют.
   ArrayResize();
   Order*();
   Изначально разрешить только "справочные" функции, которые не требуют ответа от сервера.
   */
}

void OnTick(void)
{
   double x[7000], y[7000];
   ArrayInitialize(x, 48.85);
   ArrayInitialize(y, 36.6);
   int result[7000];
   if (ThreadRun(7000, result, myThread, x, y, 99.22)) {
      Print(y[7]);
   } else {
      Print(GetLastError());
   }
}

@Renat Fatkhullin

@Slava

 
Roffild:
Мне понабилась многопоточность и я решил снова попробовать OpenCL на CPU Intel.

Есть вариант использовать доступный в данный момент механизм многопоточности на уровне CPU (без OpenCL): под каждый эксперт выделяется свой поток, поэтому эксперт == thread - подробности в английской кодобазе.

Pseudo-Indicator with Asynchronous Multi-Threaded Calculations Demo
Pseudo-Indicator with Asynchronous Multi-Threaded Calculations Demo
  • www.mql5.com
This is an indicator w/o buffers which demonstrates parallel multi-threaded calculations in chart objects hosting worker expert adviser.
 
Stanislav Korotky:

Есть вариант использовать доступный в данный момент механизм многопоточности на уровне CPU (без OpenCL): под каждый эксперт выделяется свой поток, поэтому эксперт == thread - подробности в английской кодобазе.

Терминал использует только 1 ядро для всех экспертов. 

 
Roffild:

Терминал использует только 1 ядро для всех экспертов. 

звучит как бред.

для начала многопоточность для работы или для бэктеста?
 
Roffild:
Мне понабилась многопоточность и я решил снова попробовать OpenCL на CPU Intel.

CLBufferWrite() / CLBufferRead() ооооооооочень мммммммедленные!!! Только на них уходит 20 мин теста. Форумы советуют CL_MEM_USE_HOST_PTR для прямого доступа, но в MQL5 его нет.

Один только CLExecute() (многопоточный) выполняется 17 мин теста. Однопоточный код на MQL5 за 16 мин теста.

Не годится OpenCL на моем Intel Core i7-9700K !!! И в 2021 году можно хотябы OpenCL 1.2 в MQL5 добавить (уже 3.0 вышла официально).

И я теперь точно представляю, как должна выглядеть многопоточность в MQL5.

=============================

Многопоточность в MQL5

В настройках терминала установка количества ядер CPU (Все по умолчанию).

В Облаке только 1 ядро.

При Отладке использует 1 поток, просто функция вызывается последовательно Н раз.

@Renat Fatkhullin

@Slava

Отличный частный пример и его решение, но к сожалению не масштабируемый.

Обязательно будут:

  1. доступ к глобальным переменным (как на чтение, так и на запись)
  2. коллизии на изменении параметров переданных по ссылке (объекты/массивы)
  3. работа с динамической памятью
  4. вызовы API терминала сменяющих состояние
  5. и т.п.

 
CL_MEM_ALLOC_HOST_PTR не оно?
 
Ilyas:

Отличный частный пример и его решение, но к сожалению не масштабируемый.

Обязательно будут:

  1. доступ к глобальным переменным (как на чтение, так и на запись)
  2. коллизии на изменении параметров переданных по ссылке (объекты/массивы)
  3. работа с динамической памятью
  4. вызовы API терминала сменяющих состояние
  5. и т.п.

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

1-5 я попросил запретить на начальном этом.

Из-за задержек использовать OpenCL не возможно.

 
Rorschach:
CL_MEM_ALLOC_HOST_PTR не оно?

В MQL5 нет функций для этого.

 
Roffild:

В MQL5 нет функций для этого.

CLBufferCreate?
 
Мы добавим ThreadXXX функции для запуска отдельных вычислений в отдельной копии программы.

Вы сможете включать ex5 расчетные кернелы как ресурсы в основного эксперта, чтобы запускать их в отдельном потоке.
 
Renat Fatkhullin:
Мы добавим ThreadXXX функции для запуска отдельных вычислений в отдельной копии программы.

Рассмотрите пожалуйста ещё возможность, добавить функции синхронизации между этими ThreadXXX.
Или это избыточно будет для данной реализации?

Причина обращения: