# Ciclos por instrução

Em arquitetura de computadores, ciclos por instrução (também conhecido como ciclos de clock por instrução, clocks por instrução, ou CPI) é um aspecto da performance de um processador: o número médio de ciclos por clock por instrução para um programa ou fragmento de programa. É o inverso multiplicativo de instruções por ciclo.

## Definição

Ciclos Por Instrução é definido por:
$CPI={\frac {\Sigma _{i}(IC_{i})(CC_{i})}{IC}}$
Onde $IC_{i}$ é o número de instruções para um dado tipo de instrução, $CC_{i}$é o ciclo de clock para um dado tipo de instrução,$IC=\Sigma _{i}(IC_{i})$ é o contador total de instrução. O somatório soma todos os tipos de instruções para um dado processo de benchmark.

## Explicação

Vamos assumir uma pipeline RISC clássica, com as 5 etapas seguintes:
* Instruction fetch cycle (IF)
* Instruction decode/Register fetch cycle (ID)
* Execution/Effective address cycle (EX)
* Acesso à memória (MEM)
* Write-back cycle (WB)
Cada etapa requer um ciclo de clock e uma instrução passa pelas fases dos estágios seqüêncialmente. Sem pipelining, uma nova instrução é buscada na etapa 1 apenas após a instrução anterior terminar na etapa 5. Portanto, sem pipelining o número de ciclos usados para executar uma instrução é 5. Esta é a definição de CPI.
Com pipelining nós podemos melhorar o CPI explorando paralelismo ao nível de instrução. Por exemplo, e se uma instrução for buscada em cada ciclo? Nós podemos teoricamente ter 5 instruções nas 5 etapas de pipeline de uma vez (uma instrução por etapa). Neste caso, uma instrução diferente iria completar a etapa 5 em cada ciclo de clock, e portanto na média temos um ciclo de clock por instrução (CPI = 1).
Com um processador single-issue, o melhor CPI possível é 1. Porém com processadores multiple-issue, nós podemos conseguir valores de CPI ainda melhores. Por exemplo, um processador que realiza duas instruções por ciclo de clock (veja Superscalar) pode atingir um CPI de 0.5 quando duas instruções estão completando a cada ciclo de clock.

## Exemplos
### Exemplo 1

Para o multi-ciclo MIPS, existem 5 tipos de instruções:
* Load (5 ciclos)
* Store (4 ciclos)
* R-type (4 ciclos)
* Branch (3 ciclos)
* Jump (3 ciclos)
Se um programa tem:
* 50% de instruções R-type
* 15% de instruções load
* 25% de instruções store
* 8% de instruções branch
* 2% de instruções jump
então, o CPI é: 0,5*4 + 0,15*5 + 0,25*4 + 0,08*3 + 0,02*3 = 4,05

### Exemplo 2

Um processador de 400-MHz foi usado para executar um programa de benchmark com o seguinte instruction mix e contador de ciclos de clock:
| Tipo de instrução | Contador de instruções | Contador de ciclo de clock |
| Aritmética de inteiro | 45000 | 1 |
| Transferência de dados | 32000 | 2 |
| Ponto flutuante | 15000 | 2 |
| Transferência de controle | 8000 | 2 |
Determine o CPI efetivo, taxa MIPS, e tempo de execução para este programa. Total do contador de instruções = 100000
${\text{CPI}}={\frac {45000\times 1+32000\times 2+15000\times 2+8000\times 2}{100000}}={\frac {155000}{100000}}=1.55$
$400Mhz=400,000,000Hz$
Já que: $MIPS\propto 1/CPI$ and $MIPS\propto clockFrequency$
${\text{Effective processor performance}}={\text{MIPS}}={\frac {\text{clock frequency}}{\text{CPI}}}\times {\frac {1}{\text{1 Million}}}={\frac {400,000,000}{1.55\times 1000000}}={\frac {400}{1.55}}=258\,{\text{MIPS}}$
Portanto:
${\text{Execution time}}(T)={\text{CPI}}\times {\text{Instruction count}}\times {\text{clock time}}={\frac {{\text{CPI}}\times {\text{Instruction Count}}}{\text{frequency}}}={\frac {1.55\times 100000}{400\times 1000000}}={\frac {1.55}{4000}}=0.0003875\,{\text{sec}}=0.3875\,{\text{ms}}$