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

 
Mathemat:
Вот в чем и фишка. Аргументом внутри CLContextCreate() невозможно явно выбрать CPU, если есть хоть какой-то внешний GPU.

Не должно быть так - https://www.mql5.com/ru/docs/opencl/clcontextcreate

Параметры

device

[in]  Номер OpenCL-устройства в системе по порядку. Вместо конкретного номера можно указать одно из значений: CL_USE_ANY – разрешается использовать любое доступное устройство с поддержкой OpenCL; CL_USE_GPU_ONLY – эмуляция OpenCL запрещена и разрешается использовать только специализированные устройства с поддержкой OpenCL (видеокарты).

Документация по MQL5: Работа с OpenCL / CLContextCreate
Документация по MQL5: Работа с OpenCL / CLContextCreate
  • www.mql5.com
Работа с OpenCL / CLContextCreate - Документация по MQL5
 
Rosh: Не должно быть так - https://www.mql5.com/ru/docs/opencl/clcontextcreate

Вроде да, не должно быть. Вот только где этот номер взять, а потом выбрать нужное?

https://www.mql5.com/ru/docs/opencl/clgetinfointeger? Но там есть только одно-единственное свойство - количество дивайсов, CL_DEVICE_COUNT.

У меня-то оно одно в системе, потому 1 и возвращает.

Документация по MQL5: Работа с OpenCL / CLGetInfoInteger
Документация по MQL5: Работа с OpenCL / CLGetInfoInteger
  • www.mql5.com
Работа с OpenCL / CLGetInfoInteger - Документация по MQL5
 
Не забудьте обновиться до последнего 619 билда и перекомпилять программы. В этом билде изменился принцип инициализации OpenCL.
 
Mathemat:

Вроде да, не должно быть. Вот только где этот номер взять, а потом выбрать нужное?



Нужно попробовать указать CL_USE_GPU_ONLY, тогда возьмется видеокарта и номер не нужен.
 
Rosh: Нужно попробовать указать CL_USE_GPU_ONLY, тогда возьмется видеокарта и номер не нужен.
Это понятно. А вот хочется мне указать именно CPU - при имеющейся дискретной видяхе. И как я это сделаю?
 

Шикарно! Значит, HD4200 дивайсом OpenCL не является, что ли?

Похоже, действительно тут идет чистая эмуляция на CPU. Мне нравится!

Вот научить бы этому же i3...

Начинаю смутно подозревать, почему AMD APP SDK не работает толком в МТ5 на i3: там же не все ядра настоящие, а у AMD нет технологии гипертрединга. Наверно, и драйвер потому встает как-то криво.

Или все же примочка - в самом МТ5, который формально распознает дивайс, но фактически от него никакого толку?

 
Mathemat:
Вот в чем и фишка. Аргументом внутри CLContextCreate() невозможно явно выбрать CPU, если есть хоть какой-то внешний GPU.

Это на ЦПУ  (у меня это девайс №1):

2012.04.08 21:03:01     ParallelTester_00-02-(16x7x3) (USDJPY,M30)      CpuTime/GpuTime = 74.73506433823529
2012.04.08 21:03:01     ParallelTester_00-02-(16x7x3) (USDJPY,M30)      Result on Cpu МахResult==4.54091 at 2233 pass
2012.04.08 21:03:01     ParallelTester_00-02-(16x7x3) (USDJPY,M30)      Соunt inticators = 16; Count history bars = 50000; Count pass = 4096
2012.04.08 21:03:01     ParallelTester_00-02-(16x7x3) (USDJPY,M30)      CPU time = 325247 ms
2012.04.08 20:57:36     ParallelTester_00-02-(16x7x3) (USDJPY,M30)      Result on Gpu МахResult==4.54091 at 2233 pass
2012.04.08 20:57:36     ParallelTester_00-02-(16x7x3) (USDJPY,M30)      Соunt inticators = 16; Count history bars = 50000; Count pass = 4096
2012.04.08 20:57:36     ParallelTester_00-02-(16x7x3) (USDJPY,M30)      GPU time = 4352 ms
2012.04.08 20:57:32     ParallelTester_00-02-(16x7x3) (USDJPY,M30)      OpenCL init OK!

Вытащил параметр CLContextCreate(device) в параметр скрипта.  Можно потыкать все варианты. 

// Вдруг есть ещё секретная улётная комбинация ?? :))

Файлы:
 

2012.04.08 22:01:08    Terminal    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.04.08 22:05:59    ParallelTester_00-02-316x7x3j_080412 (EURUSD,H1)    CpuTime/GpuTime = 26.95192501511792
2012.04.08 22:05:59    ParallelTester_00-02-316x7x3j_080412 (EURUSD,H1)    Result on Cpu МахResult==4.98137 at 1628 pass
2012.04.08 22:05:59    ParallelTester_00-02-316x7x3j_080412 (EURUSD,H1)    Соunt inticators = 16; Count history bars = 50000; Count pass = 4096
2012.04.08 22:05:59    ParallelTester_00-02-316x7x3j_080412 (EURUSD,H1)    CPU time = 267417 ms
2012.04.08 22:01:32    ParallelTester_00-02-316x7x3j_080412 (EURUSD,H1)    Result on Gpu МахResult==4.98137 at 1628 pass
2012.04.08 22:01:32    ParallelTester_00-02-316x7x3j_080412 (EURUSD,H1)    Соunt inticators = 16; Count history bars = 50000; Count pass = 4096
2012.04.08 22:01:32    ParallelTester_00-02-316x7x3j_080412 (EURUSD,H1)    GPU time = 9922 ms
2012.04.08 22:01:22    ParallelTester_00-02-316x7x3j_080412 (EURUSD,H1)    OpenCL init OK!


Спасибо, а я-то не догадался...

Ну вообще-то почти не сомневался, что соотношение пропорций будет в районе 3 к 1: у тебя ж ядер в 3 раза больше, 74.735/26.952 ~ 2.77. И это все-таки радует: больше ядер - больше выигрыш! AMD и тут вырулила - за счет количества ядер!

А вот интересно, что будет у других - скажем, у кого i5 Sandy Bridge? 

А если у кого Бульдозер е, там ваще улет может получиться... хотя может и не получиться, т.к. с FPU у него напряг.

 
MetaDriver:

А в этом тесте, почему то, моё железо порвало твоё.

2012.04.09 01:09:36        ParallelTester_00-02-316x7x3j (EURUSD,H1)          CpuTime/GpuTime = 161.0007722007722

2012.04.09 01:09:36    ParallelTester_00-02-316x7x3j (EURUSD,H1)    Result on Cpu МахResult==4.85831 at 2497 pass
2012.04.09 01:09:36    ParallelTester_00-02-316x7x3j (EURUSD,H1)    Соunt inticators = 16; Count history bars = 50000; Count pass = 4096
2012.04.09 01:09:36    ParallelTester_00-02-316x7x3j (EURUSD,H1)    CPU time = 208496 ms
2012.04.09 01:06:08    ParallelTester_00-02-316x7x3j (EURUSD,H1)    Result on Gpu МахResult==4.85831 at 2497 pass
2012.04.09 01:06:08    ParallelTester_00-02-316x7x3j (EURUSD,H1)    Соunt inticators = 16; Count history bars = 50000; Count pass = 4096
2012.04.09 01:06:08    ParallelTester_00-02-316x7x3j (EURUSD,H1)    GPU time = 1295 ms

2012.04.09 01:06:07        ParallelTester_00-02-316x7x3j (EURUSD,H1)           OpenCL init OK!


А здесь этот тест на OpenCL CPU (загружены на 100% все 4 ядрища)

2012.04.09 01:11:15    ParallelTester_00-02-316x7x3j (EURUSD,H1)    GPU time = 68547 ms

2012.04.09 01:10:07    ParallelTester_00-02-316x7x3j (EURUSD,H1)    OpenCL init OK!


У GPU 480 мух, а у CPU 4, разница в 120 раз, то есть за раз может быть выполнено в 120 раз больше вычислений, однако CPU отстал от GPU только в 68547/1295=52,9 раза. Это означает, что CPU нитка быстрее GPU-шной, Но GPU выигрывает только потому, что может больше выполнять одновременных задач. Я правильно понимаю?


Масштабирование на CPU много меньше чем 100% (около 76%),  вместо 4-кратного всего лишь 3-х кратное ускорение 208496/68547=3,04

Хотя, возможно, сказывается специфика этого теста.

 

Андрей, мне кажется, ты кое-что напутал: MD выкладывал тут этот тест только на CPU, без видяхи, т.е. напрямую выбрав CPU-эмуляцию. Как я понял, твой первый тест - на видяхе.

А результат твоего камня, эмулирующего OpenCL (твой второй тест), кажется подозрительно слабым даже в сравнении с моим (у меня было около 10 секунд на "GPU").

Если я чего-то недопонял, поправь.