sexta-feira, 4 de fevereiro de 2011

3.4.12 Passos da Execução por Tradução x86

Os processadores em tradução x86 são aqueles que correm instruções x86 standard, traduzindo-as em micro-instruções RISC. Este tipo de processador é muito mais complexo devido ao trabalho extra de tradução e gestão destas micro-instruções. De certo modo funciona como pequenos computadores com multiprocessamento dentro do CPU, com código especial para gerir a alocação de tarefas às diferentes unidades de execução, mais ou menos como faz um sistema operativo de multiprocessamento quando usa mais de um processador.

Tal como na execução nativa, os passos necessários à execução das instruções varia conforme o processador. No entanto, na generalidade são os que vamos ver em seguida e é de notar que estas instruções correm sempre em pipelines:

Ø Fetch – O primeiro passo é carregar a instrução na unidade de execução. Dado que a memória é muito lenta comparada com o processador, este passo não envolve uma leitura directa da memória. Em vez disso, um circuito de controlo carrega blocos de 16 ou 32 bits de instruções ou dados, da memória directamente para uma cache primária de instruções. Estes dados estão assim disponíveis para as unidades de execução, conforme forem solicitados. Alguns processadores têm unidades de prefetch para executar esta operação.

Ø Decode – Estes processadores empregam descodificadores múltiplos, sendo cada um deles capaz de pegar nas instruções e descodificá-las em micro-instruções. Como nenhuma das instruções x86 é executada directamente, faz sentido usar descodificadores múltiplos de modo a aumentar a performance. O tempo necessário à descodificação de uma instrução depende da sua complexidade. Instruções simples podem ser descodificadas a uma média de várias por ciclo de relógio, enquanto que outras mais complexas necessitam de mais de um ciclo cada. Qualquer endereço de memória que seja necessário é igualmente gerado nesta altura.

Ø Issue/Schedule – As micro-instruções são atribuídas a uma unidade de execução. Um circuito interno optimiza esta tarefa e controla quais e para onde vão as instruções. Por vezes, esta operação denomina-se “instruction scheduling”, dado que, basicamente, é uma tarefa de agendamento de instruções, de acordo com os recursos disponíveis (unidades de execução).

Ø Execute – É aqui que as micro-instruções são executadas. Normalmente são usadas múltiplas unidades de execução para aumentar a performance, onde algumas são dedicadas somente para certas instruções. Por exemplo, operações complexas de vírgula flutuante são executadas na unidade de execução de vírgula flutuante.

Ø Retire – Dado que as micro-instruções podem ser executadas independentemente umas das outras e fora da sua ordem normal, temos que assegurar que não haverá problemas e que os resultados da execução são primeiro armazenados em locações temporárias. Uma unidade reúne os resultados das micro-instruções e assegura-se que o output é produzido correctamente, de acordo com as instruções x86 originais. A isso chama-se “retiring” as instruções.

Ø Write-back – Após a execução da instrução, é produzido um resultado, o qual é escrito num registo interno da memória de sistema. Mas como a memória de sistema é muito lenta, na realidade esse resultado é escrito num write buffer, onde é mantido até que possa ser finalmente escrito na memória de sistema ou na cache.

Sem comentários:

Enviar um comentário