Como medir manualmente o pulso do relógio do meu computador?

3

Meu PC tem dois processadores e sei que cada um deles roda a 1,86 GHz. Acabei de ler sobre ciclos de clock e eu só tenho um entendimento (muito) difícil, então peço desculpas antecipadamente se a minha pergunta for tão estúpida.

Como eu disse, eu quero medir o pulso de clock do processador do meu PC manualmente, e minha ideia é apenas calcular o quociente entre o número de linhas de assembler que um programa tem, e o tempo que meu computador gasta para executá-lo , então eu tenho o número de instruções de montagem por tempo processado pela CPU (isso é o que eu entendi um 'ciclo de clock' é). Eu pensei em fazer da seguinte maneira:

  1. Eu escrevo um programa em C e o converto em código assembly.
  2. Eu faço: $gcc -S my_program.c , que diz ao compilador gcc para fazer todo o processo de compilação, exceto a última etapa: transformar my_program.c em um objeto binário. Assim, eu tenho um arquivo chamado my_program.s que contém a origem do meu programa C traduzido em código assembler.
  3. Eu conto as linhas do meu programa (vamos chamar esse número N). Eu fiz: $ nl -l my_program.s | tail -n 1 e obtive o seguinte:

    1000015     .section    .note.GNU-stack,"",@progbits
    

    É para dizer que o programa tem um milhão de linhas de código.

  4. eu faço: $gcc my_program.c para que eu possa executá-lo.
  5. Eu faço: $time ./a.out ("a.out" é o nome do objeto binário de my_program.c) para obter o tempo (vamos chamá-lo de T) é gasto para executar o programa e eu obtenho:

    real    0m0.059s
    user    0m0.000s
    sys     0m0.004s
    

Supõe-se que o tempo que estou procurando é o primeiro representado na lista: o "real", porque os outros se referem a outros recursos que estão sendo executados no meu sistema no mesmo momento exato em que executo ./a.out .

Então eu tenho que N = 1000015 linhas e T = 0,059 segundos. Se eu executar a divisão N / T, obtenho que a frequência está próxima de 17 MHz, o que obviamente não está correto.

Depois pensei que talvez o fato de haver outros programas rodando em meu computador e consumindo recursos de hardware (sem ir mais longe, o próprio sistema operacional) faça com que o processador "divida" seu "poder de processamento" e faça pulso de clock vai mais lento, mas não tenho certeza.
Mas eu pensei que se isso fosse certo, eu também deveria encontrar a porcentagem de recursos da CPU (ou memória) que meu programa consome, porque então eu realmente poderia aspirar a obter um resultado (bem) aproximado sobre a minha velocidade real da CPU.
E isso me leva à questão de como descobrir esse 'valor de consumo de recursos' do meu programa. Eu pensei sobre o comando $ top , mas ele é imediatamente descartado devido ao pouco tempo que meu programa gasta para ser executado (0.059 segundos); Não é possível distinguir por simples visão qualquer pico no uso de memória durante este pequeno período de tempo.

Então o que você acha disso? Ou o que você me recomenda para fazer? Estou apenas aprendendo e, como você pode ver, estou muito longe de ser um especialista nessas questões. E eu sei que existem programas que fazem este trabalho que eu tento fazer, mas eu prefiro fazê-lo usando o bash raw porque estou interessado em fazê-lo da maneira mais "universal" possível (parece mais confiável).

    
por danielmbcn 18.04.2013 / 14:39

1 resposta

4

Isso não vai funcionar. O número de ciclos de clock que cada instrução leva para executar (eles tomam alguns, não apenas um) depende muito da combinação exata de instruções que o cercam e varia de acordo com o modelo exato de cpu. Você também tem interrupções chegando e o kernel e outras tarefas com instruções executadas misturadas com as suas. Além disso, a frequência muda dinamicamente em resposta a carga e temperatura.

As CPUs modernas têm registros específicos do modelo que contam o número exato de ciclos de clock. Você pode ler isto, e usando um temporizador de alta resolução, leia-o novamente um período fixo depois, e compare os dois para descobrir qual foi a freqüência (média) durante aquele período.

    
por 18.04.2013 / 15:48