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

 

http://www.ixbt.com/video3/rad2.shtml- É melhor usar bibliotecas optimizadas para grandes conjuntos de dados em vez de ficar "criativo" com programas de escrita em OpenCL (não estou a excluir). Pode usar um sistema híbrido, onde pequenas quantidades são tratadas usandoOpenCL e grandes quantidades são tratadasusando bibliotecas optimizadas. Poderá ser necessário converter a biblioteca para uma linguagem de programação específica e criar condições para a inclusão desta biblioteca. Se isto pudesse ser implementado, daria um resultado impressionante e, consequentemente, aceleraria a operação muitas vezes. Nota para .....

P.S. Este pode ser um novo tópico no fórum

������������������ AMD Radeon � �������������� �����������. ������������� AMD Core Math Library
  • www.ixbt.com
������� ������� ����������� �� �������, ��������� ����������� � ���� � �� �� �����, �� ������ ��� �� ����� ������. � ������� ������������ ������� �� ����� ����������� �� ����� �������, � �������� GPU ����� ����� ������������� �������� ��������� ������� ��������� ���� � ����� ����� �� ����� �����. � ���� ����� ������ ���������� ��� PC ����� x86...
 
GKS: Poderá ser necessário converter bibliotecas para uma linguagem de programação específica e criar condições para permitir esta biblioteca. Se isto puder ser implementado, obterá um resultado impressionante e, consequentemente, a operação será acelerada muitas vezes.

Não é tecnológico para os criadores afinar o compilador especificamente para um produto extremamente específico, embora único.

E até agora não vejo nenhuma tarefa de comerciante que exija um tamanho tão grande de matrizes multiplicadas.

 
MetaQuotes:

Anúncio da actualização do MetaTrader 5

Uma actualização da plataforma MetaTrader 5 será publicada nos próximos dias. Uma vez publicada a actualização, haverá um comunicado de imprensa adicional contendo a lista final de alterações e números de construção. Estão planeadas as seguintes alterações:

MetaTrader 5 Client Terminal build 648

MetaTester: Apoio adicional para a utilização de programas OpenCL em agentes de teste.

Aqueles que compreendem OpenCL, preparem um teste de tarefa em Cloud+OpenCL. Perspectivas matemáticas muito interessantes.
 
hrenfx: Compreender o OpenCL, preparar um teste de tarefa para o Cloud+OpenCL. Perspectivas matemáticas muito interessantes.
Isto é mais para o MetaDriver. Ele é um grande especialista em OpenCL e está a tentar imitar os testes.
 
hrenfx:
Compreender o OpenCL, preparar um teste de tarefa para o Cloud+OpenCL. Perspectivas matemáticas muito interessantes.
Mathemat:
Isso é mais para o MetaDriver........................
Vou pensar nisso. Preciso de algumas ideias em termos do que precisa exactamente de ser computado.
 

Controlador de vídeo recentemente actualizado (NVIDIA301.42).

Fiz um dos antigos testes por interesse (ParallelTester_00-01x) e não pude acreditar nos meus olhos.

Em 24 página estava a fazer o teste, e havia 29, depois pus a memória em modo 2 canais e passou para 39.

Agora é ~306.

2012.05.31 22:05:11     ParallelTester_00-01 x (EURUSD,D1)       OpenCL init OK!
2012.05.31 22:05:11     ParallelTester_00-01 x (EURUSD,D1)       GPU time = 141 ms
2012.05.31 22:05:11     ParallelTester_00-01 x (EURUSD,D1)       Соunt inticators = 16; Count history bars = 144000; Count pass = 1280
2012.05.31 22:05:11     ParallelTester_00-01 x (EURUSD,D1)       Result on Gpu МахResult==1.28051 at 1213 pass
2012.05.31 22:05:54     ParallelTester_00-01 x (EURUSD,D1)       CPU time = 43259 ms
2012.05.31 22:05:54     ParallelTester_00-01 x (EURUSD,D1)       Соunt inticators = 16; Count history bars = 144000; Count pass = 1280
2012.05.31 22:05:54     ParallelTester_00-01 x (EURUSD,D1)       Result on Cpu МахResult==1.28051 at 1213 pass
2012.05.31 22:05:54     ParallelTester_00-01 x (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)
Incrível. Parece que a NVIDIA afinou os condutores de forma humana.
 

fyords, como fez com que os eventos anteriores aparecessem mais altos no registo?

Mas em geral é óptimo, eu compreendo-o. Fiquei igualmente feliz quando comprei o meu HD 4870 a baixo preço e vi a sua potência.

Uma pequena recomendação: escolher parâmetros para que o tempo de execução da GPU seja comparável a 1 segundo. Então a relação de tempo também será mais precisa. O erro médio da função GteTickCount() não é inferior a dezenas de milissegundos. Assim poderia facilmente conseguir 120 ms ou 170 ms no GPU. E o valor da aceleração depende muito disto.

Aperfeiçoei um pouco este guião para o fazer funcionar em todos os dispositivos disponíveis (olha para cima a partir da base: 1) CPU na plataforma Intel, depois 2) HD 4870 na plataforma AMD, e 3) CPU na plataforma AMD):

2012.05.31 15:48:35     OpenCL  CPU: GenuineIntel  Intel(R) Pentium(R) CPU G840 @ 2.80 GHz 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.80 GHz with OpenCL 1.1 (2 units, 2800 MHz, 8040 Mb, version 1.1)

Os resultados do guião são de baixo para cima!

2012.06.01 01:06:12     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     ------------
2012.06.01 01:06:12     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     Result on Gpu МахResult==0.87527 at 10902 pass
2012.06.01 01:06:12     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     CpuTime/GpuTime = 24.76943755169562
2012.06.01 01:06:12     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     GPU time = 9672 ms
2012.06.01 01:06:02     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     Device number = 2
2012.06.01 01:06:02     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     ------------
2012.06.01 01:06:02     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     Result on Gpu МахResult==0.87527 at 10902 pass
2012.06.01 01:06:02     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     CpuTime/GpuTime = 204.7606837606838
2012.06.01 01:06:02     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     GPU time = 1170 ms
2012.06.01 01:06:01     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     Device number = 1
2012.06.01 01:06:01     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     ------------
2012.06.01 01:06:01     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     Result on Gpu МахResult==0.87527 at 10902 pass
2012.06.01 01:06:01     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     CpuTime/GpuTime = 77.55584331498866
2012.06.01 01:06:01     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     GPU time = 3089 ms
2012.06.01 01:05:57     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     Device number = 0
2012.06.01 01:05:57     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     -------------------------
2012.06.01 01:05:57     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     Result on Cpu МахResult==0.87527 at 10902 pass
2012.06.01 01:05:57     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     Соunt indicators = 16; Count history bars = 144000; Count pass = 12800
2012.06.01 01:05:57     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     CPU time = 239570 ms
2012.06.01 01:01:58     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     ========================================
Neste último parâmetro, que é 10x menos, o meu cartão não é tão rápido como o seu. Provavelmente não tem tempo para fazer um overclock adequado :)
Arquivos anexados:
 
Para informação, GetTickCount tem uma taxa de erro bem inferior a 16 ms, não é como usar o Windows 95.
 
Mathemat:

fyords, como fez com que os eventos anteriores aparecessem mais altos no registo?

Nos relatórios, botão direito "View", nova janela "Query" botão e o registo é construído pelo tempo correctamente, e é mais conveniente de ler (para mim).

Quanto ao guião, obrigado, vou experimentá-lo amanhã, é uma longa espera pela sua conclusão, especialmente com o passe de contagem = 12800.

Por agora aqui está um guião antigo com passe de contagem = 12800

2012.06.01 01:05:53     ParallelTester_00-01 x (EURUSD,D1)       OpenCL init OK!
2012.06.01 01:05:54     ParallelTester_00-01 x (EURUSD,D1)       GPU time = 999 ms
2012.06.01 01:05:54     ParallelTester_00-01 x (EURUSD,D1)       Соunt inticators = 16; Count history bars = 144000; Count pass = 12800
2012.06.01 01:05:54     ParallelTester_00-01 x (EURUSD,D1)       Result on Gpu МахResult==1.49697 at 10010 pass
2012.06.01 01:13:08     ParallelTester_00-01 x (EURUSD,D1)       CPU time = 434167 ms
2012.06.01 01:13:08     ParallelTester_00-01 x (EURUSD,D1)       Соunt inticators = 16; Count history bars = 144000; Count pass = 12800
2012.06.01 01:13:08     ParallelTester_00-01 x (EURUSD,D1)       Result on Cpu МахResult==1.49697 at 10010 pass
2012.06.01 01:13:08     ParallelTester_00-01 x (EURUSD,D1)       CpuTime/GpuTime = 434.6016016016016
O ganho tornou-se ainda maior.
 
Renat: Para informação: GetTickCount tem um erro muito inferior a 16 ms, não está a usar o Windows 95.

Na realidade, o erro não é muito menor. Sim, perto disso, mas há outliers da média, agrupando-se em torno de 32, 48 e até mais. São raros, não discuto, podem ser ignorados.

Mas quando uma pessoa executa um guião, não está necessariamente a fazer nada no computador. E o sistema também pode executar as suas próprias tarefas, o que pode atrasar a execução.

Tecnicamente, o desvio padrão é de facto pequeno, cerca de 6-7, e fracamente dependente do próprio tempo de execução. Mas reflecte mal a verdadeira variação. Aqui está um histograma dos tempos registados ao efectuar os mesmos cálculos:

A distância entre barras adjacentes é de 16ms. As colunas mais pequenas são bastante prováveis, e diferem umas das outras em até 32ms. Se a coluna do meio ("tempo de execução verdadeiro") for de 140 milissegundos, então a da esquerda é de 124 ms e a da direita é de 156 ms.

Assim, a variação real quando dividida pelo baixo tempo de execução da GPU pode ser bastante grande:

20 segundos/124ms ~ 161

20 segundos/156 ms ~ 128.

A "verdadeira relação" de tempos de execução corresponde aproximadamente à maior barra:

20 seg/140ms ~ 143.

Se demorarmos mais tempo de execução na GPU, o impacto deste erro será muito menor. Que sejam, pelo menos, 500ms.

Roteiro para a simulação:

#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");
}
//+------------------------------------------------------------------+