OpenCL: testes internos de implementação em MQL5 - página 50
Você está perdendo oportunidades de negociação:
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Registro
Login
Você concorda com a política do site e com os termos de uso
Se você não tem uma conta, por favor registre-se
É 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).
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.
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.
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?
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):
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? :))
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.
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 pass2012.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.