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

 
joo:

Parece que sim.

Não tenho a certeza, porque tento não usar construções complicadas (difíceis de perceber a olho nu), mas provavelmente não o deveria fazer, pois pode acelerar o código.

O seu código deveria provavelmente ser mais lento, porque a variável b é redeclarada a cada iteração do laço.

O meu código é mais curto e mais rápido de qualquer forma. Pode verificar tanto a velocidade como a equivalência
"__kernel void MFractal(                                    \r\n"
"                       __global int *out                   \r\n"
"                      )                                    \r\n"
"  {                                                        \r\n"
"   int i = get_global_id(0);                               \r\n"
"   out[i]= i;                                              \r\n"
"  }                                                        \r\n"; //;-))
;-)
 
MetaDriver: O meu código é mais curto e mais rápido de qualquer forma. Pode verificar tanto a velocidade como a equivalência;-)
Não, isso não é justo. Deve tratar do código do Andrei e acelerá-lo.
 
Mathemat:
Não, bem, isso não é justo. Lida com o código de Andrei e acelera-o.

O que é que eu fiz?

O que se exige do optimista? Reduzir as despesas gerais, mantendo os resultados equivalentes! Portanto, vejam só, tudo se soma a um centavo.

:)

// A propósito!!! Este código não deixa cair o meu motorista mesmo com #define BUF_SIZE 1024*1024*4 !!!

// Isto é um avanço!

;))))

 
MetaDriver:

O que é que eu fiz?

O que se exige do optimista? Reduzir as despesas gerais, mantendo os resultados equivalentes! Portanto, vejam só, tudo se soma a um centavo.

:)

Fez a soma? Como verificou? :O
 
joo:
Como é que se verificou? :O
Como, como! com uma calculadora! Corri oito delas em paralelo e verifiquei.
 
MetaDriver:
Como, como! na calculadora! Corri oito delas em paralelo e verifiquei.

A sua calculadora está a mentir. :)

O ciclo acrescenta 0+1+2+3+...+999999999999. E após cada 10000 passos, o valor é 0.

O que é que fez? - Atribuiu um número de mosca e pronto. Como podem os meus resultados ser os mesmos que os seus?

 

Tenho feito um pouco de investigação e suspeito que isto

"__kernel void MFractal(                                    \r\n"
"                       __global int *out                   \r\n"
"                      )                                    \r\n"
"  {                                                        \r\n"
"   out[get_global_id(0)]= get_global_id(0);                \r\n"
"  }                                                        \r\n";

A questão é, get_global_id() muito provavelmente não é uma função, mas uma operação de registo super-rápida.

Se alguém precisar e quiser, por favor comunique os resultados ao estúdio.
 
MetaDriver:

O que se exige do optimista? Reduza as despesas gerais, mantendo os resultados equivalentes! Por isso, vejam só, tudo se soma a um cêntimo.

// A propósito!!! Este código não deixa cair o meu motorista mesmo com #define BUF_SIZE 1024*1024*4 !!!

Por outro lado - se o condutor não o deixar cair, a equivalência no resultado já está incompleta.

Merda... Que chatice! :(

 
MetaDriver: Por outro lado, como o condutor não o deixa cair, a equivalência no resultado já está incompleta.

Não, não tem fumado bem.

1^3 + 2^3 + 3^3 + ... + 1000000000^3 = 1000000000^2 * (1000000000 + 1)^2 / 4

Esquerda e direita são a mesma coisa, equivalência total.

Apenas com a expressão esquerda aquecerá a pedra durante bastante tempo, enquanto que com a direita será quase instantânea, o processador não notará e permanecerá frio.

P.S. I actualizou para OpenCL 1.2 (é beta). Por favor note a pequena adição após o número da versão - sse2.

2012.03.22 07:43:28     Terminal        CPU: GenuineIntel  Intel(R) Pentium(R) CPU G840 @ 2.80 GHz with OpenCL 1.2 (2 units, 2793 MHz, 7912 Mb, version 2.0 (sse2))

Não quer dizer que tenha melhorado drasticamente, mas que tenha acelerado em alguns testes. Digamos, em Tast_Mand_ (bem, és um pervertido, Andrewha) - 5% a 10%. Só um pouco, mas bom.

 
joo:

A sua calculadora está a mentir. :)

O laço adiciona 0+1+2+3+...+999999999999. E após cada 10000 passos, o valor é 0.

O que é que fez? - Atribuiu um número de mosca e pronto. Então, como podem os meus resultados ser os mesmos que os seus?

Dei-lhe quase 24 horas para cair em si. Ainda insiste? :)

Vejamos:

// Это твой код (оригинал)
"  {                                \r\n"
"   int i = get_global_id(0);       \r\n"
"   for(int u=0;u<100000000;u++)   \r\n"
"   {                           \r\n"
"    out[i]+=u;              \r\n"  
"    if(out[i]>10000)     \r\n"
"      out[i]=0;         \r\n" // после десятитысячного шага итерации этот оператор начнёт выполняться в каждом цикле.
"   }                    \r\n" // т.е. на выходе из цикла по любому будем иметь out[i] = 0;
"   out[i]+= i;          \r\n" // ecли к нулю прибавить номер мухи то получится... сам посчитай..... на калькуляторе... :)
"  }                     \r\n";// есть ещё вариант, надёжнее - распечатай результаты и сравни.  ;-)))
Razão: