Revisão Prova 3
Organização e Arquitetura de Computadores
Alysson Milanez
Unidade Lógica e Aritmética (ULA)
2
ULA
A ULA é o componente do processador responsável pela realização de operações matemáticas (aritméticas e lógicas) requeridas por instruções de máquina específicas, tais como uma instrução para adicionar o valor de um registrador em outro ou fazer uma comparação lógica entre um registrador e um operador.
3
ULA
Todos os outros elementos do computador - unidade de controle, registradores, memória, E/S - servem, principalmente, para trazer os dados a serem processados pela ULA e receber os resultados das operações efetuadas.
De certo modo, a ULA constitui o núcleo ou a essência de um computador.
4
ULA
Assim como todos os componentes eletrônicos de um computador, a ULA é baseada em dispositivos lógicos digitais simples, capazes de armazenar dígitos binários e efetuar operações simples de lógica booleana.
5
ULA
Genericamente, uma ULA é organizada de modo a possuir algumas entradas e saídas.
6
ULA
Unidade de controle
Registradores
Bits especiais
Registradores
ULA
Os dados são fornecidos à ULA em registradores e os resultados de uma operação são armazenados em registradores.
Esses registradores são áreas de armazenamento temporário dentro do processador.
A ULA pode também ativar bits especiais (flags) para indicar O resultado de uma operação.
7
ULA
Por exemplo, caso o resultado de uma operação exceda a capacidade de armazenamento de um registrador, isso é indicado atribuindo o valor 1 ao bit de overflow.
Esses bits especiais são também armazenados em registradores internos do processador. A unidade de controle fornece sinais para controlar a operação da ULA e a transferência de dados entre a ULA e os registradores.
8
ULA
Os circuitos da ULA são basicamente dedicados a:
- realizar operações de soma;
- realizar operações lógicas AND e OR;
- possuir um circuito inversor (NOT) ou de complemento;
- possuir um circuito para efetuar deslocamentos dos bits de um número; e
- realizar operações de multiplicação.
9
ULA
As operações lógicas podem testar três condições:
1. Condição de Igualdade: é o teste da condição igual a, em que é comparado se os valores determinados são iguais.
2. Condição menor que: compara dois valores para determinar se o primeiro é menor que o segundo.
3. Condição maior que: compara dois valores para determinar se o primeiro é maior que o segundo.
10
ULA
As operações matemáticas são usualmente as de adição, deslocamento, rotação e operações lógicas, todas essas realizadas sobre dois operandos; e as de complemento, que utiliza apenas um único operando.
11
ULA
Nos processadores mais antigos, o barramento interno de dados servia para interligar a ULA a um registrador especial chamado acumulador (ACC) e aos demais registradores e daí à memória principal.
12
ULA
Nos sistemas mais antigos, havia a possibilidade de utilização de dois tipos de processadores, sendo um deles exclusivo para realização de operações aritméticas com valores fracionários (ponto flutuante); tais processadores eram chamados de co-processadores matemáticos (e.g. Intel 8087 - que funcionava com o Intel 8086/8088; e o Intel 80387, que operava com o Intel 80386).
Mais detalhes desses co-processadores podem ser obtidos aqui.
13
ULA
Nos processadores mais modernos, com mais componentes, o barramento interno conduz os bits de dados de e para a memória cache L1 (e também para os demais níveis de cache, se disponíveis no dado processador), com um dos N registradores de dados e daí para a ULA que processa os valores.
14
ULA
Qualquer ULA é um conglomerado de circuitos lógicos e componentes eletrônicos simples que, integrados, realizam as operações (lógicas e aritméticas). A ULA pode ser uma parte pequena da pastilha do processador, usada em pequenos sistemas, ou pode compreender um considerável conjunto de componentes lógicos de alta velocidade, sendo que os processadores vêm utilizando em suas arquiteturas mais de uma ULA, tornando a execução mais rápida.
15
ULA
Nós podemos projetar uma ULA em três etapas. Na primeira, nós projetamos a seção aritmética. Então a seção lógica, e por fim, combinamos as duas seções para formar a ULA.
16
ULA
Já o componente para executar cálculos com números fracionários (representados em ponto flutuante), não realiza operações lógicas e seu nome, desde o Intel 486, tem sido FPU - Unidade de Ponto Flutuante (Floating Point Unit).
17
Registradores de dados
18
Registradores de dados
Para que um dado possa ser transferido para a ULA, é necessário que ele permaneça, mesmo que por um breve instante, armazenado em um registrador. Além disso, o resultado de uma operação aritmética ou lógica realizada na ULA deve ser armazenado temporariamente, de modo que possa ser reutilizado mais adiante (por outra instrução) ou apenas para ser, em seguida, transferido para a memória.
19
Registradores de dados
Mesmo no caso dos atuais processadores, que possuem uma boa quantidade de cache L1, os registradores continuam a ser importantes.
Para atender a esses propósitos, os processadores são fabricados contendo certa quantidade de registradores, destinados ao armazenamento de dados. Servindo de memória auxiliar para a ULA.
20
Registradores de dados
Os registradores de dados de alguns processadores têm uma largura igual ao tamanho estabelecido pelo fabricante para a palavra do referido processador, quando se trata de registradores para valores inteiros e que operam com a unidade de execução de cálculos de valores inteiros, enquanto possuem, em geral, o dobro da largura da palavra quando se trata de registradores para armazenar números em ponto flutuante, a serem manipulados pelas unidades de cálculo de ponto flutuante (FPU).
21
Registradores de dados
Desse modo, processadores que possuem palavra de 16 bits devem ter seus registradores de dados com largura de 16 bits, assim como aqueles que possuem palavra de 32 ou 64 bits devem ser fabricados com seus registradores de dados com largura de 32 e 64 bits, respectivamente.
22
Registradores especiais de estado
23
Registradores especiais de estado
Os principais bits de estado são:
- sinal: contém o sinal resultante da última operação aritmética realizada pelo processador.
- overflow: quando setado (= 1) indica que a última operação aritmética realizada resultou em estouro do valor, um erro.
- zero: quando setado (= 1) indica que a última operação aritmética realizada resultou no valor zero.
24
Registradores especiais de estado
- vai 1 (carry): indica que ocorreu "vai 1" para o bit mais à esquerda na última operação de soma realizada. Pode indicar, também, overflow em operações com números sem sinal.
- paridade: é setado (= 1) ou não (= 0), dependendo da quantidade de bits 1 no byte recebido.
25
Aritmética de números inteiros
26
Aritmética de números inteiros
Os dois aspectos mais importantes da aritmética computacional são o modo como os números são representados (o formato binário) e os algoritmos usados para as operações aritméticas básicas (adição, subtração, multiplicação e divisão). Isso se aplica tanto para a aritmética de números inteiros quanto para a de números de ponto flutuante.
27
Aritmética de números inteiros
Números de ponto flutuante são expressos na forma de um número (mantissa) multiplicado por uma constante (base) elevada a uma potência inteira (expoente). Eles podem ser usados para representar números muito grandes e muito pequenos.
A maioria dos processadores implementa o padrão IEEE 754 para representação e aritmética de números de ponto flutuante. Esse padrão define um formato de 32 bits e de 64 bits.
28
Negação
29
Negação
Na representação sinal-magnitude, a regra para a negação de um número inteiro é simples: basta inverter o valor do bit de sinal. Na notação em complemento de dois, a negação de um número inteiro é obtida pelos seguintes passos:
1. Tome o complemento booleano de cada bit do número (incluindo o bit de sinal), isto é, troque cada 1 por 0 e cada 0 por 1.
2. Adicione 1 ao resultado, visto como um número inteiro binário sem sinal.
30
Negação
Supomos, ao adicionar 1, que a sequência de bits representa um número inteiro sem sinal (obtido fazendo o complemento bit a bit do número original) e tratamos o resultado, então, como um número inteiro em complemento de dois. Dois casos especiais devem ser considerados. O primeiro é se A = 0.
31
Negação
Nesse caso, para uma representação de 8 bits, temos:
0 = 00000000 (complemento de dois)
complemento bit a bit = 11111111
+1
100000000 = 0
O bit "vai-um" (carry-in) com valor 1 obtido na posição mais à esquerda é ignorado. Como resultado, temos que o complemento de dois de 0 é 0, como deveria ser.
32
Negação
O segundo caso especial é mais problemático. Se negarmos o padrão de bits constituído de um bit com valor 1 seguido de n-1 bits de valor 0, obteremos esse mesmo número. Por exemplo, para uma palavra de 8 bits, temos:
-128 = 10000000
complemento de bit a bit = 01111111
+1
10000000 = -128
33
Negação
Essa anomalia não pode ser evitada. O número de padrões de bits distintos de uma palavra de n bits é 2n, que é um número par. Desejamos representar números inteiros positivos, negativos e 0.
34
Negação
Se a quantidade de números inteiros positivos e negativos que podem ser representados for a mesma (sinal-magnitude), então existirão duas representações para 0. Se existir apenas uma representação para 0 (complemento de dois), então as quantidades de números positivos e negativos que podem ser representados serão diferentes.
35
Negação
No caso da representação em complemento de dois, usando uma palavra de n-bits, haverá uma representação para o valor -2n, mas não para +2n.
36
Adição e Subtração
37
Adição e Subtração
Se o resultado da operação for positivo, será obtido um número positivo na notação binária.
Se for negativo, será obtido um número negativo em complemento de dois.
38
Adição e Subtração
O resultado de uma adição pode ter um número de bits maior do que o tamanho da palavra usada. Essa condição é denominada overflow. Quando ocorre overflow, a ULA precisa sinalizar esse fato, para que o resultado não seja usado. A detecção de overflow é feita de acordo com a seguinte regra: na adição de dois números, ambos positivos ou negativos, ocorrerá overflow somente se o resultado tiver sinal oposto.
39
Adição e Subtração
A subtração também é implementada facilmente, usando a seguinte regra: para subtrair um número S (subtraendo) de um número M (minuendo), pegue o complemento de dois (negação) de S e acrescente esse valor a M.
40
Adição e Subtração
Note que, para números com n bits, podemos subtrair um valor k positivo (ou adicionar um valor k negativo) movendo 2n - k posições no sentido horário. Note ainda que 2n - k é o complemento de dois de k.
Isso demonstra que a subtração M - S pode ser feita somando a M o complemento de dois de S.
41
Adição e Subtração
A Figura a seguir sugere os caminhos de dados e elementos de hardware necessários para efetuar a adição e a subtração. O elemento central é um somador binário (ou meio-somador), que recebe dois números e produz como resultado a soma desses números e uma indicação e overflow. O somador binário trata os dois operandos como números inteiros sem sinal. Esses dois operandos são apresentados ao somador em dois registradores, designados, nesse caso, como registradores A e B.
42
Adição e Subtração
O resultado pode ser armazenado em um desses registradores ou em um terceiro. A ocorrência de overflow é indicada por um bit de overflow (0 = não ocorreu overflow; 1 = ocorreu overflow). Na operação de subtração, o subtraendo (registrador B) é passado por um circuito que calcula seu complemento de dois, sendo esse valor, então, passado para o somador.
43
Adição e Subtração
44
Multiplicação
45
Multiplicação: inteiros sem sinal
Algumas observações importantes a serem feitas:
1. A multiplicação envolve a geração de produtos parciais, um para cada dígito do multiplicador. Esses produtos parciais são somados para a obtenção do produto final.
2. Os produtos parciais são determinados facilmente. Quando o bit do multiplicador é 0, o produto parcial é 0. Quando é 1, o produto parcial é o próprio multiplicando.
46
Multiplicação: inteiros sem sinal
3. O produto total é obtido somando-se os produtos parciais. Para isso, cada produto parcial sucessivo é deslocado um dígito para a esquerda, em relação ao produto parcial anterior.
4. A multiplicação de números inteiros binários de n bits resulta em um produto com até 2n bits de comprimento.
47
Multiplicação: inteiros sem sinal
Multiplicações podem ser feitas de modo mais eficiente do que na forma usual, em que são feitas usando-se lápis e papel. Primeiro, podemos acumular imediatamente cada produto parcial obtido, em vez de esperar o cálculo de todos os produtos parciais. Isso elimina a necessidade de armazenar todos os produtos parciais; é preciso, dessa maneira, um número menor de registradores.
48
Multiplicação: inteiros sem sinal
Segundo, podemos poupar algum tempo na geração de produtos parciais. Para cada 1 no multiplicador, é necessário realizar uma operação de soma e um deslocamento; para cada 0, apenas um deslocamento é necessário.
49
Multiplicação: inteiros sem sinal
A figura mostra uma implementação possível que emprega essas idéias.
O multiplicador e o multiplicando são carregados em dois registradores (Q e M).
50
Multiplicação: inteiros sem sinal
Também é necessário um terceiro registrador, o registrador A, que é inicializado com valor 0. Existe ainda um registrador C, de 1 bit, inicializado com 0, que contém um potencial bit 'vai-um' resultante da adição.
A operação do multiplicador se dá como a seguir. A lógica de controle lê os bits do multiplicador, um de cada vez.
51
Multiplicação: inteiros sem sinal
Se Q0 for 1, o multiplicador será adicionado ao registrador A e o resultado, armazenado nesse registrador, sendo o bit C usado para indicar a ocorrência de overflow. Então, todos os bits dos registradores C, A e Q são deslocados um bit para a direita, de modo que o bit C vá para An-1, A0 vá para Qn-1 e Q0 seja perdido.
52
Multiplicação: inteiros sem sinal
Se Q0 é 0, então nenhuma adição é efetuada, sendo feito apenas o deslocamento dos bits. Esse processo é repetido para cada bit do multiplicador original. O produto de 2n bits resultante estará contido nos registradores A e Q.
53
Multiplicação: números em complemento de 2
Vimos que é possível fazer adição e subtração de números na notação em complemento de dois tratando-os como números inteiros sem sinal. Considere o seguinte:
1001
+ 0011
1100
54
Multiplicação: números em complemento de 2
Se esses números forem considerados números inteiros sem sinal, então estaremos fazendo a adição 9 (1001) mais 3 (0011) para obter 12 (1100).
Como os números são representados em complementos de dois, estamos de fato fazendo a adição -7 (1001) mais 3 (0011) e obtendo -4 (1100).
55
Multiplicação: números em complemento de 2
Infelizmente, esse esquema simples não funciona para a multiplicação. Para mostrar isso, consideramos novamente a multiplicação de 11 (1011) por 13 (1101), obtendo 143 (10001111).
Se interpretarmos esses números como números em complemento de dois, teremos -5 (1011) vezes -3 (1101), que é igual a -113 (10001111).
56
Multiplicação: números em complemento de 2
Esse exemplo nos mostra que a multiplicação direta não funciona se o multiplicando e o multiplicador são negativos. De fato, ela não funciona nos casos em que o multiplicando ou o multiplicador é negativo.
Lembre-se de que qualquer número binário sem sinal pode ser expresso como uma soma de potências de 2.
A multiplicação de um número binário por 2n é feita deslocando esse número n bits para a esquerda.
57
Multiplicação: números em complemento de 2
Os produtos parciais devem ser vistos como números de 2n bits, gerados a partir de um multiplicando de n bits. Dessa maneira, o multiplicando 1011 de 4 bits é armazenado como um número inteiro sem sinal em uma palavra de 8 bits, ou seja, como 00001011. Cada produto parcial (exceto o correspondente a 20) é constituído desse número deslocado para a esquerda, com as posições não ocupadas à direita preenchidas com zeros (por exemplo, um deslocamento para a esquerda de duas posições produz 00101100).
58
Multiplicação: números em complemento de 2
Podemos agora ver que a multiplicação direta não funciona no caso em que o multiplicando é negativo. O problema é que cada contribuição do multiplicando negativo como produto parcial deve ser um número negativo de 2n bits; os bits de sinal dos produtos parciais devem ser alinhados. Se esses números são tratados como números inteiros sem sinal, a multiplicação 9 x 3 = 27 prossegue da forma usual.
59
Multiplicação: números em complemento de 2
No entanto, se 1001 for interpretado como o número em complemento de dois que representa o valor -7, então cada produto parcial deverá ser um número negativo, em complemento de dois, de 2n (8) bits. Isso pode ser feito estendendo cada produto parcial para a esquerda, com bits de valor 1.
60
Multiplicação: números em complemento de 2
1001 (-7)
x 0011 (3)
11111001 (-7) x 20 = (-7)
11110010 (-7) x 21 = (-14)
11101011 (-21)
61
Multiplicação: números em complemento de 2
É fácil perceber que a multiplicação direta também não funciona se o multiplicador é negativo. A razão é que, nesse caso, os bits do multiplicador não correspondem aos deslocamentos e às multiplicações que devem ocorrer. Por exemplo, considere o número decimal -3, escrito em complemento de dois com 4 bits como 1101. Se calcularmos os produtos parciais simplesmente com base no valor de cada posição de bit, obteremos a seguinte correspondência:
1101 <-> -(1*23 + 1*22+ 0*21 + 1*20) = - (23 + 22+ 20)
62
Multiplicação: números em complemento de 2
Na realidade o que se deseja obter é: -(21 + 20). Portanto, o multiplicador não pode ser usado diretamente da maneira como descrevemos.
Existem diversas soluções possíveis para esse dilema. Uma delas seria converter o multiplicador e o multiplicando para números positivos, efetuar a multiplicação e, então, caso o sinal dos dois números originais seja diferente, tomar o complemento de dois do resultado.
63
Multiplicação: números em complemento de 2
Os projetistas têm preferido usar técnicas que não requeiram esse passo final de transformação. Um dos algoritmos mais usados é o algoritmo de Booth. Esse algoritmo tem também a vantagem de efetuar a multiplicação de maneira mais rápida do que em uma abordagem mais direta.
64
Algoritmo de Booth
65
Multiplicação: números em complemento de 2
Descrição do algoritmo de Booth: multiplicador e multiplicando são armazenados nos registradores Q e M, respectivamente. Existe também um registrador de 1 bit, posicionado logicamente à direita do bit menos significativo (Q0) do registrador Q é designado como Q-1, cujo uso é explicado a seguir. O resultado da multiplicação é dado nos registradores A e Q. A e Q-1 são inicializados com valor 0. Como antes, a lógica de controle examina os bits do multiplicador, um de cada vez.
66
Multiplicação: números em complemento de 2
Quando cada bit é examinado, também é examinado o bit à sua direita. Se esses dois bits forem iguais (1-1 ou 0-0), então todos os bits dos registradores A, Q e Q-1 serão deslocados 1 bit para a direita. Se eles forem diferentes, o multiplicando será somado ou subtraído do registrador A, dependendo se os dois bits são 0-1 ou 1-0, respectivamente.
67
Multiplicação: números em complemento de 2
Após essa operação de adição ou subtração, ocorre o deslocamento de um bit para a direita, que é feito de tal maneira que o bit mais à esquerda de A, denominado An-1, é deslocado para An-2, mas também permanece em An-1. Isso é necessário para preservar o sinal do número armazenado em A e Q. Esse deslocamento é conhecido como deslocamento aritmético, porque preserva o bit de sinal.
68
Multiplicação: números em complemento de 2
O algoritmo de Booth funciona com qualquer combinação de números positivos e negativos. Além disso, o algoritmo é eficiente: blocos de 1s e 0s são ignorados, sendo feita, em média, apenas uma adição ou subtração por bloco.
Por que o algoritmo funciona?
69
Multiplicação: números em complemento de 2
Consideremos o caso em que o multiplicador é positivo. Suponhamos que o multiplicador seja constituído de um bloco de 1s cercado por 0s (e.g. 00011110). Como sabemos, a multiplicação pode ser feita somando-se cópias deslocadas do multiplicando:
M x (00011110) = M x (24 + 23 + 22 + 21)
= M x (16 + 8 + 4 + 2)
= M x 30
70
Multiplicação: números em complemento de 2
O número de operações requerido pode ser reduzido para dois se observarmos o seguinte:
2n + 2n-1 + … + 2n-K = 2n+1 - 2n-K
Logo:
M x (00011110) = M x (25 - 21)
= M x (32 - 2)
= M x 30
71
Multiplicação: números em complemento de 2
Assim, o produto pode ser gerado efetuando-se apenas uma adição e uma subtração do multiplicando. Esse esquema pode ser estendido para qualquer número de blocos de 1s do multiplicador, incluindo o caso em que o bloco tem um único 1.
O algoritmo de Booth opera de acordo com esse esquema, efetuando uma subtração quando é encontrado o primeiro 1 de um bloco (1 - 0) e uma adição quando é encontrado o fim do bloco (0 - 1).
72
Multiplicação: números em complemento de 2
Para mostrar que esse esquema também funciona se o multiplicador for negativo, observe o seguinte. Seja X um número negativo na notação em complemento de dois:
Representação de X = {1xn-2xn-3...x1x0}
Então X pode ser expresso como:
X = -2n-1 + (xn-2*2n-2) + (xn-3*2n-3) + … + (x1*21) + (x0*20)
73
Multiplicação: números em complemento de 2
O bit mais à esquerda de X é 1, uma vez que X é negativo. Suponha que o bit de valor 0, mais à esquerda, esteja na posição k. Então, X é da forma:
Representação de X = {111...10xk-1xk-2...x1x0}
E o valor de X é:
X = -2n-1 + 2n-2 + … 2k+1 + (xk-1*2k-1) + … + (x0*20)
74
Multiplicação: números em complemento de 2
Obtemos que:
2n-2 + … 2k+1 = 2n-1 - 2k+1
Reordenando os termos:
- 2n-1 + 2n-2 + … 2k+1 = - 2k+1
Substituindo: X = -2k+1 + (xk-1*2k-1) + … + (x0*20)
75
Multiplicação: números em complemento de 2
Retornando ao algoritmo de Booth: Tendo em vista a representação de X, todos os bits desde x0 até o bit de valor 0 mais à esquerda são manipulados de maneira adequada, exceto (-2k+1), e assim estão na forma correta. À medida que o algoritmo examina o bit 0 mais à esquerda e encontra o próximo 1 (2k+1), ocorre uma transição 1 - 0 e é realizada uma subtração (-2k+1).
76
Multiplicação: números em complemento de 2
O algoritmo de Booth efetua uma subtração quando o primeiro 1 é encontrado (1 - 0), uma adição quando é encontrada uma transição (0 - 1) e, finalmente, outra subtração quando o primeiro 1 do próximo bloco de 1s é encontrado. Portanto, o algoritmo de Booth efetua menos adições e subtrações do que um algoritmo mais direto.
77
Divisão
78
Divisão
A divisão é, de certa maneira, mais complexa que a multiplicação, embora seja baseada nos mesmos princípios gerais. Como antes, a base para o algoritmo é a abordagem usada ao efetuar a operação com lápis e papel, e a operação envolve repetidas execuções de adição, subtração e deslocamento.
79
Divisão: processo
Primeiramente, os bits do dividendo são examinados, da esquerda para a direita, até que se obtenha um conjunto de bits que represente um número maior ou igual ao divisor. Quando esse número é encontrado, diz-se que o divisor divide o número. Enquanto isso não ocorre, são introduzidos 0s no quociente, da esquerda para a direita. Quando esse evento ocorre, é colocado um 1 no quociente e o divisor é subtraído do dividendo parcial.
80
Divisão: processo
O resultado é conhecido como resto parcial. Desse ponto em diante, a divisão segue um padrão cíclico. A cada ciclo, bits adicionais do dividendo são anexados ao resto parcial, até que o resultado seja maior ou igual ao divisor. Como antes, o divisor é subtraído desse número, para produzir um novo resto parcial. O processo continua até que todos os bits do dividendo tenham sido examinados.
81
Algoritmo
Divisão de números binários sem sinal.
82
Divisão
Esse processo pode, com alguma dificuldade, ser estendido para números negativos. Uma possível abordagem para números em complemento de dois é apresentada a seguir. O algoritmo pode ser descrito como:
1. Carregar o divisor no registrador M e o dividendo nos registradores A e Q. O dividendo deve ser expresso como um número em complemento de dois com 2n bits. Por exemplo, o número 0111 de 4 bits seria 00000111.
83
Divisão
2. Deslocar o conteúdo dos registradores A e Q, juntos, um bit para a esquerda.
3. Se M e A têm o mesmo sinal, fazer A = A - M; caso contrário, A = A + M.
4. A operação anterior será bem-sucedida se o sinal de A for o mesmo, antes e depois da operação.
84
Divisão
4. a) Se a operação for bem-sucedida ou se (A == 0 e Q == 0), então faça Q0 = 1.
4. b) Se a operação não for bem-sucedida e se (A != 0 ou Q != 0), então faça Q0 = 0 e restaure o antigo valor de A (somando M a A).
5. Repita os passos 2 a 4 enquanto houver bits a examinar em Q.
85
Divisão
Ao final, o resto estará em A. Se o divisor e o dividendo tiverem o mesmo sinal, o quociente estará em Q; caso contrário, o quociente correto é o complemento de dois do número armazenado em Q.
86
Aritmética de números ponto flutuante
87
Aritmética de números ponto flutuante
Nas operações de adição e subtração, é necessário assegurar que os dois operandos tenham o mesmo valor de expoente, o que pode requerer o deslocamento da vírgula fracionária em um dos operandos para se obter o alinhamento apropriado.
A multiplicação e a divisão são mais diretas.
88
Aritmética de números ponto flutuante
Alguns problemas podem ocorrer como resultado dessas operações:
- Overflow no expoente: um expoente positivo excede o maior valor possível para um expoente. Em alguns sistemas, isso pode ser designado como +∞ ou -∞.
- Underflow no expoente: um expoente negativo é menor que o menor valor possível para um expoente. Isso significa que o número é muito pequeno para ser representado e pode ser tratado como sendo 0.
89
Aritmética de números ponto flutuante
- Underflow na mantissa: no processo de alinhamento das mantissas, pode ocorrer o transbordo de dígitos para fora da extremidade da direita da mantissa. Isso requer alguma forma de arredondamento.
- Overflow na mantissa: a adição de duas mantissas de mesmo sinal pode resultar em um 'vai-um' do bit mais significativo. Isso pode ser corrigido com um novo alinhamento do número.
90
Adição e subtração
91
Adição e subtração
O algoritmo de adição e de subtração tem quatro fases básicas:
- Verificar se algum operando é zero.
- Alinhar as mantissas.
- Adicionar ou subtrair as mantissas.
- Normalizar o resultado.
92
93
Um fluxograma típico das operações.
Adição e subtração
Uma descrição passo a passo realça as principais funções requeridas na adição e na subtração de números de ponto flutuante. Considere um formato semelhante a X = Xs * BXE.
Em uma operação de adição ou subtração, os dois operandos devem ser armazenados em registradores usados pela ULA.
94
Adição e subtração
Se o formato de ponto flutuante inclui um bit de mantissa implícito, esse bit deve ser tornado explícito no momento de efetuar a operação.
Como a adição e a subtração são idênticas, exceto por uma mudança de sinal, o processo começa pela mudança de sinal do subtraendo, caso a operação seja uma subtração. A seguir, se o operando for 0, o resultado será o valor do outro operando.
95
Adição e subtração
O alinhamento pode ser obtido tanto deslocando o número menor para a direita (aumentando seu expoente) quanto deslocando o número maior para a esquerda.
Como ambas as operações podem resultar em perda de dígitos, o deslocamento é efetuado no número de menor expoente; qualquer dígito perdido tem, portanto, um valor relativamente menor.
96
Adição e subtração
O alinhamento é feito deslocando os dígitos da mantissa para a direita e incrementando o expoente, repetidamente, até que os dois expoentes sejam iguais. (Note que, se a base implícita for 16, o deslocamento de um dígito para a direita corresponderá a um deslocamento para a direita de 4 bits.)
97
Adição e subtração
Caso esse processo resulte em valor 0 na mantissa, o resultado da operação é o outro número. Portanto, se os dois números tiverem expoentes que diferem significativamente, o menor número será perdido.
98
Adição e subtração
Em seguida, as duas mantissas são somadas, levando em conta seus sinais. Como os sinais podem ser diferentes, o resultado pode ser 0. Também existe a possibilidade de ocorrer overflow na mantissa por um dígito. Nesse caso, a mantissa do resultado é deslocada para a direita e o expoente é incrementado. Essa operação pode resultar em overflow no expoente, o que termina a operação, sendo reportado um erro.
99
Adição e subtração
A fase seguinte normaliza o resultado. A normalização consiste em deslocar os dígitos da mantissa para a esquerda, até que o dígito mais significativo (1 bit ou 4 bits, se a base for 16) seja diferente de zero. A cada deslocamento, o expoente é decrementado, podendo, portanto, ocorrer underflow no expoente. Finalmente, o resultado deve ser arredondado e, então, é reportado.
100
Multiplicação e divisão
101
Multiplicação e divisão
A multiplicação e a divisão de ponto flutuante são operações muito mais simples do que a adição e a subtração.
Em princípio, consideramos a multiplicação.
102
103
Multiplicação e divisão
Primeiramente, se qualquer dos operandos for 0, o resultado será 0. O próximo passo é somar os expoentes. Se os expoentes forem armazenados na forma polarizada, a soma dos expoentes dobrará a polarização. Portanto, o valor da polarização deve ser subtraído da soma dos expoentes. Poderá então ocorrer tanto overflow quanto underflow no expoente, o que termina o algoritmo, sendo reportado um erro.
104
Multiplicação e divisão
Se o expoente do produto estiver dentro da faixa de números representáveis, o passo seguinte será multiplicar as mantissas, levando em conta seus sinais.
A multiplicação é feita do mesmo modo que para números inteiros. Nesse caso, estamos tratando de uma representação sinal-magnitude, mas os detalhes são semelhantes aos da operação sobre números em complemento de dois.
105
Multiplicação e divisão
O produto terá o dobro do comprimento do multiplicando e do multiplicador. Bits extras são perdidos com o arredondamento.
Depois de calculado o produto, o resultado é então normalizado e arredondado, tal como é feito na adição e na subtração. A normalização pode resultar em um underflow no expoente.
106
Consideremos agora o fluxograma para a divisão.
107
Multiplicação e divisão
O primeiro passo também é testar se algum dos operandos é 0. Caso o divisor seja 0, é reportado um erro ou o resultado é a representação de infinito, dependendo da implementação.
Caso o dividendo seja 0, o resultado será 0. Se não ocorrer nenhum desses casos, no passo seguinte, o expoente do divisor será subtraído do expoente do dividendo.
108
Multiplicação e divisão
Isso remove a polarização, que deve, portanto, ser adicionada ao resultado. Em seguida, são efetuados testes de overflow e underflow no expoente.
O passo seguinte é dividir as mantissas. Esse passo é seguido pela normalização e pelo arredondamento do resultado.
109
Considerações de precisão
110
Arredondamento
Outro detalhe que afeta a precisão do resultado é a política de arredondamento. O resultado de qualquer operação sobre as mantissas geralmente é armazenado em um registrador de tamanho maior. Quando o resultado é colocado novamente no formato de ponto flutuante, os bits extras devem ser descartados.
111
Arredondamento
Diversas técnicas para arredondamento foram exploradas. De fato, o padrão IEEE relaciona quatro abordagens alternativas:
- Arredondar para o mais próximo: o resultado é arredondado para o número representável mais próximo.
- Arredondar para cima (+∞): o resultado é arredondado para cima, na direção de infinito positivo.
112
Arredondamento
- Arredondar para baixo (-∞): o resultado é arredondado para baixo, na direção de infinito negativo.
- Arredondar para 0: o resultado é arredondado na direção de zero.
113
Arredondamento
O modo padrão de arredondamento é arredondar para o mais próximo, que é definido como a seguir: o resultado é o valor representável mais próximo do resultado com precisão infinita. Se existirem dois valores representáveis igualmente próximos, o resultado será aquele cujo bit menos significativo for igual a 0.
114
Arredondamento
Por exemplo, se os bits extras, além dos 23 que podem ser armazenados, forem 10010, então esses bits extras totalizarão mais que a metade da última posição de bit representável. Nesse caso, a resposta correta é obtida adicionando 1 ao último bit representável, isto é, arredondando para cima, para o número representável imediatamente maior. Suponha agora que os bits extras sejam 01111.
115
Arredondamento
Nesse caso, os bits extras totalizam menos que a metade da última posição de bit representável. A resposta correta é obtida simplesmente ignorando os bits extras (truncando), ou seja, arredondando para baixo, para o número representável imediatamente inferior.
116
Arredondamento
O padrão também considera o caso especial em que os bits extras são da forma 10000... Aqui, o resultado está exatamente no meio de dois valores representáveis. Uma técnica possível nesse caso seria truncar sempre, uma vez que essa operação é a mais simples.
117
Arredondamento
No entanto, o problema dessa abordagem é que ela introduz uma polarização pequena, porém cumulativa, ao longo de uma sequência de computações. O que é necessário é um método de arredondamento não-polarizado.
118
Arredondamento
Uma abordagem possível seria arredondar para cima ou para baixo, conforme um número aleatório, de modo que, em média, o resultado seria não-polarizado. O argumento contra essa abordagem é que ela não apresenta resultados previsíveis, determinísticos.
119
Arredondamento
A abordagem adotada pelo padrão IEEE é forçar que o resultado seja par: se o resultado de uma computação está exatamente no meio de dois números representáveis, o valor é arredondado para cima, caso o último bit representável seja 1, e será truncado, se o último bit for 0.
120
Arredondamento
As duas opções seguintes, arredondar para infinito positivo ou negativo, são úteis na implementação de uma técnica conhecida como aritmética intervalar. A aritmética intervalar fornece um método para monitorar e controlar erros em computações de ponto flutuante, produzindo dois valores para cada resultado. Os dois valores correspondem aos limites inferior e superior de um intervalo que contém o resultado verdadeiro.
121
Arredondamento
A largura do intervalo, isto é, a diferença entre o limite inferior e o limite superior, indica a precisão do resultado. Se os limites do intervalo não forem representáveis, então, os limites inferior e superior serão arredondados para baixo e para cima, respectivamente. Embora a largura do intervalo possa variar de acordo com a implementação, muitos algoritmos são projetados para produzir intervalos pequenos.
122
Arredondamento
Se a faixa de valores entre os limites do intervalo for suficientemente pequena, então o resultado obtido será suficientemente preciso. Caso contrário, esse fato ao menos é conhecido e análises adicionais podem ser efetuadas.
123
Arredondamento
A última técnica especificada no padrão é arredondar para zero. De fato, isso consiste simplesmente em truncar o número: os bits extras são ignorados. Essa é, certamente, a técnica mais simples. No entanto, o resultado é que a magnitude dos valores truncados é sempre menor ou igual ao valor original mais preciso, o que introduz uma constante polarização em direção a zero na operação.
124
Arredondamento
Essa polarização é mais séria do que a que foi discutida anteriormente, pois afeta todas as operações em que existam bits extras diferentes de zero.
125
Padrão IEEE para aritmética de números binários de ponto flutuante
O padrão IEEE 754 vai além da simples definição de um formato, delineando também práticas e procedimentos específicos para que a aritmética de ponto flutuante produza resultados uniformes, previsíveis e independentes da plataforma de hardware.
126
Padrão IEEE para aritmética de números binários de ponto flutuante
Infinito
A aritmética de infinito é tratada como caso-limite da aritmética real, com valores infinitos com a seguinte interpretação:
-∞ < (cada número finito) < +∞
127
Padrão IEEE para aritmética de números binários de ponto flutuante
Com exceção dos casos especiais discutidos a seguir, qualquer operação aritmética envolvendo infinito produz o resultado óbvio.
128
Padrão IEEE para aritmética de números binários de ponto flutuante
NaN silencioso e NaN sinalizador
Um NaN é uma entidade simbólica, codificada no formato de números de ponto flutuante, que pode ser de dois tipos: sinalizador ou silencioso. Um NaN sinalizador (signaling NaN) gera uma exceção de operação inválida sempre que é usado como operando.
129
Padrão IEEE para aritmética de números binários de ponto flutuante
NaN silencioso e NaN sinalizador
Esses NaNs fornecem valores para variáveis não inicializadas e para extensões aritméticas não submetidas ao padrão. Um NaN silencioso (quiet NaN) se propaga por meio de quase toda operação aritmética sem gerar uma exceção.
130
Padrão IEEE para aritmética de números binários de ponto flutuante
Ambos os tipos de NaN têm o mesmo formato geral: o campo de expoente preenchido totalmente com uns e uma fração diferente de zero. O padrão de bits real da fração (diferente de zero) é dependente de implementação. Os valores armazenados na fração podem ser usados para distinguir NaNs silenciosos e NaNs sinalizadores, além de especificar condições de exceção particulares.
131
Padrão IEEE para aritmética de números binários de ponto flutuante
Números não-normalizados
Números não-normalizados são incluídos no padrão IEEE 754 para manipular casos de underflow de expoente.
132
Padrão IEEE para aritmética de números binários de ponto flutuante
O uso de números não-normalizados é conhecido como underflow gradual. Sem o uso de números não-normalizados, o buraco entre o menor número não nulo representável e o zero é muito mais largo que o buraco entre o menor número não nulo representável e o número imediatamente maior.
133
Padrão IEEE para aritmética de números binários de ponto flutuante
O underflow gradual preenche esse buraco, reduzindo o impacto do underflow de expoente a um nível comparável ao do arredondamento de números normalizados.
134
Referências + Materiais extra
135
Vídeo aulas úteis
136
Livro referência
W. Stallings. Arquitetura e Organização de Computadores. SP. Prentice Hall. (2002).
Capítulo 8.
137
Função Controle
138
Função controle
A área de controle de um processador é a parte funcional que realiza as atividades de:
- busca da instrução que será executada, armazenando-a em um registrador especialmente projetado para esta finalidade;
139
Função controle
- interpretação das ações a serem desencadeadas com a execução da instrução (se é uma soma, uma subtração, uma complementação etc. e como realizá-la). Estas duas etapas compõem o que se denomina ciclo de busca da instrução (fetch cycle);
140
Função controle
- geração dos sinais de controle apropriados para ativação das atividades requeridas para a executada propriamente dita da instrução identificada. Esses sinais de controle são enviados aos diversos componentes do sistema, sejam internos do processador (como a ULA) ou externos (como a memória ou E/S). Esta etapa é denominada ciclo de execução da instrução (execute cycle).
141
Função controle
A área de controle é projetada para entender o que fazer, como fazer e comandar quem vai fazer no momento adequado.
142
Função controle
Os dispositivos básicos que fazem parte da área funcional de controle são:
1. Unidade de controle - UC;
2. relógio ou clock;
3. registrador de instrução - IR;
4. contador de instrução - PC;
5. decodificador de instrução;
6. registrador de dados da memória - MBR e registradores de endereço de memória - MAR.
143
Função controle
É importante ressaltar que a organização dos componentes e o funcionamento básico da área de controle constituem a microarquitetura dos processadores.
144
Unidade de controle
145
Unidade de controle
A unidade de controle é o dispositivo mais complexo do processador. Ele possui a lógica necessária para realizar a movimentação de dados e de instruções de e para o processador, através dos sinais de controle que emite em instantes de tempo determinados conforme uma programação prévia.
146
Unidade de controle
A UC se conecta a todos os principais elementos do processador e ao barramento externo de controle.
Os sinais de controle emitidos pela UC ocorrem em vários instantes durante o período de realização de um ciclo de instrução e, de modo geral, todos possuem uma duração fixa e igual, originada em um gerador de sinais denominado relógio (clock).
147
Unidade de controle
Os micro eventos (ou micro operações) comandados pelo funcionamento da UC podem ser iniciados segundo um de dois princípios de organização de processadores:
- por microprogramação; ou
- por programação prévia diretamente no hardware.
148
Unidade de controle
Assim, o início de um ciclo de instrução consiste na busca (fetch) da referida instrução, trazendo uma cópia dela da memória principal (ou cache) para o processador (armazenando no IR - registrador de instrução).
Para efetivar esta ação são realizadas algumas ações menores que, em conjunto, constituem a desejada transferência (constituem os passos de um ciclo de leitura).
149
Unidade de controle
Tais operações menores denominam-se microoperações, por se constituírem na menor parte individualmente executável pelo processador.
150
Unidade de controle
Cada micro operação é realizada por iniciativa de um pulso originado na UC em decorrência de uma prévia programação (diretamente no hardware ou pela execução de uma microinstrução, se a arquitetura do processador é microprogramada).
151
Unidade de controle
Uma outra característica de funcionamento dos sistemas de computação na área de controle, mais especificamente com relação à Unidade de Controle, diz respeito ao modo pelo qual o sistema conduz a execução das instruções, levando a diversos tipos de arquitetura de processadores, tais como:
1. processadores que executam instruções de modo exclusivamente sequencial ou serial (SISD);
152
Unidade de controle
2. processadores que executam instruções de modo concorrente, ou tipo pipeline;
3. processadores que executam várias instruções simultaneamente (processamento paralelo);
4. processadores que realizam processamento vetorial.
153
O relógio
154
O relógio
Dado que os processadores são constituídos na sua menor parte por circuitos digitais, que mudam de estado (de um valor para outro) milhões de vezes por segundo e que para executarem as tarefas determinadas de acordo com uma programação prévia precisam estar sincronizados, usa-se nos computadores um dispositivo com essa finalidade de sincronização: o relógio (ou clock).
155
O relógio
Serve para sincronizar - permitir que duas ou mais ações ocorram no mesmo instante de tempo (no mesmo ponto de um pulso) e cadenciar as ações (ou atividades ou micro operações) realizadas em um determinado dispositivo; cadenciar: controlar a velocidade com que as ações ocorrem.
156
O relógio
O relógio pode ser entendido como um dispositivo de controle; ele é como um maestro de uma orquestra, que sincroniza e cadencia a ação dos músicos.
157
O relógio
Na figura, observamos os seguintes elementos:
- ciclo do relógio ou simplesmente ciclo (clock cycle ou cycle): é o intervalo de tempo entre o início da subida (ou descida) de um pulso até o início da subida (ou descida) do outro pulso;
158
O relógio
- período (cycle time ou period): intervalo de tempo gasto para se obter um ciclo do sinal do relógio. Medido em unidades de tempo, usualmente de nanosegundos, ns.
159
O relógio
- lado de subida (rising edge): é a parte do pulso que realiza a transição do valor baixo para o valor alto.
- tempo de subida (rising time): é o período de tempo gasto pelo sinal para realizar toda a subida. Medido em unidades de tempo, usualmente de nanosegundos.
160
O relógio
- lado de descida (falling edge): é a parte do pulso que realiza a transição do valor alto para o valor baixo.
- tempo de descida (falling time): é o período de tempo gasto pelo sinal para realizar toda a descida. Medido em unidades de tempo, usualmente de nanosegundos.
161
O relógio
- frequência (frequency ou clock rate): é a quantidade de ciclos por segundo de um relógio. Ela é o inverso do período e vice-versa, sendo usualmente medida em Hertz (Hz), onde 1 Hz = 1 ciclo/s.
162
O relógio
Como as taxas de pulos ou velocidades dos relógios dos processadores são muito elevadas, usam-se múltiplos do Hz:
1000 Hz = 1 kHz
1000 kHz = 1.000.000 = 1 MHz
1000 MHz = 1.000.000.000 = 1 GHz
163
O relógio
Como o período é o inverso da frequência e vice-versa:
Se F = 1 GHz (velocidade do relógio do processador), então P = 1/F = 1/1.000.000.000 = 1*10-9 = 1 ns.
Se P = 1.25 ns, então F = ?
164
O relógio
O ciclo de relógio está relacionado à realização de uma operação elementar, durante o ciclo de uma instrução. No entanto, mesmo esta operação elementar não se realiza em um só passo e, por essa razão, costuma-se dividir o ciclo de máquina em subciclos, defasados no tempo, de modo que cada um aciona um passo diferente da operação elementar.
165
O relógio
Esses passos de uma operação elementar são denominados micro operações.
A base de operação de qualquer relógio é um cristal de quartzo que gera pulsos, acionado por um oscilador. Quando acionado eletronicamente pelo oscilador, o quartzo produz seus pulsos, que variam em frequência de acordo com o corte do cristal.
166
O relógio
Cada micro operação é realizada em um instante de tempo. Esses instantes de tempo são originados no relógio.
Se as operações para realizar um ciclo de instrução, duram o tempo definido por um ou mais pulsos do relógio, e se estes pulsos tiverem curta duração, mais operações podem ser realizadas na mesma unidade de tempo.
167
O relógio
O período-base utilizado é o segundo, ciclos por segundo, milhões de instruções por segundo, ou MIPS ou milhões de operações ponto flutuante por segundo, MFlops.
168
O relógio
A frequência do relógio do processador é uma das características mais conhecida dos usuários. Ela pode ser considerada um indicador de desempenho menos técnico para leigos.
Contudo, não é totalmente verdade que um processador com maior velocidade de relógio será mais eficiente que um com velocidade menor.
169
Registrador de Instrução - IR
É o registrador que tem a função específica de armazenar a instrução a ser executada pelo processador. Ao se iniciar um ciclo de instrução, a UC emite sinais de controle em sequência no tempo, de modo que se processe a realização de um ciclo de leitura para buscar a instrução na memória.
170
Registrador de Instrução - IR
Conforme definido na programação do ciclo de busca de um ciclo de instrução, ao término deste ciclo de leitura a instrução desejada será armazenada no IR, via barramento externo de dados, barramento interno e RDM.
171
Registrador de Instrução - IR
Antigamente, os eventos se passavam ligeiramente diferente e o IR de fato armazenava uma parte da instrução, denominada código da operação. Atualmente, o processo é ainda mais complexo, devido a necessidades de desempenho, com maiores velocidades e pipeline, usando-se buffers para armazenar instruções em fila antes mesmo de sua execução.
172
Contador de Instrução - PC
É o registrador que armazena o endereço da próxima instrução a ser executada. Assim que a instrução que vai ser executada é buscada, o sistema automaticamente efetiva a modificação do conteúdo do PC para que ele passe a armazenar a próxima instrução.
173
Contador de Instrução - PC
Por isso, define-se a função do PC como "armazenar o endereço da próxima instrução"; na realidade, durante boa parte da realização de um ciclo de instrução o PC já contém o endereço da próxima instrução.
174
Contador de Instrução - PC
O PC é um registrador de suma importância para o processo de controle e sequenciamento da execução dos programas.
Como esse registrador armazena o endereço da instrução que será buscada em sequência na memória para a execução do próximo ciclo de instrução, o hardware não tem controle sobre qual instrução deverá ser executada; ele simplesmente busca a instrução cujo endereço encontra-se no PC.
175
Contador de Instrução - PC
Assim, a alteração de seu conteúdo define a próxima instrução, cujo ciclo será executado, seja ela a instrução em sequência no mesmo programa, seja uma outra instrução fora de sequência no mesmo programa ou mesmo podendo ser uma instrução de outro programa.
176
Contador de Instrução - PC
Possibilidades de alterar o conteúdo do PC:
1. Sistematicamente, por meio de incremento automático - realizado pelo hardware;
177
Contador de Instrução - PC
2. Sempre que o sistema precisa reinicializar (ou iniciar-se), o hardware é programado para inserir no PC o endereço da primeira instrução do programa de inicialização - o que dispara o processo de inicialização;
178
Contador de Instrução - PC
3. Eventualmente, por meio de instruções de desvio, quando se usa um comando de desvio em um programa ou quando o sistema operacional decide mudar de programa em execução.
179
Decodificador de Instrução
É usado para identificar qual operação será realizada, de acordo com a instrução que foi decodificada. Em outras palavras, cada instrução é uma ordem para que o processador realize uma dada operação.
180
Decodificador de Instrução
Como são muitas instruções, é necessário que cada uma possua uma identificação própria e única (como os nossos CPFs). A unidade de controle está, por sua vez, preparada para sinalizar de modo adequado aos diversos dispositivos do processador, conforme ela tenha identificado a instrução a ser executada.
181
Decodificador de Instrução
O decodificador recebe como entrada um conjunto de bits escolhido e específico para identificar uma instrução de máquina e possui 2N saídas, sendo N a quantidade de algarismos binários do valor de entrada.
182
RDM e REM
RDM - registrador de dados de memória.
REM - registrador de endereços de memória.
183
RDM e REM
São os registradores utilizados pelo processador e memória para comunicação e troca de informações.
Em geral, o RDM (ou MBR -- Memory Buffer Register) possui um tamanho igual ao do barramento de dados - que costuma ser construído com largura múltipla do tamanho da palavra do processador.
184
RDM e REM
O REM (ou MAR -- Memory Address Register) possui um tamanho igual ao dos endereços da memória. Definindo-se o tamanho em bits do REM podemos calcular o espaço máximo de endereçamento da memória principal de um computador.
185
Microprogramação
186
Micro programação
Em 1951, Wilkes introduziu a microprogramação, que permite:
- um conjunto grande de instruções de máquina (no nível convencional), usando
- um hardware simples capaz de executar apenas as chamadas microinstruções.
187
Micro programação
Cada instrução de máquina no nível convencional é interpretada e pode dar origem à execução de muitas microinstruções.
188
Micro programação
Os computadores que usam microprogramação são ditos CISC - Complex Instruction Set Computer.
Alguns exemplos: IBM 360, DEC VAX, família Intel como 8088, 80386, Pentium etc.
189
Microprograma
O microprograma é um conjunto de microinstruções.
Ele é armazenado numa memória ROM do processador, chamada control store.
Há um MPC (micro program counter que aponta para a próxima microinstrução dentro do control store).
190
Microprograma
Há um registrador chamado MIR que armazena a microinstrução em execução.
191
MPC
MIR
Control Store
Microprograma
4 subciclos na execução da microinstrução
Subciclo 1: carrega a próxima microinstrução a ser executada num registrador chamado MIR (micro instruction register)
Subciclo 2: coloca valores dos registradores nos barramentos A e B, carregando os A latch e B latch.
192
Microprograma
4 subciclos na execução da microinstrução
Subciclo 3: dá o tempo necessário para a ULA e shifter produzirem seu resultado, carregando-o no MAR se for o caso.
Subciclo 4: armazena o resultado no registrador ou no MBR.
193
Dificuldade de escrever microinstruções
Cada microinstrução consta de 32 bits.
Esses 32 bits determinam o que deve acontecer num ciclo (4 subciclos).
Escrever cada microinstrução é uma tarefa árdua (pois lida com o nível muito baixo - zeros e uns).
194
Micro-assembler
Micro-assembler (ou micro-montador) facilita a escrita de microinstruções por permitir mnemônicos e símbolos parecidos com um programa de alto nível.
Na verdade o micro-assembler ainda é baixo nível, no sentido de cada microinstrução em micro-assembler deve corresponder a uma microinstrução de 32 bits.
195
Exemplo
Uma microinstrução em micro-assembler pode ser assim:
pc := pc + 1
196
Exemplo
Ela corresponde a uma microinstrução de 32 bits, onde
A = 0 (Registrador 0 é PC)
B = 6 (Registrador 6 contém o número 1)
C = 0
ULA = 0 (0 corresponde à operação soma na ULA)
ENC = 1 (indica que o resultado da ULA deve voltar ao registrador 0)
197
Exemplo
Fica mais fácil escrever
pc := pc + 1
do que
00000000000100000110000000000000.
198
Como escrever microprograma eficiente
Uma microinstrução tem 32 bits que comandam a ação do processador durante um ciclo.
É importante explorarmos, se possível, todos esses bits disponíveis numa mesma microinstrução, ao invés de dividir algo que poderia ser feito em um ciclo para serem feitos em dois ciclos ou mais.
199
Como escrever microprograma eficiente
Leitura (rd) leva dois ciclos. Assim rd deve aparecer em duas microinstruções seguidas. O mesmo para escrita (wr). Então é importante aproveitar a microinstrução e não definir uma microinstrução apenas com rd ou apenas com wr.
Veremos um exemplo a seguir de como escrever um microprograma eficiente.
200
Exemplo
Suponha a criação de uma nova instrução de máquina (nível convencional) chamada NOVA que faz o seguinte:
Escreve o valor 0 na memória endereçada por SP
Faz AC ficar igual a 4 vezes o valor de SP
Soma TIR em AC e se o valor da soma ficar negativa
entao faz AC igual a 0, senão faz AC igual a 1
No final o controle deve voltar a posição 0
201
Exemplo
Suponha que a instrução NOVA já está lida e encontra-se no IR. Suponha ainda que já foi feita a decodificação e sabe-se que se trata da instrução NOVA.
Vamos escrever, em micro-assembler, o trecho das microinstruções que implementa NOVA. Suponha que o início desse trecho é na linha 101.
202
Solução: microprograma para NOVA
Escreve o valor 0 na memória endereçada por SP
Faz AC ficar igual a 4 vezes o valor de SP
Soma TIR em AC e se o valor da soma ficar negativa
então faz AC igual a 0, senão faz AC igual a 1
No final o controle deve voltar a posição 0.
203
Solução: microprograma para NOVA
Ineficiente
101: mar:=sp;
102: mbr:=0; wr
103: wr
104: ac:=(sp+sp)
105: ac:=ac+ac
106: ac:=ac+tir; if n goto 109
107: ac:=1
108: goto 0
109: ac:=0
110: goto 0
204
Solução: microprograma para NOVA
Eficiente
101: mar:=sp; mbr:=0; wr
102: ac:=lshift(sp+sp); wr
103: ac:=ac+tir; if n goto 105
104: ac:=1; goto 0
105: ac:=0; goto 0
205
Referências
+
Outros recursos
206
Vídeo aulas úteis
207
Livros
M. A. Monteiro. Introdução à Organização de Computadores. ETC Editora.
Capítulo 6
A. Tanenbaum. Organização Estruturada de Computadores. Prentice Hall Brasil.
Capítulo 4
208
Arquitetura:
Instruções e Operandos
209
Nível ISA
Este nível está posicionado entre o nível da microarquitetura e o nível do sistema operacional.
Historicamente, esse nível foi desenvolvido antes de quaisquer outros níveis e, na verdade, originalmente era o único nível. Até hoje não é incomum ouvir esse nível ser denominado simplesmente 'a arquitetura' de uma máquina ou às vezes (incorretamente) como 'linguagem de montagem'.
210
Nível ISA
O nível ISA tem um significado especial que o torna importante para arquitetos de sistema: é a interface entre o software e o hardware. Embora seja possível o hardware executar diretamente programas escritos em C, C++, Java ou alguma outra linguagem de alto nível, não seria uma boa ideia.
211
Nível ISA
A vantagem em desempenho da compilação em relação à interpretação seria perdida. Além do mais, para ter muita utilidade prática, a maioria dos computadores deve ser capaz de executar programas escritos em várias linguagens, e não apenas em uma.
212
Nível ISA
A abordagem adotada essencialmente por todos os projetistas de sistemas é traduzir programas escritos em várias linguagens de alto nível para uma forma intermediária comum - o nível ISA - e construir hardware que possa executar programas de nível ISA diretamente.
O nível ISA define a interface entre os compiladores e o hardware. É a linguagem que ambos têm de entender. A relação entre os compiladores, o nível ISA e o hardware são mostrados na figura 1.
213
Nível ISA
O ideal é que, ao projetar uma nova máquina, os arquitetos conversem com os escritores de compiladores e também com os engenheiros de hardware para descobrir quais características cada um deles quer no nível ISA.
214
Nível ISA
Se os escritores de compiladores quiserem alguma característica que os engenheiros não podem implementar de modo eficiente em custo (e.g. uma instrução desvie-e-processe a folha de pagamento), ela não entra no hardware. Da mesma forma, se a turma do hardware tiver alguma nova característica elegante que quer acrescentar (e.g. uma memória na qual as palavras cujos endereços são números primos sejam super-rápidas), mas a turma do software não consegue imaginar como gerar código para usá-la, ela não passará da prancheta.
215
Nível ISA
Após muita negociação e simulação, surgirá uma ISA perfeitamente otimizada para as linguagens de programação pretendidas, e será implementada.
216
Nível ISA
Isso é a teoria. Agora vamos à triste realidade. Quando surge uma nova máquina, a primeira pergunta que todos os clientes potenciais fazem é: 'Ela é compatível com sua antecessora?'. A segunda é: 'Ela pode executar meu sistema operacional antigo?'. A terceira é: 'Ela executará todos os meus programas de aplicação existentes sem modificação?'.
217
Nível ISA
Se qualquer uma dessas respostas for 'não', os projetistas terão muitas explicações a dar. É raro que os clientes se disponham a jogar fora todos os seus programas antigos e começar tudo de novo.
218
Nível ISA
Essa atitude pressiona muito os arquitetos de computadores a manter a mesma ISA entre modelos, ou ao menos torná-la compatível com os modelos anteriores.
Com isso queremos dizer que a nova máquina deve ser capaz de executar programas antigos sem alteração. Contudo, é totalmente aceitável que a nova máquina tenha novas instruções e outras características que só possam ser exploradas por novo software.
219
Nível ISA
Eles podem passar de um projeto microprogramado para execução direta, ou adicionar paralelismo ou facilidades superescalares ou qualquer outra coisa que queiram, contanto que mantenham a compatibilidade com a ISA anterior.
A meta é garantir que velhos programas sejam executados na nova máquina. Então, o desafio se torna construir máquinas melhores sujeitas às limitações da compatibilidade.
220
Nível ISA
O que acabamos de dizer não tem a intenção de dar a entender que o projeto da ISA não importa. Uma boa ISA tem significativas vantagens em relação a uma ruim, em particular quando se trata de comparar capacidade computacional bruta com custo. Se quanto ao mais os projetos forem equivalentes, as ISAs podem ser responsáveis por uma diferença de até 25% em desempenho.
221
Nível ISA
O que queremos deixar claro é que as forças do mercado dificultam (mas não impossibilitam) descartar uma ISA antiga e introduzir uma nova.
Não obstante, de vez em quando surge uma nova ISA de uso geral e, em mercados especializados - e.g. sistemas embutidos ou processadores multimídia -, elas ocorrem com muito mais frequência. Por consequência, é importante entender o projeto da ISA.
222
Nível ISA
O que faz uma ISA ser boa? Há dois fatores primordiais. Em primeiro lugar, uma boa ISA deve definir um conjunto de instruções que pode ser implementado com eficiência em tecnologias atuais e futuras, resultando em projetos efetivos em custo por várias gerações. Um mau projeto é mais difícil de implementar e pode exigir um número muito maior de portas para implementar um processador e mais memória para executar programas.
223
Nível ISA
Além disso, a execução pode ser mais lenta porque a ISA encobre oportunidades de sobrepor operações, exigindo projetos muito mais sofisticados para obter desempenho equivalente.
Um projeto que aproveita as peculiaridades de determinada tecnologia pode ter um êxito fugaz e produzir uma única geração de implementações efetivas em custo e então ser ultrapassados por ISAs mais avançadas.
224
Nível ISA
Em segundo lugar, uma boa ISA deve fornecer um alvo claro para o código compilado. Regularidade e completude de uma faixa de opções são aspectos importantes que nem sempre estão presentes em uma ISA. Essas propriedades são importantes para um compilador, que pode ter problemas para escolher a melhor opção entre alternativas limitadas, em particular quando algumas alternativas aparentemente óbvias não são permitidas pela ISA.
225
Nível ISA
Em resumo, uma vez que a ISA é a interface entre o hardware e o software, ela tem de contentar os projetistas de hardware e os projetistas de software.
226
Visão geral do nível ISA
227
Propriedades do nível ISA
Em princípio, o nível ISA é definido pelo modo como a máquina se apresenta a um programador de linguagem de máquina.
Uma vez que mais ninguém faz muita programação em linguagem de máquina, vamos redefinir isso e dizer que código de nível ISA é o que um compilador produz (ignorando, por enquanto, chamadas ao sistema operacional e linguaguem de montagem simbólica).
228
Propriedades do nível ISA
Para produzir código de nível ISA, o escritor de compilador tem de saber qual é o modelo de memória, quais e quantos são os registradores, quais tipos de dados e instruções estão disponíveis e assim por diante. O conjunto de todas essas informações define o nível ISA.
229
Propriedades do nível ISA
De acordo com essa definição, questões como se a microarquitetura é microprogramada ou não, se ela tem paralelismo ou não, se ela é superescalar ou não, e assim por diante, não fazem parte do nível ISA porque não são visíveis para o escritor de compilador.
Todavia, essa observação não é de todo verdadeira, porque algumas dessas propriedades afetam o desempenho e isso é visível para o escritor do compilador.
230
Propriedades do nível ISA
Considere, por exemplo, um projeto superescalar que pode emitir instruções uma atrás da outra no mesmo ciclo, contanto que uma seja uma instrução de número inteiro e outra de ponto flutuante, obterá desempenho visivelmente melhor do que se não fizer isso. Assim, os detalhes da operação superescalar são visíveis no nível ISA, portanto a separação entre as camadas não é tão clara como poderia parecer de início.
231
Propriedades do nível ISA
Para algumas arquiteturas, o nível ISA é especificado por um documento formal de definição, muitas vezes produzido por um consórcio do setor. Por exemplo, a V9 SPARC tem uma definição oficial. A finalidade de um documento de definição é possibilitar que diferentes implementadores construam a máquina e todas elas executem exatamente o mesmo software e obtenham exatamente os mesmos resultados.
232
Propriedades do nível ISA
Uma outra propriedade importante do nível ISA é que na maioria das máquinas há no mínimo dois modos. O modo núcleo (kernel) deve executar o sistema operacional e permite que todas as instruções sejam executadas. O modo usuário deve executar programas de aplicação e não permite que certas instruções sensíveis, como as que manipulam a cache diretamente, sejam executadas. Focaremos no modo usuário.
233
Modelos de memória
234
Modelos de memória
Todos os computadores dividem a memória em células que têm endereços consecutivos. O tamanho de célula mais comum no momento é 8 bits, mas células de 1 bit a 60 bits já foram usadas no passado. Uma célula de 8 bits é denominada byte. A razão para usar bytes de 8 bits é que os caracteres ASCII têm 7 bits, portanto, um caractere ASCII mais um bit de paridade cabem em um byte.
235
Modelos de memória
Se o UNICODE vier a dominar o setor no futuro, então os futuros computadores poderão ser baseados em unidades de 16 bits com numeração sucessiva. Afinal, 24 é um número ainda mais interessante do que 23, uma vez que 4 é uma potência de 2 e 3 não é.
236
Modelos de memória
Em geral os bytes são agrupados em palavras de 4 bytes (32 bits) ou 8 bytes (64 bits) com instruções disponíveis para manipular palavras inteiras. Muitas arquiteturas requerem que as palavras sejam alinhadas em suas fronteiras naturais; assim, por exemplo, uma palavra de 4 bytes pode começar no endereço 0, 4, 8 etc., mas não no endereço 1 ou 2. De modo semelhante, uma palavra de 8 bytes pode começar no endereço 0, 8 ou 16, mas não no endereço 4 ou 6. O alinhamento de palavras de 8 bytes é ilustrado na figura 2.
237
Modelos de memória
O alinhamento costuma ser exigido porque memórias funcionam com mais eficiência desse modo. O Pentium 4, por exemplo, que busca 8 bytes por vez na memória, usa endereço físicos de 36 bits, mas tem somente 33 bits de endereço. Assim, o Pentium 4 não poderia fazer um referência não alinhado à memória nem que quisesse, porque os 3 bits de ordem baixa não estão especificados explicitamente. Eles são sempre 0s, o que obriga todos os endereços de memória a ser múltiplos de 8 bytes.
238
Modelos de memória
Contudo, esse requisito de alinhamento às vezes causa problemas. O Pentium 4 permite que programas ISA referenciem palavras que começam em qualquer endereço, uma propriedade que remonta ao 8088, que tinha um barramento de dados de 1 byte de largura - e, assim, nenhum requisito de alinhamento de referência à memória em fronteiras de 8 bytes.
239
Modelos de memória
Se um programa Pentium 4 ler uma palavra de 4 bytes no endereço 7, o hardware tem de fazer uma referência à memória para obter os bytes de 0 a 7 e uma segunda referência à memória para obter os bytes de 8 a 15. Então a CPU tem de extrair os 4 bytes requisitados dos 16 bytes lidos da memória e montá-los na ordem correta para formar uma palavra de 4 bytes.
240
Modelos de memória
Ter a capacidade de ler palavras em endereços arbitrários requer lógica extra no chip, o que o torna maior e mais caro. Os engenheiros projetistas adorariam livrar-se dela e simplesmente exigir que todos os programas fizessem referências à memória alinhadas por palavra. O problema é que, sempre que os engenheiros dizem "E quem se importa com executar programas 8088 antigos e bolorentos que referenciam a memória de modo errado?", o pessoal de marketing tem uma resposta sucinta: "Nossos clientes".
241
Modelos de memória
A maioria das máquinas tem um único espaço de endereço linear no nível ISA, que se estende do endereço 0 até algum máximo, frequentemente 232 bytes ou 264 bytes. Contudo, algumas máquinas têm espaços de endereços separados para instruções e dados, de modo que uma busca de instrução no endereço 8 vai para um espaço de endereço diferente do que uma busca de dados no endereço 8. Esse esquema é mais completo do que ter um único espaço de endereço, mas tem duas vantagens.
242
Modelos de memória
Em primeiro lugar, torna-se possível ter 232 bytes de programa e 232 bytes adicionais de dados usando somente endereços de 32 bits. Em segundo lugar, como todas as escritas vão automaticamente para o espaço de dados, fica impossível sobrescrever acidentalmente o programa, eliminando assim uma fonte de bugs de programas.
243
Modelos de memória
Note que ter um espaço de endereços separado para instruções e dados não é o mesmo que ter uma cache de nível 1 dividida. No primeiro caso, a quantidade total de espaço de endereço é duplicada e leitura para qualquer endereço determinado dão resultados diferentes, dependendo de a leitura ser de uma instrução ou de uma palavra de dados. Com uma cache dividida, ainda há apenas um espaço de endereço, só que caches diferentes armazenam partes diferentes desse espaço.
244
Modelos de memória
Ainda um outro aspecto do modelo de memória de nível ISA é a semântica da memória. É natural esperar que uma instrução LOAD que ocorre após uma instrução STORE, e que referencia o mesmo endereço, retornará o valor que acabou de ser armazenado. Todavia, como vimos em aulas anteriores, em muitos projetos as microinstruções são reordenadas.
245
Modelos de memória
Assim, há um perigo real de que a memória não terá o comportamento esperado. O problema fica ainda pior em um multiprocessador, no qual cada uma das várias CPUs envia uma sequência de requisições de escrita e leitura (possivelmente reordenadas) a uma memória compartilhada.
246
Modelos de memória
Projetistas de sistemas podem adotar qualquer uma das diversas abordagens para esse problema. Em um extremo, todas as requisições de memória podem ser serializadas, portanto cada uma é concluída antes de a próxima ser emitida. Essa estratégia prejudica o desempenho, mas resulta na semântica de memória mais simples. Todas as operações são executadas estritamente na ordem do programa.
247
Modelos de memória
No outro extremo, não são dadas garantias de espécie alguma. Para forçar uma ordenação na memória, o programa deve executar uma instrução SYNC, que bloqueia a emissão de todas as novas operações de memória até que todas as anteriores tenham sido concluídas. Esse projeto atribui uma grande carga aos compiladores, porque eles têm de entender, com detalhes, como a microarquitetura subjacente funciona, embora dê aos projetistas de hardware a máxima liberdade para otimizar a utilização da memória.
248
Modelos de memória
Também são possíveis modelos de memória intermediários nos quais o hardware bloqueia automaticamente a emissão de certas referências à memória - por exemplo, as que envolvem uma dependência RAW ou WAR - mas não bloqueia outras.
249
Modelos de memória
Embora seja um aborrecimento ter todas essas peculiaridades causadas pela microarquitetura expostas no nível ISA (ao menos para os escritores de compiladores e programadores de linguagem de montagem), essa é a tendência. Ela é causada pelas implementações subjacentes como reordenação de microinstruções, paralelismo profundo, vários níveis de cache e assim por diante. Veremos mais exemplos a seguir.
250
Referências
251
Livro(s) referência
A. Tanenbaum. Organização Estruturada de Computadores. Prentice Hall Brasil.
Capítulo 5
W. Stallings. Arquitetura e Organização de Computadores. SP. Prentice Hall.
Capítulo 9
252