OpenCL: testes internos de implementação em MQL5 - página 50

 
Mathemat:
É disto que se trata o truque. O argumento dentro de CLContextCreate() não pode seleccionar explicitamente a CPU se houver pelo menos uma GPU externa.

Não deveria ser assim - https://www.mql5.com/ru/docs/opencl/clcontextcreate

Parâmetros

dispositivo

[em] Número de dispositivos OpenCL no sistema, em ordem. Um dos valores pode ser especificado em vez de um número específico: CL_USE_ANY - qualquer dispositivo OpenCL disponível pode ser utilizado; CL_USE_GPU_ONLY- a emulação OpenCL está desactivada e só podem ser utilizados dispositivos OpenCL dedicados (placas de vídeo).

Документация по MQL5: Работа с OpenCL / CLContextCreate
Документация по MQL5: Работа с OpenCL / CLContextCreate
  • www.mql5.com
Работа с OpenCL / CLContextCreate - Документация по MQL5
 

Penso que não deve ser assim. Mas onde obter este número e depois escolher o número certo?

https://www.mql5.com/ru/docs/opencl/clgetinfointeger? Mas existe apenas uma propriedade - número de dispositivos, CL_DEVICE_COUNT.

Tenho um no meu sistema, é por isso que ele devolve 1.

Документация по MQL5: Работа с OpenCL / CLGetInfoInteger
Документация по MQL5: Работа с OpenCL / CLGetInfoInteger
  • www.mql5.com
Работа с OpenCL / CLGetInfoInteger - Документация по MQL5
 
Lembre-se de actualizar para os últimos 619 programas de construção e recompilação. O princípio da inicialização do OpenCL mudou nesta construção.
 
Mathemat:

Penso que não deve ser assim. Mas onde se consegue este número e depois escolher o número certo?



Deve tentar especificar CL_USE_GPU_ONLY, depois a placa de vídeo será tirada e o número não é necessário.
 
Rosh: Deve tentar especificar CL_USE_GPU_ONLY, depois a placa de vídeo é tirada e o número não é necessário.
Isto é compreensível. Mas eu quero especificar CPU - com uma placa gráfica discreta. Como é que faço isso?
 

Fantástico! Então o HD4200 não é um dispositivo OpenCL, pois não?

Parece que há aqui realmente uma pura emulação de CPU. Eu gosto!

E se eu pudesse ensinar a i3 a fazê-lo...

Começo a suspeitar vagamente porque é que o AMD APP SDK não funciona correctamente no MT5 em i3: nem todos os núcleos são reais, e a AMD não tem tecnologia de hiper-comercialização. Provavelmente, é por isso que o condutor insere de uma forma engraçada.

Ou talvez o truque esteja no MT5 que reconhece formalmente o dispositivo mas que na realidade não tem qualquer utilidade?

 
Mathemat:
Aqui está o truque. O argumento dentro de CLContextCreate() não pode seleccionar explicitamente uma CPU se houver pelo menos uma GPU externa.

Isto está no CPU (no meu caso é o dispositivo 1):

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

Puxou o parâmetro CLContextCreate(dispositivo) para o parâmetro script. Pode espreitar em torno de todas as opções.

// Talvez ainda haja uma combinação secreta fedorenta? :))

Arquivos anexados:
 

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!


Obrigado, eu não sabia que...

Bem, eu tinha a certeza que a proporção seria cerca de 3 para 1: tem 3 vezes mais núcleos, 74,735/26,952 ~ 2,77. E isso é uma boa notícia: mais núcleos significa mais ganho! A AMD também se safou aqui - devido ao número de núcleos!

Mas o que será que outros terão - digamos, alguém com uma ponte arenosa i5?

E se alguém tiver um Bulldozer e, pode ser muito fixe... embora possa não o ser, porque é um pouco um problema de FPU.

 
MetaDriver:

E neste teste, por alguma razão, o meu ferro rasgou o teu.

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!


E aqui está este teste no CPU OpenCL (todos os 4 núcleos estão 100% carregados)

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!


A GPU tem 480 moscas e a CPU tem 4, a diferença é 120 vezes, ou seja, 120 vezes mais cálculos podem ser feitos de uma só vez, mas a CPU ficou atrás da GPU apenas 68547/1295=52,9 vezes. Isto significa que o fio da CPU é mais rápido do que o fio da GPU, mas a GPU só ganha porque pode executar mais tarefas simultâneas. Será que percebo bem?


A escala no CPU é muito inferior a 100% (cerca de 76%), em vez de 4x apenas 3x de aceleração 208496/68547=3.04

Embora, as especificidades deste teste possam estar a afectá-lo.

 

Andrei, acho que tem algo errado: o MD só afixou este teste aqui no CPU, sem a placa gráfica, ou seja, seleccionando directamente a emulação do CPU. Segundo sei, o seu primeiro teste está na placa gráfica.

E o resultado da sua placa gráfica emuladora OpenCL (o seu segundo teste) parece ser suspeitamente baixo mesmo em comparação com o meu (tive cerca de 10 segundos em "GPU").

Se entendi algo mal, corrijam-me.