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 .....
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.
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.
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.3122:05:11 ParallelTester_00-01 x (EURUSD,D1) OpenCL init OK!
2012.05.3122:05:11 ParallelTester_00-01 x (EURUSD,D1) GPU time = 141 ms
2012.05.3122:05:11 ParallelTester_00-01 x (EURUSD,D1) Соunt inticators = 16; Count history bars = 144000; Count pass = 12802012.05.3122:05:11 ParallelTester_00-01 x (EURUSD,D1) Result on Gpu МахResult==1.28051 at 1213 pass
2012.05.3122:05:54 ParallelTester_00-01 x (EURUSD,D1) CPU time = 43259 ms
2012.05.3122:05:54 ParallelTester_00-01 x (EURUSD,D1) Соunt inticators = 16; Count history bars = 144000; Count pass = 12802012.05.3122:05:54 ParallelTester_00-01 x (EURUSD,D1) Result on Cpu МахResult==1.28051 at 1213 pass
2012.05.3122:05:54 ParallelTester_00-01 x (EURUSD,D1) CpuTime/GpuTime = 306.8014184397163
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.3115:48:35 OpenCL CPU: GenuineIntel Intel(R) Pentium(R) CPU G840 @ 2.80 GHz with OpenCL 1.2 (2 units, 2793 MHz, 8040 Mb, version2.0 (sse2))
2012.05.3115: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.3115: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, version1.1)
Os resultados do guião são de baixo para cima!
2012.06.0101:06:12 ParallelTester_00-01 x_new_cycle (EURUSD,H1) ------------
2012.06.0101:06:12 ParallelTester_00-01 x_new_cycle (EURUSD,H1) Result on Gpu МахResult==0.87527 at 10902 pass
2012.06.0101:06:12 ParallelTester_00-01 x_new_cycle (EURUSD,H1) CpuTime/GpuTime = 24.769437551695622012.06.0101:06:12 ParallelTester_00-01 x_new_cycle (EURUSD,H1) GPU time = 9672 ms
2012.06.0101:06:02 ParallelTester_00-01 x_new_cycle (EURUSD,H1) Device number = 22012.06.0101:06:02 ParallelTester_00-01 x_new_cycle (EURUSD,H1) ------------
2012.06.0101:06:02 ParallelTester_00-01 x_new_cycle (EURUSD,H1) Result on Gpu МахResult==0.87527 at 10902 pass
2012.06.0101:06:02 ParallelTester_00-01 x_new_cycle (EURUSD,H1) CpuTime/GpuTime = 204.76068376068382012.06.0101:06:02 ParallelTester_00-01 x_new_cycle (EURUSD,H1) GPU time = 1170 ms
2012.06.0101:06:01 ParallelTester_00-01 x_new_cycle (EURUSD,H1) Device number = 12012.06.0101:06:01 ParallelTester_00-01 x_new_cycle (EURUSD,H1) ------------
2012.06.0101:06:01 ParallelTester_00-01 x_new_cycle (EURUSD,H1) Result on Gpu МахResult==0.87527 at 10902 pass
2012.06.0101:06:01 ParallelTester_00-01 x_new_cycle (EURUSD,H1) CpuTime/GpuTime = 77.555843314988662012.06.0101:06:01 ParallelTester_00-01 x_new_cycle (EURUSD,H1) GPU time = 3089 ms
2012.06.0101:05:57 ParallelTester_00-01 x_new_cycle (EURUSD,H1) Device number = 02012.06.0101:05:57 ParallelTester_00-01 x_new_cycle (EURUSD,H1) -------------------------
2012.06.0101:05:57 ParallelTester_00-01 x_new_cycle (EURUSD,H1) Result on Cpu МахResult==0.87527 at 10902 pass
2012.06.0101:05:57 ParallelTester_00-01 x_new_cycle (EURUSD,H1) Соunt indicators = 16; Count history bars = 144000; Count pass = 128002012.06.0101:05:57 ParallelTester_00-01 x_new_cycle (EURUSD,H1) CPU time = 239570 ms
2012.06.0101: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 :)
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.0101:05:53 ParallelTester_00-01 x (EURUSD,D1) OpenCL init OK!
2012.06.0101:05:54 ParallelTester_00-01 x (EURUSD,D1) GPU time = 999 ms
2012.06.0101:05:54 ParallelTester_00-01 x (EURUSD,D1) Соunt inticators = 16; Count history bars = 144000; Count pass = 128002012.06.0101:05:54 ParallelTester_00-01 x (EURUSD,D1) Result on Gpu МахResult==1.49697 at 10010 pass
2012.06.0101:13:08 ParallelTester_00-01 x (EURUSD,D1) CPU time = 434167 ms
2012.06.0101:13:08 ParallelTester_00-01 x (EURUSD,D1) Соunt inticators = 16; Count history bars = 144000; Count pass = 128002012.06.0101:13:08 ParallelTester_00-01 x (EURUSD,D1) Result on Cpu МахResult==1.49697 at 10010 pass
2012.06.0101:13:08 ParallelTester_00-01 x (EURUSD,D1) CpuTime/GpuTime = 434.6016016016016
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 1000voidOnStart( )
{
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");
}
//+------------------------------------------------------------------+
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
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.
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.
Compreender o OpenCL, preparar um teste de tarefa para o Cloud+OpenCL. Perspectivas matemáticas muito interessantes.
Isso é mais para o MetaDriver........................
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.
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):
Os resultados do guião são de baixo para cima!
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 :)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
O ganho tornou-se ainda maior.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: