Velocidade de execução de calculo

Como calcula o velocidade de execução, de um programa no arduino, sei que o clock real dele é 16Mhz, mas ao executar um código que velocidade terá (não relevando tudo).
Pois fiz o código abaixo que simplesmente executa um loop 1000.000 de vezes e realiza um calculo também 1000.000 de vezes (este calculo resulta sempre em 0). Envie o tempo de execução via porta serial (Imagem 1) e ache muito lento, esta certo ou eu estou fazendo errado.

unsigned long Time_1;
unsigned long Time_2;
unsigned long Loop;
unsigned long Result;

void setup(){
  Serial.begin(115200);

}
void loop(){
  Serial.println(Time_2);
  Time_1 = micros();
  for (Loop=0; Loop <= 1000000; Loop++)
  {
    Result=Loop-Loop;
  }
  Time_2 =micros()-Time_1;
}

Imagem 1.jpg

Cerca de 1 segundo...

Tendo em conta que estás a usar um processador RISC (só tem operações simples) de 8 bits, não me espanta essa velocidade.

Que estavas à espera?

Eu esperava algo em torno de 300ms. Queria saber mais profundamente como funciona clock de processadores, e como os 16Mhz dava de desempenho em relação a cálculos, ou seja , entender melhor o funcionamento, porque sou noob nisso =( ,porem quero aprender :D.

Agora sugiram algumas perguntas:

O arduino due, como será que se comporta, com esses calculo?
Tem como otimizar o desempenho do uno?
Em um programa grande (não abusando) o uno, vai executar lento assim também?
Alguém sugere algum material, para entender, melhor esses assuntos.

Obs. Pelo, menos o código de marcar o scan do programa funcionou.

paulosev:
Eu esperava algo em torno de 300ms.

Querer nem sempre é poder...

paulosev:
Queria saber mais profundamente como funciona clock de processadores, e como os 16Mhz dava de desempenho em relação a cálculos, ou seja , entender melhor o funcionamento, porque sou noob nisso =( ,porem quero aprender :D.

Que tal começar lendo o manual de instruções do ATMEGA328?

E como chegaste ao valor de 300 ms?

Já experimentaste fazer esses cálculos com int e char?

O problema é que o Arduino tem um processador RISC... e isso significa que ele faz as operações um byte de cada vez. Ora no teu caso, ele precisa de ir buscar um byte, ir buscar o outro, subtrair, ver a flag de carry, ir buscar os bytes seguintes, subtrair com a flag de carry, etc... isso demora tempo.
Se experimentares fazer o mesmo ciclo com variáveis diferentes o tempo de ciclo deve mudar. float deve ser um resultado interessante.

Nota também que tens muita coisa a correr (por causa do firmware do Arduino) como o millis ou micros, comunicações série, etc, etc...

Para fazer um teste a sério, normalmente usar-se-ia um osciloscópio que pulsava uma saída entre cálculos para ver precisamente o tempo que demora sem interrupções de outras fontes.

O Due tem uma arquitectura diferente... e é uma máquina de 32 bits... ele mastigaria isso num instante.

Que pretendes fazer com o Arduino?

Sempre existe a possibilidade de se fazer um overclock do seu Arduino!!! :wink:

Sempre existe a possibilidade de se fazer um overclock do seu Arduino!!!

De todo indesejavel a meu ver.
Se desejas fazer isso para assim poderes ter mais poder de processamento certamente entao o arduino nao é o que necessitas mas sim algo mais avançado.

HugoPT:

Sempre existe a possibilidade de se fazer um overclock do seu Arduino!!!

De todo indesejavel a meu ver.
Se desejas fazer isso para assim poderes ter mais poder de processamento certamente entao o arduino nao é o que necessitas mas sim algo mais avançado.

Meu comentário foi uma brincadeira, mas como você levou a sério, vamos lá:

É bastante seguro ter um Atmega328 rodando a 20MHz (ao invés dos 16Mhz de um Arduino normal). Para se ter um Arduino rodando a 20Mhz as alterações necessárias são poucas. Basta apenas mudar alguns parâmetros no avrdude.conf e recompilar o bootloader (optiboot) para trabalhar a 20 Mhz. Tem muita gente fazendo isto.

Tem relatos de pessoas trabalhando com um Atmega328 a 22 MHz, e de forma bastante confiável.

O mesmo de pessoas a usar o atmega com 3,3V e 16 MHz... Neste caso a diferença é o dobro do aconselhável. Mas isto é a mesma história dos iogurtes... Se estão bons quando acaba o prazo? Sim, 99,9% das vezes sim. Mas alguém quer a responsabilidade para além do prazo? Não, claro que não.

Com os chips é a mesma coisa. Claro que se tiveres experiência e quiseres que o chip falhe prematuramente e para lá da garantia então é uma boa ideia fazer o overclocking.

Sabes de empresas a fazer isso como prática corrente?

Já agora qual é a temperatura do chip a essas frequências?

bubulindo:
Com os chips é a mesma coisa. Claro que se tiveres experiência e quiseres que o chip falhe prematuramente e para lá da garantia então é uma boa ideia fazer o overclocking.

Um Atmega328 trabalhando a 20Mhz com 5V está bastante dentro das especificações. Segundo o datasheet, com 20MHz ele pode trabalhar até 5.5V.

3.3V a 16MHz, no entanto, já é em si um overclock, pois para esta tensão ele deveria trabalhar a 10Mhz.

Qual o tempo de vida útil de um Atmega328 que a Atmel garante? 20 anos? 40 anos? Vamos supor 20 anos, que é um prazo até curtíssimo para microcontroladores. Se trabalhar ligeiramente fora das especificações pode reduzir a vida útil dele em 50%, ele ainda durará 10 anos. Só que daqui a 10 anos ele estará totalmente obsoleto, portanto, se ter excedido as especificações trouxe benefícios para o projeto, então valeu a pena fazê-lo. Será que fui claro?

A propósito, o datasheet garante uma retenção de dados no Atmega328 de 100 anos a 25ºC e 20 anos a 85ºC.

Deixa eu te dar como exemplo meu Intel Core-i7. O meu computador de casa de um Core i7-920, que é de fábrica 2.66GHz. Com overclock e boa refrigeração, eu estou trabalhando com ele a 4.20GHz há mais de 2 anos. Vale a pena? Sim! Eu sei que ele, dentro das especificações, dura mais de 20 anos (não se pode dizer isto de processadores da AMD, mas os da Intel duram uma vida inteira). Se ele durar apenas 10 anos, eu ainda estou no lucro, pois estou fazendo um processador que me custou US$ 250 trabalhar como se fosse um processador de US$ 400, portanto economicamente é muito interessante. Daqui a 7-8 anos, se ele queimar, eu não terei o menor interesse em substituí-lo, mas sim adquirir a tecnologia que estiver vigente à época.

Acredito eu que com microcontroladores é a mesma coisa: se exceder as especificações for tecnicamente viável e economicamente interessante para o projeto, sem qualquer ônus a curto e médio prazo, eu acho que vale a pena sim.

Sabes de empresas a fazer isso como prática corrente?

De microcontroladores não sei, pois nunca pesquisei, mas no Hack A Day é comum ler sobre pessoas que fizeram coisas assim com bastante êxito, sobretudo com Arduinos.

Já com CPUs e GPUs eu posso te dar uma lista grande. Para começar a EVGA, que vende placas de vídeo que já possuem overclock de fábrica, portanto elas mesma exageram nas especificações da NVidia. O mercado de overclock de processadores também é grande. A própria Intel fabrica CPUs próprias para sofrerem overclock (sua linha Extreme).

Já agora qual é a temperatura do chip a essas frequências?

Seria uma boa medir isto, mas como o die do microcontrolador ocupa menos de 1cm2 do DIP-28 que usamos, existe ali muito espaço para dissipação de calor.

Novamente, repito: trabalhar a 20Mhz com 5V é normal para este uC e garantido pelo fabricante.

Depende do modelo, creio.. a atmel começou a fazer chips com essa gama de frequências à relativamente pouco tempo. Daí o arduino manter os 16 para compatibilidade.

Nota que falas em overclocking com refrigeração... o mesmo se aplica ao AVR...

Quanto à obsolescência do chip, existem aplicações com estes chips à mais de 10 ou 20 anos... nem todos os microcontroladores vão ter a honra de terem funções high-tech.

fabiohbm007:
Que tal começar lendo o manual de instruções do ATMEGA328?
http://www.atmel.com/Images/doc8161.pdf

Ok,
Vou começar a ler, o manual do Atmega, como também estudar como um bootloader é feito, obrigado pela dica.

bubulindo:
E como chegaste ao valor de 300 ms?

Não vou nem falar porque deve estar errado.

bubulindo:
Já experimentaste fazer esses cálculos com int e char?

Não mas vou tentar.

bubulindo:
O Due tem uma arquitectura diferente... e é uma máquina de 32 bits... ele mastigaria isso num instante.

E o Due como funciona sua Arquitetura, em quanto tempo será que ele processaria o código que coloquei?

Quanto ao desenrolar do assunto do overclock, bom não endento muito, mas informação nunca é demais aprendi muita coisa nova.

O valor do tempo de ciclo normalmente depende da aplicação e é um dos pontos que se utiliza para especificar o tipo de controlador que se vai utilizar. Se se precisa de muitos cálculos rapidamente, certamente que outro chip será aconselhável.

De notar também que esse cálculo do tempo de ciclo máximo não é algo óbvio de fazer, logo dizeres como o calculaste dá-te a oportunidade de dizermos de concordamos ou não.

O Due tem uma arquitectura ARM. Tendo em conta que é uma máquina de 32 bits, ou seja se o teu unsigned long for de 32 bits (como é no Arduino que tens) ele executa essa operação duma vez (ao contrário do Arduino normal que tem de fazer a operação 4 vezes). E depois com um clock de 84MHz (ou algo similar), isso dá uma velocidade louca. Mas precisas mesmo disso?

bubulindo:
logo dizeres como o calculaste dá-te a oportunidade de dizermos de concordamos ou não.

Esse valor foi tipo eu que escolhi, sem base nenhuma. Pensei que ele executava um calculo a cada 16,5 ns (1s/16Mhz), mas pensei errador (também esqueci que ele processa 1byte por vez). Se são 16 milhões de cálculos por segundos uma interação de 1 milhão deve demorar 62,5 ms, como são um calculo de loop, um de transposição de valor, e dois de subtração , achei que ia ser algo em 250 ms, como usa as bibliotecas e um bootloader coloquei mais 50ms, totalizado 300ms, mas está tudo errado meu jeito de calcular, por isso não disse como cheguei a esse valor :blush:.

bubulindo:
O Due tem uma arquitectura ARM. Tendo em conta que é uma máquina de 32 bits, ou seja se o teu unsigned long for de 32 bits (como é no Arduino que tens) ele executa essa operação duma vez (ao contrário do Arduino normal que tem de fazer a operação 4 vezes). E depois com um clock de 84MHz (ou algo similar), isso dá uma velocidade louca. Mas precisas mesmo disso?

Só vou usar o arduino, com trabalho de portas, o programa não vai ficar nele, queria um arduino rápido para isso (mesmo não tendo necessidade). Depois de aprender mexer nele quero programar direto o avr sem o bootloader, e quem sabe depois aprender com microprocessadores SoC de 32 bits.

paulosev:

bubulindo:
Já experimentaste fazer esses cálculos com int e char?

Não mas vou tentar.

De fato, ao trocar os tipos de objeto das variáveis ele executa mais rápido, só de trocar a variável “Result” de unsigned long para byte, ele diminuiu mais de 200 ms (executando a 880ms).

paulosev:
Como calcula o velocidade de execução, de um programa no arduino, sei que o clock real dele é 16Mhz, mas ao executar um código que velocidade terá (não relevando tudo).
Pois fiz o código abaixo que simplesmente executa um loop 1000.000 de vezes e realiza um calculo também 1000.000 de vezes (este calculo resulta sempre em 0). Envie o tempo de execução via porta serial (Imagem 1) e ache muito lento, esta certo ou eu estou fazendo errado.

unsigned long Time_1;

unsigned long Time_2;
unsigned long Loop;
unsigned long Result;

void setup(){
  Serial.begin(115200);

}
void loop(){
  Serial.println(Time_2);
  Time_1 = micros();
  for (Loop=0; Loop <= 1000000; Loop++)
  {
    Result=Loop-Loop;
  }
  Time_2 =micros()-Time_1;
}