No computador 1, o tempo de execução de todas as instruções é 10 ns . No computador 2, o tempo de execução é de 5 ns . Você pode afirmar com certeza que o computador 2 é mais rápido? Discuta sua resposta.
Passo 1
O enunciado dá duas informações simples e pede uma conclusão:
- No computador 1, o tempo de execução de todas as instruções é
. - No computador 2, o tempo de execução de todas as instruções é
.
A pergunta é: “Você pode afirmar com certeza que o computador 2 é mais rápido?” — ou seja, com apenas esses dados, dá para concluir inequivocamente que qualquer programa rodará mais rápido no computador 2?
Passo 2
Primeiro vamos organizar o que normalmente importa para dizer se um computador é mais rápido ao executar um programa. Há uma fórmula padrão e muito útil para tempo de CPU (tempo de execução de um programa):
Expliquei cada termo bem devagar:
-
= número total de instruções que o programa precisa executar no processador (depende do compilador, ISA e algoritmos gerados). -
= “cycles per instruction”: média de ciclos de clock que cada instrução leva (depende da microarquitetura, hazards, caches, branch mispredictions, etc.). -
= duração de um ciclo de clock (por exemplo, corresponde a frequência ).
Observação importante sobre o enunciado: quando ele diz "tempo de execução de todas as instruções é
" pode significar, de forma simplificada, que o tempo por instrução médio (isto é, o produto
ou simplesmente o tempo de ciclo se
) é
. Há ambiguidade: não está claro se esse número é o tempo de ciclo, a latência de instrução, o throughput, ou uma média já incorporando CPI. Por isso já surgem dúvidas.
Passo 3
Agora mostro o caso em que, comumente, podemos dizer que o computador 2 é mais rápido: suponha que tudo mais seja igual entre os dois (mesma contagem de instruções e mesma média de
). Então comparar apenas o tempo por instrução é legítimo.
Exemplo numérico:
- Seja
(Contagem de Instruções igual para ambos) e . - Computador 1: tempo por instrução
. Então
- Computador 2: tempo por instrução
. Então
Aqui o computador 2 é exatamente
mais rápido (speedup
). Logo, se tudo mais for igual, sim, o computador 2 é mais rápido.
Passo 4
Agora mostro um cenário em que o computador 2 NÃO é mais rápido, apesar de ter tempo por instrução menor. A chave é que programas compilados para arquiteturas diferentes podem requerer números diferentes de instruções para realizar a mesma tarefa.
Exemplo numérico:
- Suponha que para um mesmo programa o computador 1 execute
instruções (por exemplo, instruções mais poderosas), e o computador 2 execute instruções (por exemplo, conjunto RISC que desmembra operações complexas em mais instruções). Mantemos para os dois para simplificar. - Computador 1:
- Computador 2:
Neste caso o computador 1 é mais rápido, mesmo tendo instruções mais “lentas” individualmente. Conclusão: tempo por instrução isolado não garante performance de programa.
Passo 5
Outros fatores que alteram totalmente a comparação (explico cada um em linguagem simples):
- Variação de
: caches, faltas de cache, desvios incorretos de branch, stalls de pipeline podem aumentar muito a média de ciclos por instrução. Mesmo um tempo de ciclo menor não compensa um muito maior. - Latência versus throughput: um núcleo pode ter latência alta por instrução, mas pipeline/superscalar permite emitir várias instruções por
(throughput) — isso muda a comparação dependendo do que exatamente foi medido. - Código gerado/compilador/ISA: instruções complexas (CISC) podem fazer mais trabalho por instrução; instruções simples (RISC) podem exigir mais instruções.
- I/O e espera por memória: se o programa é limitado por acesso à memória (cache misses graves), o ganho de reduzir o tempo por instrução pode ser insignificante.
- Métricas reais: a única forma confiável de comparar é medir tempo de execução do programa real (benchmarks) ou calcular com a fórmula usando valores reais de
, e tempo de ciclo.
Passo 6
Resumo prático e orientação para a prova (como usar isso rapidamente na hora do exame):
- Separe claramente “tempo por instrução” de “tempo para executar o programa”. Use a fórmula
- Se te derem só o tempo por instrução (ou só tempo de ciclo) para duas máquinas, NÃO conclua automaticamente qual é mais rápida a menos que haja a afirmação adicional: “a contagem de instruções e o CPI são iguais para ambas” ou “o mesmo código e compilador geram igual número de instruções”.
- Na prova, se pedirem julgamento a partir de dados incompletos, diga explicitamente quais hipóteses você está fazendo (por exemplo, assumo igual
e igual ), e mostre o cálculo rápido do speedup.
Passo 7
Conclusão amigável: com apenas os dois números fornecidos não é possível afirmar com certeza que o computador 2 é mais rápido para todos os programas. Pode ser verdade sob hipóteses adicionais (mesmo IC e CPI), mas pode ser falso em muitos cenários práticos (diferença de IC, caches, CPI, etc.). Para ter certeza, é preciso ou medir tempo real do programa (benchmark) ou conhecer
e
para cada máquina e então usar a fórmula do Passo 2.
Resposta
Não — não se pode afirmar com certeza que o computador 2 é mais rápido apenas com esses números; isso só seria verdade se contagem de instruções e
fossem iguais em ambas as máquinas.