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

 

  http://www.ixbt.com/video3/rad2.shtml. - Лучше всего использовать для больших массивов данных оптимизированные библиотеки, нежели заниматься "творчеством" по написанию программ на OpenCL (сам факт этого я неисключаю) . Можно использовать гибридную систему вычисленией малые обьёмы обрабатываются с помощью OpenCL,  а большые оптимизированными библиотеками. Да! Возможно понабиться конвертировать библиотеки на специфический язык программирования и создать условия для включения этой библиотеки. Если это удасться реализовать, то получиться впечатляющий результат и соотвесвенно многократное ускорение операции. Обратите свое внимание на это.....

P.S Возможно это новая ветка в форуме 

������������������ AMD Radeon � �������������� �����������. ������������� AMD Core Math Library
  • www.ixbt.com
������� ������� ����������� �� �������, ��������� ����������� � ���� � �� �� �����, �� ������ ��� �� ����� ������. � ������� ������������ ������� �� ����� ����������� �� ����� �������, � �������� GPU ����� ����� ������������� �������� ��������� ������� ��������� ���� � ����� ����� �� ����� �����. � ���� ����� ������ ���������� ��� PC ����� x86...
 
GKS: Возможно понабиться конвертировать библиотеки на специфический язык программирования и создать условия для включения этой библиотеки. Если это удасться реализовать, то получиться впечатляющий результат и соотвесвенно многократное ускорение операции.

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

Да и пока не вижу я трейдерских задач, требующих таких огромных размеров перемножаемых матриц.

 
MetaQuotes:

Анонс обновления MetaTrader 5

В течение ближайших дней будет опубликовано обновление платформы MetaTrader 5. После публикации обновления будет выпущена дополнительная новость, содержащая окончательный список изменений и номера билдов. Планируются следующие изменения:

MetaTrader 5 Client Terminal build 648

MetaTester: Добавлена поддержка использования OpenCL-программ в агентах тестирования.

Разобравшиеся в OpenCL, подготовьте задачу-тест под Cloud+OpenCL. Очень интересные мат. перспективы.
 
hrenfx: Разобравшиеся в OpenCL, подготовьте задачу-тест под Cloud+OpenCL. Очень интересные мат. перспективы.
Это больше к MetaDriver'у. Он у нас большой спец по OpenCL, да и вроде пытается эмулировать тестирование.
 
hrenfx:
Разобравшиеся в OpenCL, подготовьте задачу-тест под Cloud+OpenCL. Очень интересные мат. перспективы.
Mathemat:
Это больше к MetaDriver'у. .......................
Я подумаю.   Нужны идеи, в плане что именно нужно посчитать.
 

Недавно обновил драйвер на видео (  NVIDIA  301.42 ).

Ради интереса провел один из старых тестов (ParallelTester_00-01x) и глазам не поверил.

На 24 странице делал тест, так там был прирост 29, потом поставил память в 2х канальный режим режим, стало 39.

Теперь: ~306

2012.05.31 22:05:11     ParallelTester_00-01x (EURUSD,D1)       OpenCL init OK!
2012.05.31 22:05:11     ParallelTester_00-01x (EURUSD,D1)       GPU time = 141 ms
2012.05.31 22:05:11     ParallelTester_00-01x (EURUSD,D1)       Соunt inticators = 16; Count history bars = 144000; Count pass = 1280
2012.05.31 22:05:11     ParallelTester_00-01x (EURUSD,D1)       Result on Gpu МахResult==1.28051 at 1213 pass
2012.05.31 22:05:54     ParallelTester_00-01x (EURUSD,D1)       CPU time = 43259 ms
2012.05.31 22:05:54     ParallelTester_00-01x (EURUSD,D1)       Соunt inticators = 16; Count history bars = 144000; Count pass = 1280
2012.05.31 22:05:54     ParallelTester_00-01x (EURUSD,D1)       Result on Cpu МахResult==1.28051 at 1213 pass
2012.05.31 22:05:54     ParallelTester_00-01x (EURUSD,D1)       CpuTime/GpuTime = 306.8014184397163
2012.05.31 21:41:04     OpenCL  GPU: NVIDIA Corporation GeForce GT 440 with OpenCL 1.1 (2 units, 1660 MHz, 1023 Mb, version 301.42)
2012.05.31 21:41:04     OpenCL  CPU: AuthenticAMD AMD Athlon(tm) II X4 630 Processor with OpenCL 1.1 (4 units, 2948 MHz, 2048 Mb, version 2.0)
Чудеса. Видать НВИДИА подстрагала драйвера по человечески.
 

fyords, а как Вы сделали так, что более ранние события выводятся в журнал выше?

А вообще это здорово, я Вас понимаю. Я так же радовался, купив по дешевке свою HD 4870 и увидев ее мощь.

Одна маленькая рекомендация: выбирайте параметры так, чтобы врeмя исполнения на GPU было сравнимо с 1 секундой. Тогда и отношение времен будет более точным. Средняя погрешность функции GteTickCount() - не меньше десятков миллисекунд. Так что время на GPU у Вас вполне могло бы получиться и 120 мс, и 170. А от этого сильно зависит величина ускорения.

Я тут слегка этот скрипт подрихтовал, чтобы он пробегал по всем доступным девайсам (смотрим снизу вверх: 1) CPU на платформе от Intel, потом 2) видяха HD 4870 на платформе от AMD, и 3) CPU на платформе AMD):

2012.05.31 15:48:35     OpenCL  CPU: GenuineIntel  Intel(R) Pentium(R) CPU G840 @ 2.80GHz with OpenCL 1.2 (2 units, 2793 MHz, 8040 Mb, version 2.0 (sse2))
2012.05.31 15:48:35     OpenCL  GPU: Advanced Micro Devices, Inc. ATI RV770 with OpenCL 1.0 (10 units, 780 MHz, 512 Mb, version CAL 1.4.1720)
2012.05.31 15:48:35     OpenCL  CPU: Intel(R) Corporation  Intel(R) Pentium(R) CPU G840 @ 2.80GHz with OpenCL 1.1 (2 units, 2800 MHz, 8040 Mb, version 1.1)

Результаты скрипта - снизу вверх!

2012.06.01 01:06:12     ParallelTester_00-01x_new_cycle (EURUSD,H1)     ------------
2012.06.01 01:06:12     ParallelTester_00-01x_new_cycle (EURUSD,H1)     Result on Gpu МахResult==0.87527 at 10902 pass
2012.06.01 01:06:12     ParallelTester_00-01x_new_cycle (EURUSD,H1)     CpuTime/GpuTime = 24.76943755169562
2012.06.01 01:06:12     ParallelTester_00-01x_new_cycle (EURUSD,H1)     GPU time = 9672 ms
2012.06.01 01:06:02     ParallelTester_00-01x_new_cycle (EURUSD,H1)     Device number = 2
2012.06.01 01:06:02     ParallelTester_00-01x_new_cycle (EURUSD,H1)     ------------
2012.06.01 01:06:02     ParallelTester_00-01x_new_cycle (EURUSD,H1)     Result on Gpu МахResult==0.87527 at 10902 pass
2012.06.01 01:06:02     ParallelTester_00-01x_new_cycle (EURUSD,H1)     CpuTime/GpuTime = 204.7606837606838
2012.06.01 01:06:02     ParallelTester_00-01x_new_cycle (EURUSD,H1)     GPU time = 1170 ms
2012.06.01 01:06:01     ParallelTester_00-01x_new_cycle (EURUSD,H1)     Device number = 1
2012.06.01 01:06:01     ParallelTester_00-01x_new_cycle (EURUSD,H1)     ------------
2012.06.01 01:06:01     ParallelTester_00-01x_new_cycle (EURUSD,H1)     Result on Gpu МахResult==0.87527 at 10902 pass
2012.06.01 01:06:01     ParallelTester_00-01x_new_cycle (EURUSD,H1)     CpuTime/GpuTime = 77.55584331498866
2012.06.01 01:06:01     ParallelTester_00-01x_new_cycle (EURUSD,H1)     GPU time = 3089 ms
2012.06.01 01:05:57     ParallelTester_00-01x_new_cycle (EURUSD,H1)     Device number = 0
2012.06.01 01:05:57     ParallelTester_00-01x_new_cycle (EURUSD,H1)     -------------------------
2012.06.01 01:05:57     ParallelTester_00-01x_new_cycle (EURUSD,H1)     Result on Cpu МахResult==0.87527 at 10902 pass
2012.06.01 01:05:57     ParallelTester_00-01x_new_cycle (EURUSD,H1)     Соunt indicators = 16; Count history bars = 144000; Count pass = 12800
2012.06.01 01:05:57     ParallelTester_00-01x_new_cycle (EURUSD,H1)     CPU time = 239570 ms
2012.06.01 01:01:58     ParallelTester_00-01x_new_cycle (EURUSD,H1)     ========================================
При последнем параметре, который в 10 раз меньше, моя карта не такая шустрая, как у Вас. Наверно, не успевает разогнаться толком :)
 
Для информации: у GetTickCount погрешность сильно меньше 16 мс, не Windows 95 же используете.
 
Mathemat:

fyords, а как Вы сделали так, что более ранние события выводятся в журнал выше?

В отчетах правой кнопкой "Просмотр", в новом окне кнопка "Запрос" и лог строится по времени правильно, да и читать (мне) удобнее.

А по поводу скрипта, спасибо, попробую завтра, очень долго ждать завершения, особенно с Count pass = 12800.

Пока вот старый скрипт с  Count pass = 12800

2012.06.01 01:05:53     ParallelTester_00-01x (EURUSD,D1)       OpenCL init OK!
2012.06.01 01:05:54     ParallelTester_00-01x (EURUSD,D1)       GPU time = 999 ms
2012.06.01 01:05:54     ParallelTester_00-01x (EURUSD,D1)       Соunt inticators = 16; Count history bars = 144000; Count pass = 12800
2012.06.01 01:05:54     ParallelTester_00-01x (EURUSD,D1)       Result on Gpu МахResult==1.49697 at 10010 pass
2012.06.01 01:13:08     ParallelTester_00-01x (EURUSD,D1)       CPU time = 434167 ms
2012.06.01 01:13:08     ParallelTester_00-01x (EURUSD,D1)       Соunt inticators = 16; Count history bars = 144000; Count pass = 12800
2012.06.01 01:13:08     ParallelTester_00-01x (EURUSD,D1)       Result on Cpu МахResult==1.49697 at 10010 pass
2012.06.01 01:13:08     ParallelTester_00-01x (EURUSD,D1)       CpuTime/GpuTime = 434.6016016016016
Прирост стал еще больше.
 
Renat: Для информации: у GetTickCount погрешность сильно меньше 16 мс, не Windows 95 же используете.

Ошибка на самом деле не сильно меньше. Да, близка к ней, но бывают выбросы от среднего, групирующиеся около 32, 48 и даже больше. Они редки, не спорю, их можно не принимать во внимание.

Но когда человек запускает скрипт, он совсем не обязательно ничего не делает на компьютере. Да и система тоже свои задачки может выполнять, которые могут замедлять исполнение.

Формально стандартное отклонение действительно мало - в районе 6-7 и слабо зависит от самого времени исполнения. Но оно плохо отражает истинный разброс. Вот гистограмма времен, фиксируемых при выполнении одинаковых вычислений:

Расстояние между соседними столбиками - 16 мс. Маленькие столбики вполне вероятны, а они отличаются друг от друга уже на 32 мс. Если средний столбик ("истинное время исполнения") - 140 миллисекунд, то левый - 124 мс, а правый - 156 мс.

Значит, реальный разброс при делении на малое время исполнения на GPU может быть немаленьким:

20 секунд/124 мс ~ 161

20 секунд/156 мс ~ 128.

При этом "истинное отношение" времен исполнения примерно соответствует самому большому столбику:

20 секунд/140 мс ~ 143.

Если же брать время исполнения на GPU побольше, то влияние этой ошибки будет намного меньше. Ну пусть хотя бы будет 500 мс. 

Скрипт для моделирования:

#define BIG       10000000
#define SMALL     1000

void OnStart( )
{
   Print( "Script started..." );
   double k;
   int times[ SMALL ];
   MathSrand( TimeCurrent( ) );
   for( int ii = 0; ii < SMALL; ii ++ )
   {
      Comment( ii );
      int st = GetTickCount( );
      for( int i = 0; i < BIG; i ++ )   k = sin( i );
      int timeTotal = GetTickCount( ) - st;
      times[ ii ] = timeTotal;
   }

   int h = FileOpen( "gtc_times.txt", FILE_WRITE, "\r\n"  );
   for( int ii = 0; ii < SMALL; ii ++ )
      FileWrite( h, times[ ii ] );   
   FileClose( h ); 
   Print("Script unloaded");
}
//+------------------------------------------------------------------+