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

 
tol64:

Talvez Renat consiga ver o que se pode aprender com isto. É bem possível que uma nova especificação dê um melhor desempenho também na MQL5, não é?

Quanto a C#/C+++, se necessário, também podemos despejá-lo. O principal é obter o máximo rendimento possível. ;)

Por enquanto, estou a impedir-me de reescrever o optimizador CL para Sharp na esperança de que o novo MT4 venha a fornecer pelo menos a versão 1.1. A linguagem é a mesma, o compilador é o mesmo e não existem obstáculos principais (não preciso realmente do suporte OpenCL num testador MT4, embora continue a fazê-lo se aparecer). Se não for implementado - pensarei à esquerda.
 

Testámos alguns dos guiões neste tópico numa máquina deste tipo:

CPU-Z


CUDA-Z



Para cada guião fornecerei um link para o post onde foi publicado para que outros o possam encontrar rapidamente, fazer os testes e comparar resultados, se necessário.

Teste 1


Teste 2

2013.11.29 14:29:13     ParallelOptimazer_00-02 (EURUSD,H1)     Generation 013 (1280 passes, 140 ms) : MaxResult==116.05191; Average Result==106.7991
2013.11.29 14:29:13     ParallelOptimazer_00-02 (EURUSD,H1)     Generation 014 (1280 passes, 125 ms) : MaxResult==116.05191; Average Result==106.77599
2013.11.29 14:29:13     ParallelOptimazer_00-02 (EURUSD,H1)     Generation 015 (1280 passes, 125 ms) : MaxResult==116.05191; Average Result==106.37561
2013.11.29 14:29:13     ParallelOptimazer_00-02 (EURUSD,H1)     Generation 016 (1280 passes, 140 ms) : MaxResult==116.05191; Average Result==106.64193
2013.11.29 14:29:13     ParallelOptimazer_00-02 (EURUSD,H1)     Optimization finished. Best result == 116.05191 at 16 generation.
2013.11.29 14:29:13     ParallelOptimazer_00-02 (EURUSD,H1)     Total time of optimization == 2 sec 122 ms

Teste 3

escala = 1000

CPU

GPU


Teste 4

2013.11.29 16:02:31     Tast_Mand_ (EURUSD,H1)  1872 msec

Teste 5

2013.11.29 16:39:50     ParallelTester_00-01 x (EURUSD,H1)       CLGetInfoInteger() returned 2
2013.11.29 16:39:51     ParallelTester_00-01 x (EURUSD,H1)       OpenCL init OK!
2013.11.29 16:39:51     ParallelTester_00-01 x (EURUSD,H1)       GPU time = 62 ms
2013.11.29 16:39:51     ParallelTester_00-01 x (EURUSD,H1)       Соunt indicators = 16; Count history bars = 144000; Count pass = 1280
2013.11.29 16:39:51     ParallelTester_00-01 x (EURUSD,H1)       Result on Gpu МахResult==1.34787 at 699 pass
2013.11.29 16:40:05     ParallelTester_00-01 x (EURUSD,H1)       CPU time = 14492 ms
2013.11.29 16:40:05     ParallelTester_00-01 x (EURUSD,H1)       Соunt indicators = 16; Count history bars = 144000; Count pass = 1280
2013.11.29 16:40:05     ParallelTester_00-01 x (EURUSD,H1)       Result on Cpu МахResult==1.34787 at 699 pass
2013.11.29 16:40:05     ParallelTester_00-01 x (EURUSD,H1)       CpuTime/GpuTime = 233.741935483871

Teste 6

2013.11.29 16:45:28     ParallelTester_00-01 x_cycle (EURUSD,H1) OpenCL init OK! Device number = 0
2013.11.29 16:45:28     ParallelTester_00-01 x_cycle (EURUSD,H1) GPU time = 577 ms
2013.11.29 16:45:28     ParallelTester_00-01 x_cycle (EURUSD,H1) Соunt indicators = 16; Count history bars = 144000; Count pass = 12800
2013.11.29 16:45:28     ParallelTester_00-01 x_cycle (EURUSD,H1) Result on Gpu МахResult==1.57161 at 7031 pass
2013.11.29 16:45:28     ParallelTester_00-01 x_cycle (EURUSD,H1) OpenCL init OK! Device number = 1
2013.11.29 16:45:29     ParallelTester_00-01 x_cycle (EURUSD,H1) GPU time = 546 ms
2013.11.29 16:45:29     ParallelTester_00-01 x_cycle (EURUSD,H1) Соunt indicators = 16; Count history bars = 144000; Count pass = 12800
2013.11.29 16:45:29     ParallelTester_00-01 x_cycle (EURUSD,H1) Result on Gpu МахResult==1.57161 at 7031 pass
2013.11.29 16:47:54     ParallelTester_00-01 x_cycle (EURUSD,H1) CPU time = 145144 ms
2013.11.29 16:47:54     ParallelTester_00-01 x_cycle (EURUSD,H1) Соunt indicators = 16; Count history bars = 144000; Count pass = 12800
2013.11.29 16:47:54     ParallelTester_00-01 x_cycle (EURUSD,H1) Result on Cpu МахResult==1.57161 at 7031 pass
2013.11.29 16:47:54     ParallelTester_00-01 x_cycle (EURUSD,H1) CpuTime/GpuTime = 265.8315018315018

Teste7

2013.11.29 16:54:52     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     ========================================
2013.11.29 16:57:16     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     CPU time = 144691 ms
2013.11.29 16:57:16     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     Соunt indicators = 16; Count history bars = 144000; Count pass = 12800
2013.11.29 16:57:16     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     Result on Cpu МахResult==0.91969 at 4641 pass
2013.11.29 16:57:16     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     -------------------------
2013.11.29 16:57:16     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     Device number = 0
2013.11.29 16:57:17     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     GPU time = 593 ms
2013.11.29 16:57:17     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     CpuTime/GpuTime = 243.9983136593592
2013.11.29 16:57:17     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     Result on Gpu МахResult==0.91969 at 4641 pass
2013.11.29 16:57:17     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     ------------
2013.11.29 16:57:17     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     Device number = 1
2013.11.29 16:57:18     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     GPU time = 546 ms
2013.11.29 16:57:18     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     CpuTime/GpuTime = 265.0018315018315
2013.11.29 16:57:18     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     Result on Gpu МахResult==0.91969 at 4641 pass
2013.11.29 16:57:18     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     ------------

Teste 8

2013.11.29 17:08:08     vect_v2_all_devices (EURUSD,H1) =======================================
2013.11.29 17:08:08     vect_v2_all_devices (EURUSD,H1) OCL martices mul:         ROWS1 = 2000; COLSROWS = 2000; COLS2 = 2000
2013.11.29 17:09:12     vect_v2_all_devices (EURUSD,H1) CPUTime = 64.085
2013.11.29 17:09:12     vect_v2_all_devices (EURUSD,H1) ---------------
2013.11.29 17:09:12     vect_v2_all_devices (EURUSD,H1) read = 4000000 elements
2013.11.29 17:09:12     vect_v2_all_devices (EURUSD,H1) Device = 0: time = 0.251 sec.
2013.11.29 17:09:12     vect_v2_all_devices (EURUSD,H1) CPUTime / GPUTotalTime = 255.319
2013.11.29 17:09:12     vect_v2_all_devices (EURUSD,H1) sum( 1362,1715 ) = -5.34762192;    thirdCPU[ 1362,1715 ] = -5.34762192;    buf[ 1362,1715 ] = -5.34761715
2013.11.29 17:09:12     vect_v2_all_devices (EURUSD,H1) sum( 365,218 ) = 1.04545093;    thirdCPU[ 365,218 ] = 1.04545093;    buf[ 365,218 ] = 1.04544997
2013.11.29 17:09:12     vect_v2_all_devices (EURUSD,H1) sum( 1461,1678 ) = -0.26404253;    thirdCPU[ 1461,1678 ] = -0.26404253;    buf[ 1461,1678 ] = -0.26404306
2013.11.29 17:09:12     vect_v2_all_devices (EURUSD,H1) sum( 1116,1765 ) = 0.61209172;    thirdCPU[ 1116,1765 ] = 0.61209172;    buf[ 1116,1765 ] = 0.61209279
2013.11.29 17:09:12     vect_v2_all_devices (EURUSD,H1) sum( 256,499 ) = 2.50011539;    thirdCPU[ 256,499 ] = 2.50011539;    buf[ 256,499 ] = 2.50011611
2013.11.29 17:09:12     vect_v2_all_devices (EURUSD,H1) sum( 528,1433 ) = 2.69000340;    thirdCPU[ 528,1433 ] = 2.69000340;    buf[ 528,1433 ] = 2.69000053
2013.11.29 17:09:12     vect_v2_all_devices (EURUSD,H1) sum( 926,1280 ) = 4.74232054;    thirdCPU[ 926,1280 ] = 4.74232054;    buf[ 926,1280 ] = 4.74231577
2013.11.29 17:09:12     vect_v2_all_devices (EURUSD,H1) sum( 361,1757 ) = 2.25322127;    thirdCPU[ 361,1757 ] = 2.25322127;    buf[ 361,1757 ] = 2.25322032
2013.11.29 17:09:12     vect_v2_all_devices (EURUSD,H1) sum( 1441,400 ) = -1.65504980;    thirdCPU[ 1441,400 ] = -1.65504980;    buf[ 1441,400 ] = -1.65504801
2013.11.29 17:09:12     vect_v2_all_devices (EURUSD,H1) sum( 1617,306 ) = -2.14686131;    thirdCPU[ 1617,306 ] = -2.14686131;    buf[ 1617,306 ] = -2.14686537
2013.11.29 17:09:12     vect_v2_all_devices (EURUSD,H1) ________________________
2013.11.29 17:09:13     vect_v2_all_devices (EURUSD,H1) read = 4000000 elements
2013.11.29 17:09:13     vect_v2_all_devices (EURUSD,H1) Device = 1: time = 0.734 sec.
2013.11.29 17:09:13     vect_v2_all_devices (EURUSD,H1) CPUTime / GPUTotalTime = 87.309
2013.11.29 17:09:13     vect_v2_all_devices (EURUSD,H1) sum( 370,1332 ) = 0.78463894;    thirdCPU[ 370,1332 ] = 0.78463894;    buf[ 370,1332 ] = 0.78463584
2013.11.29 17:09:13     vect_v2_all_devices (EURUSD,H1) sum( 1346,515 ) = 4.13771629;    thirdCPU[ 1346,515 ] = 4.13771629;    buf[ 1346,515 ] = 4.13771629
2013.11.29 17:09:13     vect_v2_all_devices (EURUSD,H1) sum( 632,631 ) = 0.53385985;    thirdCPU[ 632,631 ] = 0.53385985;    buf[ 632,631 ] = 0.53386015
2013.11.29 17:09:13     vect_v2_all_devices (EURUSD,H1) sum( 930,102 ) = 6.17934942;    thirdCPU[ 930,102 ] = 6.17934942;    buf[ 930,102 ] = 6.17935467
2013.11.29 17:09:13     vect_v2_all_devices (EURUSD,H1) sum( 507,167 ) = 2.76653004;    thirdCPU[ 507,167 ] = 2.76653004;    buf[ 507,167 ] = 2.76652718
2013.11.29 17:09:13     vect_v2_all_devices (EURUSD,H1) sum( 1638,1623 ) = -3.40129304;    thirdCPU[ 1638,1623 ] = -3.40129304;    buf[ 1638,1623 ] = -3.40129256
2013.11.29 17:09:13     vect_v2_all_devices (EURUSD,H1) sum( 208,649 ) = 8.09206963;    thirdCPU[ 208,649 ] = 8.09206963;    buf[ 208,649 ] = 8.09207344
2013.11.29 17:09:13     vect_v2_all_devices (EURUSD,H1) sum( 298,741 ) = -0.59763604;    thirdCPU[ 298,741 ] = -0.59763604;    buf[ 298,741 ] = -0.59763324
2013.11.29 17:09:13     vect_v2_all_devices (EURUSD,H1) sum( 1334,521 ) = -2.74508810;    thirdCPU[ 1334,521 ] = -2.74508810;    buf[ 1334,521 ] = -2.74508691
2013.11.29 17:09:13     vect_v2_all_devices (EURUSD,H1) sum( 858,760 ) = -7.48025274;    thirdCPU[ 858,760 ] = -7.48025274;    buf[ 858,760 ] = -7.48025846
2013.11.29 17:09:13     vect_v2_all_devices (EURUSD,H1) ________________________



CPU-Z CPUID - System & hardware benchmark, monitoring, reporting
CPU-Z CPUID - System & hardware benchmark, monitoring, reporting
  • www.cpuid.com
CPU-Z is a freeware that gathers information on some of the main devices of your system.
 

Também tentei testar o indicadorqpu_EMA-Rainbow do MetaDriver.


No CPU, o resultado é por vezes até 2x melhor. Aqui está o resultado:

2013.12.01 14:12:50     qpu_Future_EMA-Rainbow (EURUSD,M1)      Calculate 1000129 bars at CPU, time = 811 ms
2013.12.01 14:12:57     qpu_Future_EMA-Rainbow (EURUSD,M1)      OpenCL: GPU device 'GeForce GTX 650 Ti BOOST' selected
2013.12.01 14:12:58     qpu_Future_EMA-Rainbow (EURUSD,M1)      Calculate 1000129 bars at GPU (OpenCL), time = 1295 ms

//---

Volodya(MetaDriver), mostre-me os seus resultados?

P.S. Alterei o meu tipo no código do kernel nos parâmetros da função gpuEMA de__global para__local. Um pouco mais rápido, mas ainda mais lento do que no CPU.

2013.12.01 14:29:46     qpu_Future_EMA-Rainbow (EURUSD,M1)      Calculate 1000129 bars at CPU, time = 795 ms
2013.12.01 14:29:51     qpu_Future_EMA-Rainbow (EURUSD,M1)      OpenCL: GPU device 'GeForce GTX 650 Ti BOOST' selected
2013.12.01 14:29:52     qpu_Future_EMA-Rainbow (EURUSD,M1)      Calculate 1000129 bars at GPU (OpenCL), time = 1061 ms
Arquivos anexados:
 
tol64:

Também tentei testar o indicadorqpu_EMA-Rainbow do MetaDriver.

No CPU, o resultado é por vezes até 2x melhor. Aqui está o resultado:

Volodya(MetaDriver), mostre-me os seus resultados?

P.S. Alterado no código do núcleo nos parâmetros da função gpuEMA de__global para__local. Um pouco mais rápido, mas ainda mais lento do que no CPU.

Os meus resultados são semelhantes. Isto foi discutido durante muito tempo e é lógico - a tarefa é demasiado simples, transferir memória de e para a placa de vídeo não compensa. A vantagem da GPU aparece em tarefas mais complexas.
 
MetaDriver:
Tenho resultados semelhantes. Isto tem sido discutido há muito tempo, e faz sentido - a tarefa é demasiado simples, transferir memória de e para a placa de vídeo não compensa. A vantagem da GPU aparece em tarefas mais complexas.
Vejo, obrigado, vou fazer experiências com tarefas mais complexas.
 

Um exemplo de utilização da aceleração da GPU para negociação (derivados).

Mark Joshi - famoso pelos seus livros sobre matemática financeira, em particular sobre derivados e comércio de opções, relatou aqui o seu trabalho:

http://ssrn.com/abstract=2388415

Traduziu o seu trabalho ao estilo do OOP para a GPU CUDA. Começou-a em 2010, depois teve uma pausa, e de 2011 até ao Verão de 2014 conseguiu chegar à versão 0.3. Conseguiu uma aceleração de 100X. 137X vezes - e isso num algoritmo AMAZING, o que é difícil.

O trabalho utilizou a biblioteca QuantLib em C++, que ele próprio admite ter de retrabalhar segundo as linhas do "OOP ->-> abordagem processual" - de modo a que tudo funcionasse na GPU CUDA.

Ele escreve:

"Implementei os preços de Monte Carlo de IRD com a LMM na GPU com mínimos quadrados para características de exercício precoce.

Pode obter o código em kooderive.sourceforge.net tanto em C++ como em CUDA. O jornal está em ......

Usei um código para CUDA completamente diferente do que tinha usado anteriormente para C++. Em essência, trato os dados como o conceito central e utilizo o código para agir sobre os dados. O estilo é muito funcional. Foi preciso muito trabalho porque as minhas implementações anteriores do C++ tinham sido orientadas para objectos".

O seu projecto em si é de fonte aberta:

http://sourceforge.net/projects/kooderive/