Sei sulla pagina 1di 180

C

Uma pesquisa de
arquiteturas RISC para
computadores desktop,
servidores e embutidos
RISC: qualquer computador anunciado depois de 1985.
Steven Przybylski
Um projetista do MIPS de Stanford

C.1 Introduo
C.2 Modos de endereamento e formatos de instrues
C.3 Instrues: o subconjunto do ncleo do MIPS
C.4 Instrues: extenses de multimdia dos RISCs de desktop/servidores
C.5 Instrues: extenses de processamento de sinais digitais dos RISCs embutidos
C.6 Instrues: extenses comuns para o ncleo do MIPS
C.7 Instrues exclusivas do MIPS64
C.8 Instrues exclusivas do Alpha
C.9 Instrues exclusivas do SPARC v.9
C.10 Instrues exclusivas do PowerPC
C.11 Instrues exclusivas do PA-RISC 2.0
C.12 Instrues exclusivas do ARM
C.13 Instrues exclusivas do Thumb
C.14 Instrues exclusivas do SuperH
C.15 Instrues exclusivas do M32R
C.16 Instrues exclusivas do MIPS16
C.17 Comentrios finais
C.18 Agradecimentos
Referncias
2003, Elsevier Science (EUA).
2003, Editora Campus Ltda. uma empresa Elsevier. Todos os direitos reservados.
2 Apndice C Uma pesquisa de arquiteturas RISC para computadores desktop, servidores e embutidos

C.1 Introduo
Neste apndice, abordamos dois grupos de arquiteturas de computadores de conjuntos reduzidos de instru-
es (RISC reduced instruction set computer). O primeiro grupo inclui os RISCs de desktop e servidores:
n Alpha da Digital.
n PA-RISC da Hewlett-Packard.
n PowerPC da IBM e da Motorola.
n MIPS da Silicon Graphics.
n SPARC da Sun Microsystems.
O segundo grupo o dos RISCs embutidos:
n ARM da Advanced RISC Machines.
n Thumb da Advanced RISC Machines.
n SuperH da Hitachi.
n M32R da Mitsubishi.
n MIPS16 da Silicon Graphics.
Nunca houve outra classe de computadores to semelhantes. Essa semelhana permite a apresentao de 10
arquiteturas em aproximadamente 50 pginas. As caractersticas dos RISCs de desktop e de servidores encon-
tram-se na Figura C.1, e as dos RISCs embutidos esto na Figura C.2.
Note que os RISCs embutidos tendem a ter de 8 a 16 registradores de uso geral, enquanto os RISCs de desk-
top/servidores tm 32, e que o comprimento das instrues de 16 a 32 bits nos RISCs embutidos, mas elas so
sempre de 32 bits em RISCs de desktop/servidores.
Embora sejam apresentados como arquiteturas de conjuntos de instrues embutidos separadas, o Thumb e o
MIPS16 so realmente modos opcionais de ARM e MIPS invocados por instrues de chamada. Quando nesse
modo, eles executam um subconjunto da arquitetura nativa, usando instrues com 16 bits de comprimento.

Alpha MIPS I PA-RISC 1.1 PowerPC SPARC v.8

Data de lanamento 1992 1986 1986 1993 1987


Tamanho de instruo (bits) 32 32 32 32 32
Espao de endereos (tamanho, 64 bits, plano 32 bits, plano 48 bits, 32 bits, plano 32 bits, plano
modelo) segmentado
Alinhamento de dados Alinhado Alinhado Alinhado No-alinhado Alinhado
Modos de endereamento de dados 1 1 5 4 2
Proteo Pgina Pgina Pgina Pgina Pgina
Tamanho mnimo de pgina 8 KB 4 KB 4 KB 4 KB 8 KB
E/S Mapeada na Mapeada na Mapeada na Mapeada na Mapeada na
memria memria memria memria memria
Registradores de inteiros (nmero, 31 GPR 31 GPR 31 GPR 32 GPR 31 GPR
modelo, tamanho) 64 bits 32 bits 32 bits 32 bits 32 bits
Registradores de ponto flutuante 31 32 ou 16 32 ou 56 32 ou 32 32 ou 32 32 ou
separados 31 64 bits 16 64 bits 28 64 bits 32 64 bits 32 64 bits
Formato de ponto flutuante IEEE 754 de IEEE 754 de IEEE 754 de IEEE 754 de IEEE 754 de
preciso simples, preciso simples, preciso simples, preciso simples, preciso simples,
dupla dupla dupla dupla dupla
Figura C.1 Resumo da primeira verso de cinco arquiteturas recentes para computadores desktop e servidores. Exceto pelo n-
mero de modos de endereos de dados e de alguns detalhes do conjunto de instrues, os conjuntos de instrues de inteiros dessas arqui-
teturas so muito semelhantes. Compare essas caractersticas com as da Figura C.34. Todas as verses mais recentes dessas arquiteturas
admitem um espao de endereos plano de 64 bits.
C.2 Modos de endereamento e formatos de instrues 3

ARM Thumb SuperH M32R MIPS16

Data de lanamento 1985 1995 1992 1997 1996


Tamanho de instruo (bits) 32 16 16 16/32 16/32
Espao de endereos (tamanho, modelo) 32 bits, plano 32 bits, plano 32 bits, plano 32 bits, plano 32/64 bits, plano
Alinhamento de dados Alinhado Alinhado Alinhado Alinhado Alinhado
Modos de endereamento de dados 6 6 4 3 2
Registradores de inteiros (nmero, 15 GPR 8 GPR + SP, 16 GPR 16 GPR 8 GPR + SP,
modelo, tamanho) 32 bits LR 32 bits 32 bits 32 bits RA 32/64 bits
E/S Mapeada na Mapeada na Mapeada na Mapeada na Mapeada na
memria memria memria memria memria
Figura C.2 Resumo de cinco arquiteturas recentes para aplicaes embutidas. Exceto pelo nmero de modos de endereos de da-
dos e de alguns detalhes do conjunto de instrues, os conjuntos de instrues de inteiros dessas arquiteturas so semelhantes. Compare
esta figura com a Figura C.34.

Esses conjuntos de instrues de 16 bits no foram planejados para serem arquiteturas completas, mas so sufici-
entes para codificar a maioria dos procedimentos. Ambas as mquinas esperam que os procedimentos sejam ho-
mogneos, com todas as instrues em modo de 16 bits ou em modo de 32 bits. Os programas consistiro em pro-
cedimentos em modo de 16 bits para aumentar a densidade ou em modo de 32 bits para aumentar o desempenho.
Uma complicao dessa descrio que alguns dos RISCs mais antigos foram estendidos ao longo dos anos.
Decidimos descrever a verso mais recente das arquiteturas: Alpha verso 3, MIPS64, PA-RISC 2.0 e SPARC
verso 9 para as arquiteturas de desktop/servidores; ARM verso 4, Thumb verso 1, Hitachi SuperH SH-3,
M32R verso 1 e MIPS16 verso 1 para as arquiteturas embutidas.
As sees restantes se desenvolvem da maneira descrita a seguir. Depois de discutirmos os modos de endere-
amento e os formatos de instrues de nossas arquiteturas RISC, apresentaremos os dados das pesquisas das
instrues em cinco etapas:
n Instrues encontradas no ncleo do MIPS, definido no Captulo 2 do texto do livro.
n Extenses de multimdia dos RISCs de desktop/servidores.
n Extenses para processamento de sinais digitais dos RISCs embutidos.
n Instrues no encontradas no ncleo do MIPS, mas encontradas em duas ou mais arquiteturas.
n As instrues e caractersticas exclusivas de cada uma das 10 arquiteturas.
Apresentaremos a evoluo dos conjuntos de instrues na seo final e concluiremos com uma especula-
o sobre as tendncias futuras dos RISCs.

C.2 Modos de endereamento e formatos de instrues


A Figura C.3 mostra os modos de endereamento de dados admitidos pelas arquiteturas desktop. Tendo em
vista que todas tm um registrador que sempre apresenta o valor 0 quando utilizado em modos de endereos, o
modo de endereo absoluto com intervalo limitado pode ser sintetizado com o uso de zero como a base no en-
dereamento de deslocamento. (Esse registrador pode ser alterado por operaes da ULA no PowerPC; ele
sempre 0 nas outras mquinas.) De modo semelhante, o endereamento indireto de registrador sintetizado
pelo uso do endereamento de deslocamento com um deslocamento igual a 0. A existncia de modos de ende-
reamento simplificado uma caracterstica de distino das arquiteturas RISC.
A Figura C.4 mostra os modos de endereamento de dados admitidos pelas arquiteturas embutidas. Diferen-
tes dos RISCs de desktop, essas mquinas embutidas no reservam um registrador para conter o valor 0. Embo-
ra a maioria delas tenha dois a trs modos de endereamento simples, o ARM e o SuperH tm vrios, incluindo
clculos bastante complexos. O ARM tem um modo de endereamento que pode deslocar um registrador por
qualquer quantidade, som-lo a outros registradores para formar o endereo e depois atualizar um registrador
com esse novo endereo.
4 Apndice C Uma pesquisa de arquiteturas RISC para computadores desktop, servidores e embutidos

Modo de endereamento Alpha MIPS64 PA-RISC 2.0 PowerPC SPARC v.9

Registrador + deslocamento (deslocamento ou base) X X X X X


Registrador + registrador (indexado) X (FP) X (Cargas) X X
Registrador + registrador com ajuste de escala (ajuste de escala) X
Registrador + deslocamento e atualizao de registrador X X
Registrador + registrador e atualizao de registrador X X
Figura C.3 Resumo de modos de endereamento de dados admitidos pelas arquiteturas desktop. O PA-RISC tambm tem verses
de endereos curtos dos modos de endereamento de deslocamento. O MIPS64 indexou o endereamento para cargas e armazenamentos de
ponto flutuante. (Esses modos de endereamento so descritos na Figura 2.6).

Modo de endereamento ARM v.4 Thumb SuperH M32R MIPS16

Registrador + deslocamento (deslocamento ou base) X X X X X


Registrador + registrador (indexado) X X X
Registrador + registrador com ajuste de escala (ajuste de escala) X
Registrador + deslocamento e atualizao de registrador X
Registrador + registrador e atualizao de registrador X
Registrador indireto X X
Auto-incremento, autodecremento X X X X
Dados, relativo ao PC X X (cargas) X X (cargas)
Figura C.4 Resumo de modos de endereamento de dados admitidos pelas arquiteturas embutidas. O SuperH e o M32R tm mo-
dos de endereamento indireto de registrador e de registrador + deslocamento separados, em vez de simplesmente colocarem 0 no deslo-
camento do ltimo modo. Isso aumenta o uso de instrues de 16 bits no M32R e oferece um conjunto mais amplo de modos de endereos
para diferentes instrues de transferncia de dados no SuperH. Para obter maior intervalo de endereamento, o ARM e o Thumb movem o
deslocamento 1 ou 2 bits esquerda, se o tamanho dos dados for meia palavra ou palavra. (Esses modos de endereamento so descritos
na Figura 2.6).

As referncias ao cdigo normalmente so relativas ao PC, embora o salto indireto de registrador seja admi-
tido no retorno de procedimentos, em instrues de caso (case) e nas chamadas de funes de ponteiros. Em
uma variao, os endereos de desvios relativos ao PC so deslocados 2 bits esquerda antes de serem somados
ao PC para os RISCs de desktop, aumentando assim a distncia de desvio. Isso funciona porque o comprimento
de todas as instrues para os RISCs de desktop 32 bits, e as instrues devem estar alinhadas na memria em
palavras de 32 bits. Em geral, arquiteturas embutidas com instrues de 16 bits deslocam o endereo relativo ao
PC em uma unidade, por razes semelhantes.
A Figura C.5 mostra o formato das instrues RISC de desktop, que inclui o tamanho do endereo nas ins-
trues. Cada arquitetura de conjunto de instrues utiliza esses quatro formatos principais de instrues. A
Figura C.6 mostra os seis formatos para as mquinas RISC embutidas. O desejo de ter menor tamanho de cdi-
go por meio de instrues de 16 bits leva a um nmero maior de formatos de instrues.
As Figuras C.7 e C.8 mostram as variaes na extenso de campos de constantes para a largura completa dos
registradores. Nesse ponto sutil, os RISCs so semelhantes, mas no idnticos.

C.3 Instrues: o subconjunto do ncleo do MIPS


As semelhanas de cada arquitetura permitem descries simultneas, comeando com as operaes equiva-
lentes ao ncleo do MIPS.

Instrues de ncleo do MIPS


Quase toda instruo encontrada no ncleo do MIPS tambm se encontra nas outras arquiteturas, como
mostram as Figuras C.9 a C.13. (Como referncia, as definies das instrues do MIPS so encontradas na
Seo 2.12 e na contracapa do final do livro.) As instrues esto listadas em quatro categorias: transferncia
de dados (Figura C.9); aritmticas e lgicas (Figura C.10); controle (Figura C.11); e de ponto flutuante (Fi-
C.3 Instrues: o subconjunto do ncleo do MIPS 5
31 25 20 15 10 4 0

Alpha Op6 Rs15 Rs25 Opx11 Rd5

MIPS Op6 Rs15 Rs25 Rd5 Const5 Opx6

Registrador-registrador PowerPC Op6 Rd5 Rs15 Rs25 Opx11

PA-RISC Op6 Rs15 Rs25 Opx11 Rd5

SPARC Op2 Rd5 Opx6 Rs15 0 Opx8 Rs25

31 29 24 18 13 12 4 0
31 25 20 15 0

Alpha Op6 Rd5 Rs15 Const16

MIPS Op6 Rs15 Rd5 Const16

Registrador-imediato PowerPC Op6 Rd5 Rs15 Const16

PA-RISC Op6 Rs25 Rd5 Const16

SPARC Op2 Rd5 Opx6 Rs15 1 Const13

31 29 24 18 13 12 0

31 25 20 15 0

Alpha Op 6
Rs15 Const 21

6 5 5 5
MIPS Op Rs1 Opx /Rs2 Const16

Desvio PowerPC Op6 Opx6 Rs15 Const14 Opx2

PA-RISC Op6 Rs25 Rs15 Opx3 Const11 O C

SPARC Op2 Opx11 Const19

31 29 18 12 1 0
31 25 20 0

Alpha Op6 Rs15 Const21

MIPS Op6 Const26

Salto/chamada PowerPC Op6 Const24 Opx2

PA-RISC Op6 Const21 O1 C1

SPARC Op2 Const30

31 29 20 15 12 1 0

Opcode Registrador Constante

Figura C.5 Formatos de instrues para arquiteturas RISC de desktop/servidores. Esses quatro formatos so encontrados em todas
as cinco arquiteturas. (A notao de sobrescrito nesta figura significa a largura de um campo em bits.) Embora os campos de registradores
estejam localizados em fragmentos semelhantes da instruo, voc deve estar ciente de que o campo de destino e dois campos de origem
esto misturados. Op = o opcode principal, Opx = uma extenso de opcode, Rd = o registrador de destino, Rs1 = registrador de origem 1,
Rs2 = registrador de origem 2 e Const = uma constante (usada como um imediato ou como um endereo). Diferente dos outros RISCs, o
Alpha tem um formato para imediatos em operaes aritmticas e lgicas diferente do formato de transferncia de dados mostrado aqui.
Ele fornece um imediato de 8 bits nos bits de 20 a 13 do formato RR, com os bits 12 a 5 restantes formando uma extenso de opcode.

gura C.12). Uma quinta categoria (Figura C.13) mostra convenes para utilizao de registradores e pseu-
do-instrues em cada arquitetura. Se uma instruo de ncleo do MIPS exigir uma seqncia curta de ins-
trues em outras arquiteturas, essas instrues estaro separadas por sinais de ponto-e-vrgula nas Figuras
C.9 a C.13. (Para evitar confuso, o registrador de destino sempre ser o operando mais esquerda neste
apndice, independentemente da notao usada normalmente com cada arquitetura.) As Figuras C.14 a C.17
mostram a listagem equivalente para RISCs embutidos. Observe que o ponto flutuante em geral no defini-
do para os RISCs embutidos.
Toda arquitetura deve ter um esquema para comparao e desvio condicional mas, apesar de todas as seme-
lhanas, cada uma dessas arquiteturas descobriu um modo diferente de executar a operao.
6 Apndice C Uma pesquisa de arquiteturas RISC para computadores desktop, servidores e embutidos

Figura C.6 Formatos de instrues para arquiteturas RISC embutidas. Esses seis formatos so encontrados em todas as cinco arqui-
teturas. A notao igual da Figura C.5. Note as semelhanas nos formatos de desvios, saltos e chamadas, e tambm a diversidade de for-
matos de registrador-registrador, registrador-imediato e transferncia de dados. As diferenas resultam do fato de a arquitetura ter 8 ou
16 registradores, de o formato ser de 2 ou 3 operandos e de o comprimento da instruo ser de 16 ou 32 bits.

Comparao e desvio condicional


O SPARC utiliza os quatro bits tradicionais de cdigo de condio armazenados na palavra de status de progra-
ma: negativo, zero, transporte e estouro. Eles podem ser definidos em qualquer instruo aritmtica ou lgica;
diferente das arquiteturas anteriores, essa configurao opcional em cada instruo. Uma opo explcita re-
sulta em menos problemas na implementao com pipeline. Embora os cdigos de condio possam ser defini-
dos como um efeito colateral de uma operao, as comparaes explcitas so sintetizadas com uma subtrao
empregando r0 como destino. Os desvios condicionais do SPARC testam os cdigos de condio para determi-
nar todas as relaes possveis, sem sinal e com sinal. O ponto flutuante utiliza cdigos de condio separados
para codificar as condies IEEE 754, exigindo uma instruo de comparao de ponto flutuante. A verso 9
expandiu os desvios do SPARC em quatro aspectos: um conjunto separado de cdigos de condio para opera-
C.3 Instrues: o subconjunto do ncleo do MIPS 7

Formato: categoria de instruo Alpha MIPS64 PA-RISC 2.0 PowerPC SPARC v.9

Desvio: todas Sinal Sinal Sinal Sinal Sinal


Salto/chamada: todas Sinal Sinal Sinal Sinal
Registrador-imediato: transferncia de dados Sinal Sinal Sinal Sinal Sinal
Registrador-imediato: aritmtica Zero Sinal Sinal Sinal Sinal
Registrador-imediato: lgica Zero Zero Zero Sinal
Figura C.7 Resumo de extenso de constantes para RISCs de desktop. As constantes nas instrues de salto e chamada do MIPS no
so estendidas com sinal, pois s substituem os 28 bits inferiores do PC, deixando inalterados os quatro bits superiores. O PA-RISC no tem
instrues lgicas de imediatos.

Formato: categoria de instruo ARM v.4 Thumb SuperH M32R MIPS16

Desvio: todas Sinal Sinal Sinal Sinal Sinal


Salto/chamada: todas Sinal Sinal/Zero Sinal Sinal
Registrador-imediato: transferncia de dados Zero Zero Zero Sinal Zero
Registrador-imediato: aritmtica Zero Zero Sinal Sinal Zero/Sinal
Registrador-imediato: lgica Zero Zero Zero
Figura C.8 Resumo de extenso de constantes para RISCs embutidos. As instrues de 16 bits de comprimento tm imediatos muito
mais curtos que os de RISCs de desktop, em geral apenas 5 a 8 bits. Porm, a maioria dos RISCs embutidos tem um modo de obter um ende-
reo longo para chamadas de procedimentos a partir de duas meias palavras em seqncia. As constantes nas instrues de salto e chama-
da do MIPS no so estendidas com sinal, pois s substituem os 28 bits inferiores do PC, deixando inalterados os 4 bits superiores. Os imedia-
tos de 8 bits no ARM podem ser girados para a direita um nmero par de bits entre 2 e 30, produzindo uma grande variedade de valores
imediatos (adjacentes). Por exemplo, todas as potncias de 2 so imediatos no ARM.

Transferncia de dados
(formatos de instrues) R-I R-I R-I, R-R R-I, R-R R-I, R-R

Nome da instruo Alpha MIPS64 PA-RISC 2.0 PowerPC SPARC v.9

Carregar byte com sinal LDBU; SEXTB LB LDB; EXTRW,S 31,8 LBZ; EXTSB LDSB
Carregar byte sem sinal LDBU LBU LDB, LDBX, LDBS LBZ LDUB
Carregar meia palavra com sinal LDWU; SEXTW LH LDH; EXTRW,S 31,16 LHA LDSH
Carregar meia palavra sem sinal LDWU LHU LDH, LDHX, LDHS LHZ LDUH
Carregar palavra LDLS LW LDW, LDWX, LDWS LW LD
Carregar flutuante de preciso simples LDS * LWC1 FLDWX, FLDWS LFS LDF
Carregar flutuante de preciso dupla LDT LDC1 FLDDX, FLDDS LFD LDDF
Armazenar byte STB SB STB, STBX, STBS STB STB
Armazenar meia palavra STW SH STH, STHX, STHS STH STH
Armazenar palavra STL SW STW, STWX, STWS STW ST
Armazenar flutuante de preciso simples STS SWC1 FSTWX, FSTWS STFS STF
Armazenar flutuante de preciso dupla STT SDC1 FSTDX, FSTDS STFD STDF
Ler, gravar em registradores especiais MF_, MT_ MF, MT_ MFCTL, MTCTL MFSPR, MF_, RD, WR, RDPR,
MTSPR, MT_ WRPR, LDXFSR,
STXFSR
Mover inteiro para registrador de FP ITOFS MFC1/DMFC1 STW; FLDWX STW; LDFS ST; LDF
Mover FP para registrador de inteiros FTTOIS MTC1/DMTC1 FSTWX;LDW STFS; LW STF; LD
Figura C.9 Instrues de transferncia de dados para RISCs de desktop, equivalentes ao ncleo do MIPS. Uma seqncia de
instrues para sintetizar uma instruo MIPS mostrada separadamente por sinais de ponto-e-vrgula. Se houver vrias opes de ins-
trues equivalentes ao ncleo do MIPS, elas estaro separadas por vrgulas. Nesta figura, a meia palavra tem 16 bits e a palavra tem
32 bits. Observe que, no Alpha, o LDS converte o ponto flutuante de preciso simples para preciso dupla e carrega todo o registrador
de 64 bits.
8 Apndice C Uma pesquisa de arquiteturas RISC para computadores desktop, servidores e embutidos

Aritmtica/lgica
(formatos de instrues) R-R, R-I R-R, R-I R-R, R-I R-R, R-I R-R, R-I

Nome da instruo Alpha MIPS64 PA-RISC 2.0 PowerPC SPARC v.9

Adio ADDL ADDU, ADDU ADDL, LD0, ADD, ADDI ADD


ADDI, UADDCM
Adio (armadilha se estouro) ADDLV ADD, ADDI ADDO, ADDIO ADDO; MCRXR; BC ADDcc; TVS
Sub SUBL SUBU SUB, SUBI SUBF SUB
Sub (armadilha se estouro) SUBLV SUB SUBTO, SUBIO SUBF/oe SUBcc; TVS
Multiplicao MULL MULT, MULTU SHiADD;...; MULLW, MULLI MULX
(i=1,2,3)
Multiplicao (armadilha se estouro) MULLV SHiADDO;...;
Diviso DIV, DIVU DS;...; DS DIVW DIVX
Diviso (armadilha se estouro)
E AND AND, ANDI AND AND, ANDI AND
Ou BIS OR, ORI OR OR, ORI OR
Xor XOR XOR, XORI XOR XOR, XORI XOR
Carregar registrador parte alta LDAH LUI LDIL ADDIS SETHI (B fmt.)
Deslocamento lgico esquerda SLL SLLV, SLL DEPW, Z 31-i, RLWINM SLL
32-i
Deslocamento lgico direita SRL SRLV, SRL EXTRW, U 31, 32-i RLWINM 32-i SRL
Deslocamento aritmtico direita SRA SRAV, SRA EXTRW, S 31, 32-i SRAW SRA
Comparao CMPEQ, SLT/U, COMB CMP(I)CLR SUBcc r0,...
CMPLT, SLTI/U
CMPLE
Figura C.10 Instrues aritmticas/lgicas de RISCs de desktop equivalentes ao ncleo do MIPS. Traos significam que a operao
no est disponvel nessa arquitetura ou no sintetizada em poucas instrues. Tal seqncia de instrues mostrada separadamente
por sinais de ponto-e-vrgula. Se houver vrias opes de instrues equivalentes ao ncleo do MIPS, elas estaro separadas por vrgulas.
Observe que, na categoria de aritmtica/lgica, todas as mquinas com exceo do SPARC utilizam mnemnicos de instrues separados
para indicar um operando imediato; o SPARC oferece verses de imediatos dessas instrues mas utiliza um nico mnemnico. ( claro que
esses so opcodes separados!)

Controle (formatos
de instrues) B, J/C B, J/C B, J/C B, J/C B, J/C

Nome da instruo Alpha MIPS64 PA-RISC 2.0 PowerPC SPARC v.9

Desvio em comparao de B_ (<, >, <=, BEQ, BNE, B_Z COMB, COMIB BC BR_Z, BPcc (<, >,
inteiros >=, =, no=) (<, >, <=, >=) <=, >=, =, no=)
Desvio em comparao de ponto FB_(<, >, <=, BC1T, BC1F FSTWX f0; BC FBPfcc (<, >, <=,
flutuante >=, =, no=) LDW t; BB t >=, =,...)
Salto, registrador de salto BR, JMP J, JR BL r0, BLR r0 B, BCLR, BA, JMPL r0,...
BCCTR
Chamada, registrador de BSR JAL, JALR BL, BLE BL, BLA, CALL, JMPL
chamada BCLRL,
BCCTRL
Armadilha CALL_PAL BREAK BREAK TW, TWI Ticc, SIR
GENTRAP
Retorno de interrupo CALL_PAL REI JR; ERET RFI, RFIR RFI DONE, RETRY,
RETURN
Figura C.11 Instrues de controle de RISCs de desktop equivalentes ao ncleo do MIPS. Se houver vrias opes de instrues
equivalentes ao ncleo do MIPS, elas estaro separadas por vrgulas.
C.3 Instrues: o subconjunto do ncleo do MIPS 9

Ponto flutuante
(formatos de instrues) R-R R-R R-R R-R R-R

Nome da instruo Alpha MIPS64 PA-RISC 2.0 PowerPC SPARC v.9

Adio simples, dupla ADDS, ADDT ADD.S, ADD.D FADDFADD/dbl FADDS, FADD FADDS, FADDD
Subtrao simples, dupla SUBS, SUBT SUB.S, SUB.D FSUB FSUB/dbl FSUBS, FSUB FSUBS, FSUBD
Multiplicao simples, dupla MULS, MULT MUL.S, MUL.D FMPY FMPY/dbl FMULS, FMUL FMULS, FMULD
Diviso simples, dupla DIVS, DIVT DIV.S, DIV.D FDIV, FDIV/dbl FDIVS, FDIV FDIVS, FDIVD
Comparao CMPT_ (=, <, C_.S, C_.D FCMP, FCMP/dbl FCMP FCMPS, FCMPD
<=, UN) (<, >, <=, (<, =, >)
>=, =,...)
Movimentao R-R ADDT Fd, MOV.S, MOV.D FCPY FMV FMOVS/D/Q
F31, Fs
Converso de (simples, dupla, CVTST, CVT.S.D, FCNVFF,s,d , FSTOD,
inteiro) em (simples, CVTTS, CVT.D.S, FCNVFF,d,s FRSP, FDTOS,
dupla, inteiro) CVTTQ, CVT.S.W, FCNVXF,s,s , FSTOI,
CVTQS, CVT.D.W, FCNVXF,d,d FCTIW, FDTOI,
CVTQT CVT.W.S, FCNVFX,s,s , FITOS,
CVT.W.D FCNVFX,d,s FITOD
Figura C.12 Instrues de ponto flutuante de RISCs de desktop equivalentes ao ncleo do MIPS. Traos significam que a operao
no est disponvel nessa arquitetura ou no sintetizada em poucas instrues. Se houver vrias opes de instrues equivalentes ao n-
cleo do MIPS, elas estaro separadas por vrgulas.

Convenes Alpha MIPS64 PA-RISC 2.0 PowerPC SPARC v.9

Registrador com valor 0 r31 (origem) r0 r0 r0 r0


(endereamento)
Registrador de endereo (qualquer) r31 r2, r31 link (especial) r31
de retorno
No-op LDQ_U r31,... SLL r0, r0, r0 OR r0, r0, r0 ORI r0, r0, #0 SETHI r0, 0
Mover inteiro R-R BIS..., r31,... ADD..., r0,... OR..., r0,... OR rx, ry, ry OR..., r0,...
Ordem de operandos OP Rs1, Rs2, Rd OP Rd, Rs1, Rs2 OP Rs1, Rs2, Rd OP Rd, Rs1, Rs2 OP Rs1, Rs2, Rd
Figura C.13 Convenes de arquiteturas RISC de desktop equivalentes ao ncleo do MIPS.

Nome da instruo ARM v.4 Thumb SuperH M32R MIPS16

Transferncia de dados (formatos de instrues) DT DT DT DT DT


Carregar byte com sinal LDRSB LDRSB MOV.B LDB LB
Carregar byte sem sinal LDRB LDRB MOV.B; EXTU.B LDUB LBU
Carregar meia palavra com sinal LDRSH LDRSH MOV.W LDH LH
Carregar meia palavra sem sinal LDRH LDRH MOV.W; EXTU.W LDUH LHU
Carregar palavra LDR LDR MOV.L LD LW
Armazenar byte STRB STRB MOV.B STB SB
Armazenar meia palavra STRH STRH MOV.W STH SH
Armazenar palavra STR STR MOV.L ST SW
1
Ler, gravar registradores especiais MRS, MSR LDC, STC MVFC, MVTC MOVE
Figura C.14 Instrues de transferncia de dados de RISCs embutidos equivalentes ao ncleo do MIPS. Uma seqncia de instru-
es para sintetizar uma instruo MIPS mostrada separada por sinais de ponto-e-vrgula. Observe que, em geral, o ponto flutuante no
definido para os RISCs embutidos. O Thumb e o MIPS16 so apenas subconjuntos de instrues de 16 bits das arquiteturas ARM e MIPS; as-
sim, as mquinas podem trocar de modos e executar o conjunto de instrues completo. Utilizamos 1 para mostrar seqncias que esto
disponveis em modo de 32 bits, mas no em modo de 16 bits no Thumb ou no MIPS16.
10 Apndice C Uma pesquisa de arquiteturas RISC para computadores desktop, servidores e embutidos

Aritmtica/lgica (formatos de
instrues) R-R, R-I R-R, R-I R-R, R-I R-R, R-I R-R, R-I

Nome da instruo ARM v.4 Thumb SuperH M32R MIPS16

Adio ADD ADD ADD ADD, ADDI, ADDU, ADDIU


ADD3
Adio (armadilha se estouro) ADDS; SWIVS ADD; BVC ADDV ADDV, ADDV3 1
.+4; SWI
Subtrao SUB SUB SUB SUB SUBU
Subtrao (armadilha se estouro) SUBS; SWIVS SUB; BVC SUBV SUBV 1
.+1; SWI
Multiplicao MUL MUL MUL MUL MULT, MULTU
Multiplicao (armadilha se estouro)
Diviso DIV1, DIVoS, DIV, DIVU DIV, DIVU
DIVoU
Diviso (armadilha se estouro)
E AND AND AND AND, AND3 AND
Ou ORR ORR OR OR, OR3 OR
Xor EOR EOR XOR XOR, XOR3 XOR
Carregar registrador parte alta SETH 1
Deslocamento lgico esquerda LSL3 LSL2 SHLL, SHLLn SLL, SLLI, SLLV, SLL
SLL3
Deslocamento lgico direita LSR3 LSR2 SHRL, SHRLn SRL, SRLI, SRLV, SRL
SRL3
Deslocamento aritmtico direita ASR3 ASR2 SHRA, SHAD SRA, SRAI, SRAV, SRA
SRA3
Comparao CMP,CMN, CMP, CMN, CMP/cond, CMP/I, CMP/I2, SLT/I,
TST,TEQ TST TST CMPU/I SLT/IU
Figura C.15 Instrues aritmticas/lgicas de RISCs embutidos equivalentes ao ncleo do MIPS. Traos significam que a opera-
o no est disponvel nessa arquitetura ou no sintetizada em poucas instrues. Tal seqncia de instrues mostrada separa-
damente por sinais de ponto-e-vrgula. Se houver vrias opes de instrues equivalentes ao ncleo do MIPS, elas estaro separadas
por vrgulas. O Thumb e o MIPS16 so apenas subconjuntos de instrues de 16 bits das arquiteturas ARM e MIPS; assim, as mquinas
podem trocar de modos e executar o conjunto de instrues completo. Utilizamos 1 para mostrar seqncias que esto disponveis
em modo de 32 bits, mas no em modo de 16 bits no Thumb ou no MIPS16. O sobrescrito 2 mostra novas instrues encontradas ape-
nas em modo de 16 bits do Thumb ou do MIPS16, como CMP/I2. O ARM inclui deslocamentos como parte de cada instruo de opera-
o de dados, e assim os deslocamentos com o sobrescrito 3 so simplesmente uma variao de uma instruo de movimentao,
como LSR3.

Controle (formatos de instruo) B, J, C B, J, C B, J, C B, J, C B, J, C

Nome da instruo ARM v.4 Thumb SuperH M32R MIPS16

Desviar em comparao de inteiros B/cond B/cond BF, BT BEQ, BNE, BEQZ2 , BNEZ2 ,
BC,BNC, B__Z BTEQZ2 , BTNEZ2
Salto, registrador de salto MOV pc,ri MOV pc,ri BRA, JMP BRA, JMP B2 , JR
Chamada, registrador de chamada BL BL BSR, JSR BL, JL JAL, JALR, JALX2
Armadilha SWI SWI TRAPA TRAP BREAK
1
Retorno de interrupo MOVS pc, r14 RTS RTE 1
Figura C.16 Instrues de controle de RISCs embutidos equivalentes ao ncleo do MIPS. O Thumb e o MIPS16 so apenas sub-
conjuntos de instrues de 16 bits das arquiteturas ARM e MIPS; assim, as mquinas podem trocar de modos e executar o conjunto de
instrues completo. Utilizamos 1 para mostrar seqncias que esto disponveis em modo de 32 bits, mas no em modo de 16 bits
no Thumb ou no MIPS16. O sobrescrito 2 mostra novas instrues encontradas apenas em modo de 16 bits do Thumb ou do MIPS16,
como BTEQZ2.
C.3 Instrues: o subconjunto do ncleo do MIPS 11

Convenes ARM v.4 Thumb SuperH M32R MIPS16

Reg. de endereo de retorno R14 R14 PR (especial) R14 RA (especial)


No-op MOV r0,r0 MOV r0,r0 NOP NOP SLL r0, r0
Operandos, ordem OP Rd, Rs1, Rs2 OP Rd, Rs1 OP Rs1, Rd OP Rd, Rs1 OP Rd, Rs1, Rs2
Figura C.17 Convenes de instrues de RISCs embutidos equivalentes ao ncleo do MIPS.

es de 64 bits; um desvio que testa o contedo de um registrador e executa o desvio se o valor =, no=, <, <=,
>= ou <= 0 (veja o MIPS a seguir); outros trs conjuntos de cdigos de condio de ponto flutuante; e instrues
de desvio que codificam a previso de desvio esttico.
O PowerPC tambm utiliza quatro cdigos de condio: menor que, maior que, igual e estouro de sumrio,
mas tem oito cpias desse cdigos. Essa redundncia permite que as instrues do PowerPC utilizem cdigos
de condio diferentes sem conflito, dando essencialmente oito registradores de 4 bits extras ao PowerPC.
Qualquer desses oito cdigos de condio pode ser o destino de uma instruo de comparao, e qualquer deles
pode ser a origem de um desvio condicional. As instrues de inteiros tm um bit de opo que se comporta
como se a operao de inteiros fosse seguida por uma comparao com zero que define o primeiro registrador
de condio. O PowerPC tambm permite que o segundo registrador seja definido opcionalmente por instru-
es de ponto flutuante. O PowerPC fornece operaes lgicas entre esses oito registradores de cdigos de con-
dio de 4 bits (CRAND, CROR, CRXOR, CRNAND, CRNOR, CREQV), permitindo que condies mais complexas sejam tes-
tadas por um nico desvio.
O MIPS utiliza o contedo de registradores para avaliar desvios condicionais. Dois registradores quaisquer
podem ser comparados em termos de igualdade (BEQ) ou desigualdade (BNE), e depois o desvio ser seguido se a
condio for vlida. As instrues de definio se menor que (SLT, SLTI, SLTU, SLTIU) comparam dois operandos
e, em seguida, definem o registrador de destino como 1 se menor e 0 em caso contrrio. Essas instrues so su-
ficientes para sintetizar todo o conjunto de relaes. Devido popularidade das comparaes a 0, o MIPS inclui
instrues especiais de comparao e desvio para todas essas comparaes: maior que ou igual a zero (BGEZ),
maior que zero (BGTZ), menor que ou igual a zero (BLEZ) e menor que zero (BLTZ). claro que igual e no-igual a
zero podem ser sintetizadas usando-se r0 com BEQ e BNE. Como o SPARC, o MIPS I utiliza um cdigo de condi-
o para ponto flutuante com instrues separadas de comparao e desvio de ponto flutuante; o MIPS IV ex-
pandiu essas instrues para oito cdigos de condio de ponto flutuante, com as comparaes de ponto flutu-
ante e as instrues de desvio especificando a condio a definir ou testar.
As comparaes do Alpha (CMPEQ, CMPLT, CMPLE, CMPULT, CMPULE) testam dois registradores e definem um ter-
ceiro como 1 se a condio for verdadeira, e como 0 em caso contrrio. As comparaes de ponto flutuante
(CMTEQ, CMTLT, CMTLE, CMTUN) definem o resultado como 2,0 se a condio for vlida e como 0 em caso contrrio.
As instrues de desvio comparam um registrador a 0 (BEQ, BGE, BGT, BLE, BLT, BNE) ou seu bit menos significati-
vo a 0 (BLBC, BLBS), e depois efetuam o desvio se a condio for vlida.
O PA-RISC tem muitas opes de desvio, que veremos na Seo C.8. A mais direta uma instruo de com-
parao e desvio (COMB), que compara dois registradores, efetua o desvio dependendo das relaes padro, e de-
pois testa o bit menos significativo do resultado da comparao.
O ARM semelhante ao SPARC, no sentido de fornecer quatro cdigos de condio tradicionais que so op-
cionalmente definidos. CMP subtrai um operando do outro e a diferena define os cdigos de condio. A com-
parao negativa (CMN) soma um operando ao outro, e a soma define os cdigos de condio. TST executa o
AND lgico sobre os dois operandos, a fim de definir todos os cdigos de condio com exceo do estouro, en-
quanto TEQ utiliza o OR exclusivo para definir os trs primeiros cdigos de condio. Como o SPARC, a verso
condicional da instruo de desvio do ARM testa os cdigos de condio para determinar todas as relaes pos-
sveis sem sinal e com sinal. Como veremos na Seo C.9, um recurso incomum do ARM que toda instruo
tem a opo de execuo condicional, dependendo dos cdigos de condio. (Isso guarda semelhanas com a
opo de anulao de PA-RISC, como vimos na Seo C.8.)
No surpreende que o Thumb siga o ARM. As diferenas so: a configurao de cdigos de condio no
opcional, a instruo TEQ foi descartada e no existe nenhuma execuo condicional de instrues.
O Hitachi SuperH utiliza uma nica condio de bit T definida pela comparao de instrues. Duas instru-
es de desvio decidem efetuar o desvio se o bit T for 1 (BT) ou se o bit T for 0 (BF). As duas variedades de des-
vios permitem menor nmero de instrues de comparao.
12 Apndice C Uma pesquisa de arquiteturas RISC para computadores desktop, servidores e embutidos

O Mitsubishi M32R tambm oferece um nico bit de cdigo de condio (C) utilizado em comparaes com
sinal e sem sinal (CMP, CMPI, CMPU, CMPUI) para verificar se um registrador menor que o outro ou no, de modo
semelhante s instrues de definio se menor que do MIPS. Duas instrues de desvio testam se o bit C 1 ou
0: BC e BNC. O M32R tambm inclui instrues para desvio em caso de igualdade ou desigualdade de registrado-
res (BEQ e BNE), e todas as relaes de um registrador para 0 (BGEZ, BGTZ, BLEZ, BLTZ, BEQZ, BNEZ). Diferentes de BC
e BNC, essas ltimas instrues tm todas 32 bits de largura.
O MIPS16 mantm instrues de definio se menor que (SLT, SLTI, SLTU, SLTIU) mas, em vez de inserir o re-
sultado em um dos oito registradores, ele inserido em um registrador especial denominado T. O MIPS16
sempre implementado em mquinas que tambm tm o conjunto completo de instrues e registradores MIPS
de 32 bits; conseqentemente, o registrador T na realidade o registrador 24 na arquitetura MIPS completa. As
instrues de desvio do MIPS16 testam se um registrador ou no igual a zero (BEQZ e BNEZ). Tambm existem ins-
trues que efetuam o desvio se o registrador T ou no igual a zero (BTEQZ e BTNEZ). Para testar se dois registra-
dores so iguais, o MIPS acrescentou instrues de comparao (CMP, CMPI) que calculam o OR exclusivo de
dois registradores e inserem o resultado no registrador T. A comparao foi acrescentada porque o MIPS16
omitia instrues que efetuam a comparao e o desvio se os registradores so iguais ou no (BEQ e BNE).
As Figuras C.18 e C.19 resumem os esquemas usados para desvios condicionais.

C.4 Instrues: extenses de multimdia dos RISCs de desktop/servidores


Tendo em vista que, por definio, cada microprocessador desktop tem seus prprios modos grficos de vdeo,
medida que os oramentos em transistores cresceram, tornou-se inevitvel a incluso de suporte para opera-
es de grficos. Muitos sistemas grficos utilizam 8 bits para representar cada uma das trs cores primrias, e
mais 8 bits para representar a posio de um pixel.
A adio de alto-falantes e microfones para teleconferncia e videogames tambm sugeriu suporte de som.
As amostras de udio necessitam de uma preciso de mais de 8 bits, mas 16 bits so suficientes.
Todo microprocessador tem suporte especial para que bytes e meias palavras ocupem menos espao quando
armazenados na memria, mas, devido pouca freqncia das operaes aritmticas sobre esses tamanhos de

Alpha MIPS64 PA-RISC 2.0 PowerPC SPARC v.9

Nmero de bits de cdigo de 0 8 FP 8 FP 8 4 ambos 2 4 inteiros,


condio (inteiros e FP) 4 2 FP
Instrues bsicas de 1 inteiros, 1 FP 1 inteiros, 1 FP 4 inteiros, 2 FP 4 inteiros, 2 FP 1 FP
comparao (inteiros e FP)
Instrues bsicas de desvio 1 2 inteiros, 1 FP 7 inteiros 1 ambos 3 inteiros, 1 FP
(inteiros e FP)
Comparar registrador a =, no= =, no=, <, <=, >,
registrador/const e desviar >=, par, mpar
Comparar registrador a zero e =, no=, <, <=, >, =, no=, <, =, no=, <, <=, >, =, no=, <,
desviar >=, par, mpar <=, >, >= >=, par, mpar <=, >, >=
Figura C.18 Resumo de cinco abordagens RISC de desktop para desvios condicionais. O desvio de ponto flutuante no PA-RISC rea-
lizado copiando-se o registrador de status de FP em um registrador de inteiros, e depois usando-se o desvio em instruo de bit para testar
o bit de comparao de FP. A comparao de inteiros no SPARC sintetizada com uma instruo aritmtica que define os cdigos de condi-
o usando r0 como destino.

ARM v.4 Thumb SuperH M32R MIPS16

Nmero de bits de cdigo de condio 4 4 1 1 1


Instrues bsicas de comparao 4 3 2 2 2
Instrues bsicas de desvio 1 1 2 3 2
Comparar registrador a registrador/const e desviar =, >, >= =, no=
Comparar registrador a zero e desviar =, >, >= =, no=, <, <=, >, >= =, no=
Figura C.19 Resumo de cinco abordagens RISC embutidas para desvios condicionais.
C.4 Instrues: extenses de multimdia dos RISCs de desktop/servidores 13

dados em programas tpicos de inteiros, h pouco suporte alm de transferncias de dados. Os arquitetos do
Intel i860, que se justificou como um acelerador grfico na empresa, reconheciam que muitas aplicaes grfi-
cas e de udio executariam a mesma operao sobre vetores desses dados. Embora uma unidade vetorial esti-
vesse alm do oramento de transistores do i860 em 1989, o particionamento das cadeias de transporte dentro
de uma ULA de 64 bits (veja a Seo H.8) permitiria que ele executasse operaes simultneas sobre vetores
curtos de oito operandos de 8 bits, de quatro operandos de 16 bits ou de dois operandos de 32 bits. O custo des-
sas ULAs particionadas era pequeno. Aplicaes que se prestam a tal suporte incluem MPEG (vdeo), jogos
como DOOM (elementos grficos tridimensionais), Adobe Photoshop (fotografia digital) e teleconferncia
(processamento de udio e de imagens).
Como um vrus, com o tempo esse suporte de multimdia se disseminou para quase todos os microprocessa-
dores desktop. O HP foi o primeiro RISC de desktop bem-sucedido a incluir tal suporte. Como veremos, esse
vrus se espalhou de modo desigual. O PowerPC o nico a resistir, mas h rumores de que essa expanso est
virando uma febre.
Essas extenses foram chamadas paralelismo de subpalavra, vetor ou SIMD (instruo nica, vrios dados),
como mostra o Captulo 2. Tendo em vista que o marketing da Intel utiliza a sigla SIMD para descrever a exten-
so MMX do 80x86, esse nome se tornou popular. A Figura C.20 resume o suporte por arquitetura.
A partir da Figura C.20, podemos observar que geralmente o MIPS MDMX funciona em 8 bytes ou 4 meias
palavras por instruo, que o HP PA-RISC MAX2 funciona em 4 meias palavras, que o SPARC VIS funciona em
4 meias palavras ou 2 palavras e que o Alpha no tem essas opes. As operaes do Alpha MAX so apenas ver-
ses em bytes de operaes de comparao, valor mnimo, valor mximo e diferena absoluta, deixando para o
software a responsabilidade de isolar campos e executar adies, subtraes e multiplicaes paralelas sobre
bytes e meias palavras. O MIPS tambm acrescentou operaes para atuar sobre dois operandos de ponto flutu-
ante de 32 bits por ciclo, mas elas so consideradas parte do MIPS V e no simples extenses de multimdia
(veja a Seo C.7).

Categoria de instruo Alpha MAX MIPS MDMX PA-RISC MAX2 PowerPC SPARC VIS

Adio/subtrao 8B, 4H 4H 4H, 2W


Adio/subtrao saturante 8B, 4H 4H
Multiplicao 8B, 4H 4B/H
Comparao 8B (>=) 8B, 4H (=,<,<=) 4H, 2W (=, no=,
>, <=)
Deslocamento direita/esquerda 8B, 4H 4H
Deslocamento aritmtico direita 4H 4H
Multiplicao e adio 8B, 4H
Deslocamento e adio (saturante) 4H
E/ou/xor 8B, 4H, 2W 8B, 4H, 2W 8B, 4H, 2W 8B, 4H, 2W
Diferena absoluta 8B 8B
Mx/mn 8B, 4W 8B, 4H
Compactar (2n bits > n bits) 2W->2B, 4H->4B 2*2W->4H, 2*4H->8B 2W->2H,
2*4H->8B 2W->2B,
4H->4B
Descompactar/mesclar 2B->2W, 4B->4H 2*4B->8B, 4B->4H,
2*2H->4H 2*4B->8B
Permutar/embaralhar 8B, 4H 4H
Conjuntos de registradores Inteiros Fl. Pt. + 192b Acc., Inteiros Fl. Pt.
Figura C.20 Resumo de suporte de multimdia para RISCs de desktop. B significa byte (8 bits), H quer dizer meia palavra (16 bits) e W
representa uma palavra (32 bits). Desse modo, 8B significa uma operao sobre 8 bytes em uma nica instruo. O empacotamento e o de-
sempacotamento utilizam a notao 2*2W para indicar dois operandos cada um com duas palavras. Observe que MDMX tem operaes
vetoriais/escalares, onde o escalar especificado como um elemento de um dos registradores vetoriais. Esta tabela uma simplificao das
arquiteturas de multimdia completas, omitindo muitos detalhes. Por exemplo, o MIPS MDMX inclui instrues que realizam a multiplexa-
o entre dois operandos, o HP MAX2 inclui uma instruo para calcular mdias, e o SPARC VIS inclui instrues para definir registradores
como constantes. Alm disso, esta tabela no inclui a operao de alinhamento de memria do MDMX, do MAX e do VIS.
14 Apndice C Uma pesquisa de arquiteturas RISC para computadores desktop, servidores e embutidos

Uma caracterstica normalmente no encontrada em microprocessadores de uso geral so as operaes satu-


rantes. Saturao significa que, ao ocorrer um estouro de clculo, o resultado definido como o maior nmero
positivo ou o nmero mais negativo, em vez de um clculo de mdulo como na aritmtica de complemento de
dois. Comumente encontradas em processadores de sinais digitais (veja a prxima seo), essas operaes sa-
turantes so teis em rotinas de filtragem.
Essas mquinas utilizavam extensamente conjuntos de registradores existentes para guardar operandos: re-
gistradores de inteiros para o Alpha e o HP PA-RISC, e registradores de ponto flutuante para MIPS e SUN. Con-
seqentemente, as transferncias de dados so realizadas com instrues padro de carga e armazenamento. O
MIPS tambm acrescentou um registrador largo de 192 bits (3*64) para atuar como um acumulador em algu-
mas operaes. Tendo 3 vezes a largura de dados nativos, ele pode ser particionado para acumular 8 bytes com
24 bits por campo ou 4 meias palavras com 48 bits por campo. Esse acumulador largo pode ser utilizado em ins-
trues de adio, subtrao e multiplicao/adio. O MIPS proclama vantagens de desempenho de 2 a 4 vezes
para o acumulador.
Talvez a concluso surpreendente dessa tabela seja a falta de consistncia. As nicas operaes encontradas
em todas quatro so as operaes lgicas (AND, OR, XOR), que no necessitam de uma ULA particionada. Se omi-
tirmos o frugal Alpha, as nicas operaes comuns restantes sero adies e subtraes em paralelo sobre 4
meias palavras.
Cada fabricante declara que essas instrues se destinam ao uso em bibliotecas de sub-rotinas otimizadas
manualmente, um plano que dever ser seguido, pois seria desafiante um compilador que funcionasse bem
com as extenses de multimdia de todos os RISCs de desktop.

C.5 Instrues: extenses de processamento de sinais digitais


dos RISCs embutidos
Uma caracterstica encontrada em toda arquitetura de processador de sinais digitais (DSP digital signal proces-
sor) o suporte para operaes de multiplicao-acumulao de inteiros. As multiplicaes tendem a ser realiza-
das sobre palavras mais curtas que inteiros regulares, como os de 16 bits, e o acumulador tende a ser sobre pala-
vras mais longas, como as de 64 bits. A razo para a multiplicao-acumulao a necessidade de implementar de
forma eficiente filtros digitais, comuns em aplicaes de DSPs. Tendo em vista que o Thumb e o MIPS16 so ar-
quiteturas de subconjuntos, eles no oferecem tal suporte. Em vez disso, os programadores devem utilizar as ex-
tenses de DSP ou multimdia encontradas nas instrues do modo de 32 bits do ARM e do MIPS64.
A Figura C.21 mostra o tamanho da multiplicao, o tamanho do acumulador, e ainda as operaes e os no-
mes de instrues correspondentes aos RISCs embutidos. Mquinas com tamanhos de acumuladores maiores
que 32 e menores que 64 bits foraro os bits superiores a permanecer como bits de sinal, saturando assim a
adio para definir valores de ponto fixo como mximos e mnimos, se as operaes provocarem estouro.

ARM v.4 Thumb SuperH M32R MIPS16

Tamanho da multiplicao 32B 32B 32B 32B, 32B 16B,


16B 16B 16B 16B
Tamanho de acumulador 32B/64B 32B/42B, 48B/64B 56B
Nome de acumulador Qualquer GPR ou MACH, MACL ACC
pares de GPRs
Operaes Produto de Produto de 32B + acumulao Produto de 32B/48B +
32B/64B + de 42B/32B (operandos na acumulao de 64B,
acumulao de memria); produto de 64B + arredondamento,
64B com acumulao de 64B/48B movimentao
sinal/sem sinal (operandos na memria);
limpa MAC
Nomes de instrues MLA, SMLAL, MAC, MACS, MAC.L, MACHI/MACLO, MACWHI/
correspondentes UMLAL MAC.LS, CLRMAC MACWLO, RAC, RACH,
MVFACHI/MVFACLO,
MVTACHI/MVTACLO
Figura C.21 Resumo de cinco abordagens RISC embutidas para multiplicao-acumulao.
C.6 instrues: extenses comuns para o ncleo do mips 15

C.6 instrues: extenses comuns para o ncleo do mips


As Figuras C.22 a C.28 listam instrues no encontradas nas Figuras C.9 a C.17, nas mesmas quatro catego-
rias. As instrues so inseridas nessas listas se aparecem em mais de uma das arquiteturas padro. As instru-
es so definidas com o uso da linguagem de descrio de hardware definida na Figura C.29.
Embora a maioria das categorias seja auto-explicativa, alguns comentrios so importantes:
n A linha troca atmica significa uma primitiva que pode trocar um registrador com a memria sem inter-
rupo. Isso til para semforos do sistema operacional em um monoprocessador, como tambm para sin-
cronizao de multiprocessadores (veja a Seo 6.7).
n As linhas de transferncia de dados de 64 bits e operao mostram como o MIPS, o PowerPC e o SPARC defi-
nem operaes de endereamento de 64 bits e operaes de inteiros. O SPARC simplesmente define todas as
operaes de registradores e endereamento como operaes de 64 bits, adicionando apenas instrues es-
peciais para deslocamentos, transferncias de dados e desvios de 64 bits. O MIPS inclui as mesmas extenses
e, alm disso, acrescenta instrues aritmticas separadas de 64 bits com sinal. O PowerPC inclui operaes
de deslocamento direita de 64 bits, carga, armazenamento, diviso e comparao, e tem ainda um modo se-
parado determinando se as instrues sero interpretadas como operaes de 32 ou 64 bits; operaes de 64
bits no funcionaro em uma mquina que admitir apenas o modo de 32 bits. O PA-RISC foi expandido para
endereamento e operaes de 64 bits na verso 2.0.

Nome Definio Alpha MIPS64 PA-RISC 2.0 PowerPC SPARC v.9

Troca atmica R/M Temp<---Rd; Rd<---Mem[x]; LDL/Q_L; LL; SC (ver C.8) LWARX; CASA, CASX
(para bloqueios Mem[x]<---Temp STL/Q_C STWCX
e semforos)
Carregar inteiro Rd<---64 Mem[x] LDQ LD LDD LD LDX
de 64 bits
Armazenar inteiro Mem[x]<---64 Rd STQ SD STD STD STX
de 64 bits
Carregar inteiro de Rd32..63 <---32 Mem[x]; LDL; LWU LDW LWZ LDUW
32 bits sem sinal Rd0..31 <---32 0 EXTLL
Carregar inteiro de Rd32..63 <---32 Mem[x]; LDL LW LDW; EXTRD,S LWA LDSW
32 bits com sinal Rd0..31 <---32 Mem[x]032 63, 8
Pr-busca Cache[x]<---sugesto FETCH, PREF, LDD, r0 DCBT, PRE-FETCH
FETCH_M* PREFX LDW, r0 DCBTST
Carregar Co-processador<--- Mem[x] LWCi CLDWX, CLDWS
co-processador
Armazenar Mem[x]<--- Co-processador SWCi CSTWX, CSTWS
co-processador
Endian (Big/Little Endian?) Qualquer Qualquer Qualquer Qualquer Qualquer
Esvaziamento de (Esvaziar bloco de cache ECB CP0op FDC, FIC DCBF FLUSH
cache neste endereo)
Sincronizao de (Todas as transferncias de WMB SYNC SYNC SYNC MEMBAR
memria dados anteriores se
compartilhada completam antes de a
prxima transferncia de
dados poder comear)
Figura C.22 Instrues de transferncia de dados no encontradas no ncleo do MIPS, mas encontradas em duas ou mais das
cinco arquiteturas desktop. O par de instrues de carga vinculada/armazenamento condicional d ao Alpha e ao MIPS operaes atmi-
cas por semforos, permitindo que os dados sejam lidos a partir da memria, modificados e armazenados, sem receio de interrupes ou
de acesso aos dados por outras mquinas em um multiprocessador (veja o Captulo 6). No Alpha, a pr-busca para caches externas reali-
zada com FETCH e FETCH_M; as pr-buscas de cache no chip utilizam LD_Q A, R31 e LD_Y A. F31 usado no Alpha 21164 (consulte Bhandar-
kar [1995], p. 190).
16 Apndice C Uma pesquisa de arquiteturas RISC para computadores desktop, servidores e embutidos

Nome Definio Alpha MIPS64 PA-RISC 2.0 PowerPC SPARC v.9

Operaes aritmticas de Rd<---64 Rs1 op64 Rs2 ADD, SUB, DADD, DSUB ADD, SUB, ADD, SUBF, ADD, SUB,
inteiros de 64 bits MUL DMULT, DDIV SHLADD, DS MULLD, DIVD MULX,
S/UDIVX
Operaes lgicas de Rd<---64 Rs1 op64 Rs2 AND, OR, AND, OR, AND, OR, AND, OR, AND, OR,
inteiros de 64 bits XOR XOR XOR XOR XOR
Deslocamentos de 64 bits Rd<---64 Rs1 op64 Rs2 SLL, SRA, DSLL/V, DEPD,Z SLD, SRAD, SLLX, SRAX,
SRL DSRA/V, EXTRD,S SRLD SRLX
DSRL/V EXTRD,U
Movimentao condicional if (cond) Rd<---Rs CMOV_ MOVN/Z SUBc, n; ADD MOVcc, MOVr
Suporte para adio de CarryOut, Rd <--- Rs1 + ADU; SLTU; ADDC ADDC, ADDcc
inteiros de vrias palavras Rs2 + OldCarryOut ADDU, DADU; ADDE
SLTU; DADDU
Suporte para subtrao de CarryOut, Rd <--- Rs1 SUBU; SLTU; SUBB SUBFC, SUBcc
inteiros de vrias palavras Rs2 + OldCarryOut SUBU, DSUBU; SUBFE
SLTU; DSUBU
E no Rd <--- Rs1 & ~(Rs2) BIC ANDCM ANDC ANDN
Ou no Rd <--- Rs1 | ~(Rs2) ORNOT ORC ORN
Adio de imediato alto Rd0..15 <---Rs10..15 + ADDIL ADDIS
(Const<<16); (R-I) (R-I)
Operaes do (Definidas por COPi COPR,i IMPDEPi
co-processador co-processador)
Figura C.23 Instrues aritmticas/lgicas no encontradas no ncleo do MIPS, mas encontradas em duas ou mais das cinco ar-
quiteturas desktop.

Nome Definio Alpha MIPS64 PA-RISC 2.0 PowerPC SPARC v.9

Desvios retardados (Desvio nem sempre BEQL, BNEL, COMBT, n, BPcc, A,


otimizados retardado) B_ZL (<, >, COMBF, n FPBcc, A
<=, >=)
Armadilha condicional if (COND) {R31<---PC; T_,,T_I, SUBc, n; TW, TD, Tcc
PC <---0..0#i} (=, no=, BREAK TWI, TDI
<, >, <=, >=)
Nmero de registradores Regs variados (memria 6 equiv. 12 32 33 29
de controle virtual, interrupes,...)
Figura C.24 Instrues de controle no encontradas no ncleo do MIPS, mas encontradas em duas ou mais das cinco arquitetu-
ras desktop.

Nome Definio Alpha MIPS64 PA-RISC 2.0 PowerPC SPARC v.9

Multiplicao e adio Fd <--- ( Fs1 Fs2) + Fs3 MADD.S/D FMPYFADD FMADD/S


sgl/dbl
Multiplicao e subtrao Fd <--- ( Fs1 Fs2) Fs3 MSUB.S/D FMSUB/S
Neg mult e adio Fd <--- -(( Fs1 Fs2) + Fs3) NMADD.S/D FMPYFNEG FNMADD/S
sgl/dbl
Neg mult e subtrao Fd <--- -(( Fs1 Fs2) Fs3) NMSUB.S/D FNMSUB/S
Raiz quadrada Fd <--- SQRT(Fs) SQRT_ SQRT.S/D FSQRT FSQRT/S FSQRTS/D
sgl/dbl
Movimentao if (cond) Fd<---Fs FCMOV_ MOVF/T, FTESTFCPY FMOVcc
condicional MOVF/T.S/D
Negao Fd <--- Fs ^ x80000000 CPYSN NEG.S/D FNEG FNEG FNEGS/D/Q
sgl/dbl
Valor absoluto Fd <--- Fs & x7FFFFFFF ABS.S/D FABS/dbl FABS FABSS/D/Q
Figura C.25 Instrues de ponto flutuante no encontradas no ncleo do MIPS, mas encontradas em duas ou mais das cinco ar-
quiteturas desktop.
C.6 instrues: extenses comuns para o ncleo do mips 17

Nome Definio ARM v.4 Thumb SuperH M32R MIPS16

Troca atmica Temp<---Rd; SWP, SWPB 1 (ver TAS) LOCK; UNLOCK 1


R/M (para Rd<---Mem[x];
semforos) Mem[x]<---Temp
Unidade de Converso de endereo Instrues via 1 LDTLB 1
gerenciamento paginada co-processador
da memria
Endian (Big/Little Endian?) Qualquer Qualquer Qualquer Grande Qualquer
Figura C.26 Instrues de transferncia de dados no encontradas no ncleo do MIPS, mas encontradas em duas ou mais das
cinco arquiteturas embutidas. Usamos 1 para mostrar seqncias que esto disponveis no modo de 32 bits, mas no no modo de 16
bits no Thumb ou no MIPS16.

Nome Definio ARM v.4 Thumb SuperH M32R MIPS16

Carregar imediato Rd<---Imm MOV MOV MOV, MOVA LDI, LD24 LI


Suporte para adio de CarryOut, Rd <--- Rd + ADCS ADC ADDC ADDX 1
inteiros de vrias palavras Rs1 + OldCarryOut
Suporte para subtrao de CarryOut, Rd <--- Rd SBCS SBC SUBC SUBX 1
inteiros de vrias palavras Rs1 + OldCarryOut
Negao Rd <--- 0 Rs1 NEG2 NEG NEG NEG
No Rd <--- ~(Rs1) MVN MVN NOT NOT NOT
Movimentao Rd <--- Rs1 MOV MOV MOV MV MOVE
Girar direita Rd<--- i de Rs, >> ROR ROR ROTR
Rd0. . . i1 <--- Rs31i. . . 31
E no Rd <--- Rs1 & ~(Rs2) BIC BIC
Figura C.27 Instrues aritmticas/lgicas no encontradas no ncleo do MIPS, mas encontradas em duas ou mais das cinco ar-
quiteturas embutidas. Usamos 1 para mostrar seqncias que esto disponveis no modo de 32 bits, mas no no modo de 16 bits no
Thumb ou no MIPS16. O sobrescrito 2 mostra novas instrues encontradas apenas no modo de 16 bits do Thumb ou do MIPS16, como
NEG2.

Nome Definio ARM v.4 Thumb SuperH M32R MIPS16

No. de registradores de controle Registradores variados 21 29 9 5 36


Figura C.28 Informaes de controle nas cinco arquiteturas embutidas.

n A instruo de pr-busca fornece implementao um endereo e uma sugesto sobre os dados. As su-
gestes incluem o fato de os dados terem probabilidade de serem lidos ou gravados em breve, tenham pro-
babilidade de serem lidos ou gravados somente uma vez ou tenham a probabilidade de serem lidos ou gra-
vados muitas vezes. A pr-busca no causa excees. O MIPS tem uma verso que soma dois registradores
para obter o endereo correspondente a programas de ponto flutuante, diferente dos programas MIPS que
no so de ponto flutuante. (Consulte a Seo 5.6 para aprender mais sobre a pr-busca.)
n Na linha Endian, Big/Little significa que existe um bit no registrador de status de programa que permi-
te ao processador agir como Big Endian ou Little Endian (veja a Seo 2.3). Isso pode ser feito simples-
mente complementando-se alguns dos bits menos significativos do endereo em instrues de transfern-
cia de dados.
n A linha sincronizao de memria compartilhada ajuda no caso de multiprocessadores com coerncia de
cache: todas as operaes de carga e armazenamento executadas antes da instruo devem se completar an-
tes de ser possvel iniciar as cargas e armazenamentos depois da instruo. (Consulte o Captulo 6.)
n A linha operaes do co-processador lista vrias categorias que permitem estender o processador com
hardware de uso especial.
18 Apndice C Uma pesquisa de arquiteturas RISC para computadores desktop, servidores e embutidos

Notao Significado Exemplo Significado

<-- Transferncia de dados. O comprimento Regs[R1]<--Regs[R2]; Contedo de transferncia de R2 para R1.


de transferncia dado pelo comprimento Os registradores tm um comprimento fixo;
do destino; o comprimento especificado assim, transferncias mais curtas que o
quando no claro. tamanho do registrador devem indicar
quais bits sero usados.
M Array de memria acessada em bytes. O Regs[R1]<--M[x]; Insere o contedo da posio de memria x
endereo inicial para uma transferncia em R1. Se uma transferncia comear em
indicado como o ndice para o array de M[i] e exigir 4 bytes, os bytes transferidos
memria. sero M[i], M[i+1], M[i+2] e M[i+3].
<--n Transfere um campo de n bits, usado M[y] = <--16M[x]; Transfere 16 bits, comeando na posio de
sempre que o comprimento de memria x para a posio de memria y. O
transferncia no claro. comprimento dos dois lados deve coincidir.
Xn Subscrito seleciona um bit. Regs[R1]0<--0; Altera o bit de sinal de R1 para 0. (Os bits
so numerados a partir de MSB, comeando
em 0.)
Xm..n Subscrito seleciona um campo. Regs[R3]24..31<--M[x]; Move o contedo da posio de memria x
para o byte de baixa ordem de R3.
Xn Sobrescrito reproduz um campo de bit. Regs[R3]0..23<--024; Define trs bytes de alta ordem de R3 como
0.
## Concatena dois campos. Regs[R3]<--024##M[x]; Move o contedo da posio x para o byte
F2##F3<--64M[x]; de baixa ordem de R3; limpa os trs bytes
superiores. Move 64 bits da memria a
partir da posio x; os primeiros 32 bits
entram em F2, os outros 32 bits vo para
F3.
*, & Desreferencia um ponteiro; obtm o p*<--&x; Atribui ao objeto apontado por p o
endereo de uma varivel. endereo da varivel x.
<<, >> Deslocamentos lgicos de C (esquerda, Regs[R1] << 5 Desloca R1 5 bits esquerda.
direita).
==, !=, >, Operadores relacionais de C; igual, (Regs[R1]==Regs[R2]) Verdadeiro se o contedo de R1 igual ao
<, >=, <= no-igual, maior, menor, maior ou igual, & contedo de R2, e se o contedo de R3 no
menor ou igual. (Regs[R3]!=Regs[R4]) igual ao contedo de R4.
&, |, ^, ! Operaes lgicas bit a bit de C: e, ou, ou (Regs[R1] & AND bit a bit de R1 e OR bit a bit de R2 e
exclusivo e complemento. (Regs[R2]| Regs[R3])) R3.
Figura C.29 Notao de descrio de hardware (e alguns operadores padro de C).

Uma diferena que precisa de uma explicao mais longa a que trata dos desvios otimizados. A Figura C.30
mostra as opes. O Alpha e o PowerPC oferecem desvios que tm efeito de imediato, como desvios em arquite-
turas anteriores. Para acelerar os desvios, essas mquinas utilizam a previso de desvio (veja a Seo 3.4). To-
dos os RISCs de desktop restantes oferecem desvios retardados (veja o Apndice A). Em geral, os RISCs embu-
tidos no admitem desvio retardado, com exceo do SuperH, que apresenta essa opo.
Os outros trs RISCs de desktop fornecem uma verso de desvio retardado que facilita o preenchimento do
slot de retardo. O desvio de anulao do SPARC executa a instruo no slot de retardo somente se o desvio
seguido; caso contrrio, a instruo anulada. Isso significa que a instruo no destino do desvio pode ser copia-
da com segurana no slot de retardo, pois ela s ser executada se o desvio for seguido. As restries so: o des-
tino no outro desvio, e o destino conhecido em tempo de compilao. (O SPARC tambm oferece um salto
no-retardado, porque um desvio incondicional com o bit de anulao ativo no executar a instruo seguin-
te.) Verses posteriores da arquitetura MIPS adicionaram uma instruo de desvio provvel que tambm anula
a prxima instruo se o desvio no seguido. O PA-RISC permite que quase toda instruo anule a instruo
seguinte, incluindo desvios. Sua opo de desvio de anulao executar a prxima instruo, dependendo da
orientao do desvio e do fato de ele ser seguido ou no (isto , se um desvio direto no-seguido ou se um des-
vio inverso seguido). Presume-se que essa opo tenha sido criada para otimizar loops, permitindo que as ins-
trues seguintes ao desvio de sada e ao desvio de loop sejam executadas no caso comum.
C.7 Instrues exclusivas do MIPS64 19

Anulao de desvio
Desvio (simples) Desvio retardado retardado

Encontrado em arquiteturas Alpha, PowerPC, ARM, Thumb, MIPS64, PA-RISC, MIPS64, SPARC PA-RISC
SuperH, M32R, MIPS 16 SPARC, SuperH
Executa instruo seguinte Somente se desvio no-seguido Sempre Somente se desvio Se desvio direto no-
seguido seguido ou desvio
inverso seguido
Figura C.30 O momento em que a instruo seguinte ao desvio executada, para trs tipos de desvios.

Agora que abordamos as semelhanas, vamos nos concentrar nas caractersticas exclusivas de cada arquite-
tura. Primeiro, vamos focalizar os RISCs de desktop/servidores, ordenando-os por comprimento da descrio
das caractersticas exclusivas, desde a descrio mais curta at a mais longa, e depois examinaremos os RISCs
embutidos.

C.7 Instrues exclusivas do MIPS64


O MIPS passou por cinco geraes de conjuntos de instrues e, em geral, essa evoluo acrescentou caracters-
ticas encontradas em outras arquiteturas. Aqui esto as caractersticas exclusivas mais destacadas do MIPS;
dentre as primeiras, vrias j existiam no conjunto de instrues original.

Transferncias de dados no-alinhados


O MIPS tem instrues especiais para manipular palavras desalinhadas na memria. Embora seja um evento
raro na maioria dos programas, ele foi includo para dar suporte a aplicaes de minicomputadores de 16 bits e
para a execuo mais rpida de memcpy e strcpy. Apesar de a maioria dos RISCs criar armadilhas se voc tentar
carregar uma palavra ou armazenar uma palavra em um endereo desalinhado, em todas as arquiteturas as pa-
lavras desalinhadas podem ser acessadas sem armadilhas, usando-se quatro instrues de carga de bytes e de-
pois montando-se o resultado com a utilizao de deslocamentos e operaes de OU lgico. As instrues de
carga e armazenamento de palavra esquerda e direita do MIPS (LWL, LWR, SWL, SWR) permitem que isso seja fei-
to em apenas duas instrues: LWL carrega a poro da esquerda do registrador e LWR carrega a poro da direita
do registrador. SWL e SWR efetuam as operaes de armazenamento correspondentes. A Figura C.31 mostra
como elas funcionam. Tambm existem verses de 64 bits dessas instrues.

Instrues restantes
Apresentamos a seguir uma lista dos outros detalhes exclusivos restantes da arquitetura MIPS64:
n NOR Essa instruo lgica calcula ~(Rs1 | Rs2).
n Valor de deslocamento constante Deslocamentos no-variveis utilizam o campo de constante de 5 bits mos-
trado no formato de registrador-registrador da Figura C.5.
n SYSCALL Essa instruo especial de armadilha usada para invocar o sistema operacional.
n Movimentao de/para registradores de controle CTCi e CFCi efetuam a movimentao entre os registradores
de inteiros e os registradores de controle.
n Salto/chamada no-relativos ao PC O endereo de 26 bits de saltos e chamadas no adicionado ao PC. Ele
deslocado 2 bits esquerda e substitui os 28 bits inferiores do PC. Isso s faria diferena se o programa esti-
vesse localizado prximo a um limite de 256 MB.
n Instrues de TLB Os erros do buffer de converso lookaside (TLB translation lookaside buffer) eram trata-
dos em software no MIPS I, e assim o conjunto de instrues tambm continha instrues para manipular os
registradores do TLB (consulte o Captulo 5 para obter mais informaes sobre TLBs). Esses registradores so
considerados partes do co-processador do sistema. Desde o MIPS I, as instrues diferem entre verses da ar-
quitetura; elas esto mais relacionadas s implementaes do que arquitetura do conjunto de instrues.
20 Apndice C Uma pesquisa de arquiteturas RISC para computadores desktop, servidores e embutidos

Caso 1 Caso 2
Antes Antes
M[100] D A V M[200] D
100 101 102 103 200 201 202 203

M[104] E M[204]

104 105 106 107 204 205 206 207

R2 J O H N R4 J O H N

LWL R2, 101: LWL R4, 203:


Depois Depois
R2 D A V N R4 D O H N

LWR R2, 104: LWR R4, 206:


Depois Depois
R2 D A V E R4 D A V E

Figura C.31 Instrues MIPs para leituras de palavras no-alinhadas. Esta figura pressupe operao em modo Big
Endian. O caso 1 carrega primeiro os 3 bytes 101, 102 e 103 no lado esquerdo de R2, deixando o byte menos significativo inalte-
rado. A instruo LWR seguinte simplesmente carrega o byte 104 no byte menos significativo de R2, deixando os outros bytes do
registrador inalterados, com o uso de LWL. O caso 2 carrega primeiro o byte 203 no byte mais significativo de R4, e a instruo
LWR seguinte carrega os outros 3 bytes de R4 a partir dos bytes da memria 204, 205 e 206. A instruo LWL l a palavra que
contm o primeiro byte da memria, efetua o deslocamento esquerda para descartar o(s) byte(s) desnecessrio(s) e altera
apenas esses bytes em Rd. O(s) byte(s) transferido(s) vai(vo) do primeiro byte at o byte de mais baixa ordem da palavra. A ins-
truo LWR seguinte atua sobre o ltimo byte, efetua o deslocamento direita para descartar o(s) byte(s) desnecessrio(s), e fi-
nalmente altera apenas esses bytes de Rd. O(s) byte(s) transferido(s) vai(vo) do ltimo byte at o byte de mais alta ordem da pala-
vra. O armazenamento de palavra esquerda (SWL) simplesmente o inverso de LWL, e o armazenamento de palavra direita
(SWR) o inverso de LWR. A mudana para o modo Little Endian inverte os bytes que so selecionados e descartados. (Se a distin-
o entre big-little, esquerda-direita e carga-armazenamento parecer confusa, no se preocupe; as instrues funcionam!)

n Recproco e raiz quadrada do recproco Essas instrues, que no seguem as diretrizes da IEEE 754 para ar-
redondamento apropriado, aparentemente foram includas visando a aplicaes que valorizam mais a velo-
cidade das operaes de diviso e raiz quadrada que a preciso.
n Instrues de chamada de procedimento condicional BGEZAL salva o endereo de retorno e desvia se o conte-
do de Rs1 maior que ou igual a zero, e BLTZAL faz o mesmo quando o contedo menor que zero. O pro-
psito dessas instrues obter uma chamada relativa ao PC. (Tambm existem verses provveis dessas
instrues.)
n Operaes paralelas de ponto flutuante de preciso simples Alm de estender a arquitetura com operaes pa-
ralelas de inteiros em MDMX, o MIPS64 tambm admite duas operaes paralelas de ponto flutuante de 32
bits sobre registradores de 64 bits em uma nica instruo. As operaes simples emparelhadas incluem a
adio (ADD.PS), subtrao (SUB.PS), comparao (C.__.PS), converso (CVT.PS.S, CVT.S.PL, CVT.S.PU), nega-
o (NEG.PS), valor absoluto (ABS.PS), movimentao (MOV.PS, MOVF.PS, MOVT.PS), multiplicao (MUL.PS),
multiplicao-adio (MADD.PS) e multiplicao-subtrao (MSUB.PS).
No existe nenhuma proviso especfica na arquitetura MIPS para a execuo de ponto flutuante prosse-
guir em paralelo com a execuo de inteiros, mas as implementaes do MIPS de ponto flutuante permitem
que isso ocorra, verificando antecipadamente no ciclo se so possveis interrupes aritmticas (consulte o
Apndice H). Normalmente, a deteco de excees foraria a execuo em srie de operaes de inteiros e
ponto flutuante.

C.8 Instrues exclusivas do Alpha


O Alpha foi planejado para ser uma arquitetura que facilitasse a elaborao de implementaes de alto desem-
penho. Visando a esse objetivo, os arquitetos tomaram originalmente duas decises controvertidas: excees
de ponto flutuante imprecisas e nenhuma transferncias de dados de byte ou meia palavra.
Para simplificar a execuo em pipeline, o Alpha no exige que uma exceo atue como se nenhuma instru-
o fosse executada alm de um certo ponto, e que todas as instrues antes desse ponto fossem executadas. Ele
C.8 Instrues exclusivas do Alpha 21

fornece a instruo TRAPB, que fica paralisada at todas as instrues aritmticas anteriores terem a garantia de
se completar sem incorrer em excees aritmticas. No modo mais conservador, a incluso de uma instruo
TRAPB para cada instruo que causa uma exceo diminui aproximadamente cinco vezes a velocidade de exe-
cuo, mas proporciona excees precisas (consulte Darcy e Gay [1996]).
O cdigo que no inclui TRAPB no obedece ao padro de ponto flutuante IEEE 754. A razo que partes
do padro (NaNs, infinitos e no-normalizados) so implementadas em software no Alpha, como em muitos
outros microprocessadores. Porm, para implementar essas operaes em software, os programas devem
descobrir a instruo e os valores de operandos transgressores, o que no pode ser feito com interrupes im-
precisas!
Quando a arquitetura foi desenvolvida, os arquitetos acreditavam que cargas e armazenamentos de bytes re-
duziriam a velocidade das transferncias de dados. Cargas de bytes exigem um deslocador extra no caminho de
transferncia de dados, e os armazenamentos de bytes exigem que o sistema de memria execute uma operao
de leitura-modificao-gravao no caso de sistemas de memria com cdigos de correo de erros, pois o novo
valor ECC tem de ser recalculado. Em conseqncia dessa omisso, os armazenamentos de bytes exigem a se-
qncia de carregamento de palavra, substituio do byte desejado e depois armazenamento de palavra. (Incoe-
rentemente, as cargas de ponto flutuante passam por uma troca considervel de bytes para converter os obtusos
formatos de ponto flutuante do VAX em uma forma cannica.)
Para reduzir o nmero de instrues necessrias obteno dos dados desejados, o Alpha inclui um
conjunto elaborado de instrues de manipulao de bytes: extrair campo e resto zero de um registrador
(EXTxx), inserir campo (INSxx), mascarar resto de um registrador (MSKxx), zerar campos de um registra-
dor (ZAP) e comparar vrios bytes (CMPGE).
Aparentemente, os implementadores no se incomodaram com a carga e o armazenamento de bytes como os
arquitetos originais. A partir da condensao da segunda verso do chip Alpha (21164A), a arquitetura inclui
operaes de carga e armazenamento de bytes e meias palavras.

Instrues restantes
Temos a seguir uma lista das instrues restantes exclusivas da arquitetura Alpha:
n Cdigo PAL Para fornecer as operaes que o VAX executava em microcdigo, o Alpha oferece um modo
que funciona com todos os privilgios ativados, interrupes desativadas e mapeamento de memria virtual
desligado para instrues. O cdigo PAL (privileged architecture library, ou biblioteca de arquitetura privi-
legiada) usado no gerenciamento de TLB, em operaes atmicas de memria e em algumas primitivas do
sistema operacional. O cdigo PAL chamado por meio da instruo CALL_PAL.
n No-diviso A diviso de inteiros no admitida em hardware.
n Carga-armazenamento desalinhado LDQ_U e STQ_U carregam e armazenam dados de 64 bits usando endere-
os que ignoram os trs bits menos significativos. Em seguida, instrues de extrao selecionam a palavra
no-alinhada desejada usando os bits mais baixos do endereo. Essas instrues so semelhantes a LWL/R,
SWL/R no MIPS.

n Preciso simples de ponto flutuante representada como preciso dupla Os dados de preciso simples so man-
tidos na memria como formatos convencionais de 32 bits, mas so convertidos para o formato de preciso
dupla de 64 bits em registradores.
n O registrador de ponto flutuante F31 fixo em zero Para simplificar as comparaes com zero.
n Formatos de ponto flutuante do VAX Para manter a compatibilidade com a arquitetura VAX, alm dos forma-
tos de preciso simples e dupla do IEEE 754, chamados S e T, o Alpha admite os formatos de preciso sim-
ples e dupla do VAX, denominados F e G, mas no o formato D do VAX. (D tinha um campo de expoente es-
treito demais para ser til em preciso dupla, e foi substitudo por G no cdigo VAX.)
n Instrues de contagem de bits A verso 3 da arquitetura acrescentou instrues para contar o nmero
de zeros iniciais (CTLZ), contar o nmero de zeros finais (CTTZ) e contar o nmero de valores 1 em uma
palavra (CTPOP). Originalmente encontradas em computadores Cray, essas instrues ajudam na des-
criptografia.
22 Apndice C Uma pesquisa de arquiteturas RISC para computadores desktop, servidores e embutidos

C.9 Instrues exclusivas do SPARC v.9


Vrias caractersticas so exclusivas do SPARC.

Janelas de registradores
A principal caracterstica exclusiva do SPARC so as janelas de registradores, uma otimizao para reduzir o
trfego de registradores em chamadas de procedimentos. So usados diversos bancos de registradores, sendo
alocado um novo banco a cada chamada de procedimento. Embora isso pudesse limitar a profundidade das
chamadas de procedimentos, essa limitao evitada operando-se os bancos como um buffer circular, o que
proporciona profundidade ilimitada. O joelho da curva de custo-desempenho parece ser de seis a oito bancos.
O SPARC pode ter entre 2 e 32 janelas, cada uma usando tipicamente oito registradores para os parmetros
globais, locais, de entrada e de sada. (Considerando-se que cada janela tem 16 registradores exclusivos, uma
implementao do SPARC pode ter apenas 40 registradores fsicos ou at 520, embora a maioria das implemen-
taes tenha de 128 a 136, at agora.) Em vez de associar as mudanas em janelas com instrues de chamada e
retorno, o SPARC tem as instrues separadas SAVE e RESTORE. SAVE empregada para salvar a janela do cha-
mador, apontando para a prxima janela de registradores, alm de executar uma instruo de adio. O artif-
cio que os registradores de origem vm da janela do chamador da operao de adio, enquanto o registrador
de destino est na janela do chamado. Em geral, os compiladores SPARC utilizam essa instruo para alterar o
ponteiro da pilha, a fim de alocar variveis locais em um novo quadro de pilha. RESTORE o inverso de SAVE, de-
volvendo a janela do chamador enquanto atua como uma instruo de adio, com os registradores de origem
da janela do chamado e o registrador de destino na janela do chamador. Isso desaloca automaticamente o qua-
dro da pilha. Os compiladores tambm podem fazer uso dele para gerar o valor de retorno final do chamado.
O perigo das janelas de registradores que o grande nmero de registradores poderia reduzir o clock-rate.
Isso no acontecia nas primeiras implementaes. A arquitetura SPARC (com janelas de registradores) e a ar-
quitetura MIPS R2000 (sem janelas de registradores) incorporaram diversas tecnologias desde 1987. Por vrias
geraes, o clock-rate do SPARC no foi mais lento que o clock-rate do MIPS para implementaes em tecnolo-
gias semelhantes, provavelmente porque os tempos de acesso cache dominam os tempos de acesso a registra-
dores nessas implementaes. As mquinas da gerao atual adotaram diferentes estratgias de implementao
em ordem versus fora de ordem e improvvel que o nmero de registradores determinasse sozinho o
clock-rate em qualquer das mquinas. Recentemente, outras arquiteturas incluram janelas de registradores:
Tensilica e IA-64.
Outra caracterstica da transferncia de dados a opo de espao alternativo para cargas e armazenamen-
tos. Isso simplesmente permite ao sistema de memria identificar acessos memria para dispositivos de entra-
da/sada ou controlar registradores para dispositivos como a cache e a unidade de gerenciamento de memria.

Armadilhas rpidas
A verso 9 do SPARC inclui suporte para tornar as armadilhas rpidas. Ela expande o nico nvel de armadilhas
a pelo menos quatro nveis, permitindo que os tratadores de armadilhas de overflow (estouro) e underflow de
janelas sejam interrompidos. Os nveis extras significam que o tratador no precisa verificar explicitamente er-
ros de pgina ou ponteiros de pilhas desalinhados no cdigo, o que torna o tratador mais rpido. Duas novas
instrues foram acrescentadas, a fim de retornar desse tratador de vrios nveis: RETRY (que repete a instruo
interrompida) e DONE (que no o faz). Para dar suporte a armadilhas no nvel do usurio, a instruo RETURN re-
tornar da armadilha em modo no-privilegiado.

Suporte para LISP e Smalltalk


A principal caracterstica aritmtica restante a de marcao da adio e da subtrao. Os projetistas do SPARC
passaram algum tempo conjecturando sobre linguagens como LISP e Smalltalk, e isso influenciou alguns dos
recursos do SPARC j discutidos: janelas de registradores, instrues de armadilhas condicionais, chamadas
com endereos de instrues de 32 bits e aritmtica de vrias palavras (consulte Taylor et al. [1986] e Ungar et
al. [1984]). Uma pequena quantidade de suporte oferecida para tipos de dados marcados com operaes de
adio, subtrao e, conseqentemente, comparao. Os dois bits menos significativos indicam se o operando
um inteiro (codificado como 00); assim, TADDcc e TSUBcc definem o bit de estouro se qualquer dos operandos
C.9 Instrues exclusivas do SPARC v.9 23

no marcado como um inteiro ou se o resultado grande demais. Uma instruo subseqente de desvio con-
dicional ou armadilha pode decidir o que fazer. (Se os operandos no so inteiros, o software recupera os ope-
randos, verifica os tipos dos operandos e invoca a operao correta de acordo com esses tipos.) Ocorre que a ar-
madilha de acesso memria desalinhada tambm pode ser colocada em uso para dados marcados, pois a carga
de um ponteiro com a tag errada pode ser um acesso invlido. A Figura C.32 mostra ambos os tipos de suporte
de tags.

Operaes sobrepostas de inteiros e de ponto flutuante


O SPARC permite que as instrues de ponto flutuante sobreponham a execuo com instrues de inteiros.
Para se recuperar de uma interrupo durante tal situao, o SPARC tem uma fila de instrues de ponto flutuan-
te pendentes e seus endereos. RDPR permite ao processador esvaziar a fila. A segunda caracterstica de ponto
flutuante a incluso de instrues de raiz quadrada de ponto flutuante FSQRTS, FSQRTD e FSQRTQ.

Instrues restantes
As caractersticas exclusivas restantes do SPARC so:
n JMPL utiliza Rd para especificar o registrador de endereo de retorno, e assim a especificao de r31 a torna se-
melhante a JALR no MIPS, e a especificao de r0 a torna semelhante a JR.
n LDSTUB carrega o valor do byte em Rd, e depois armazena FF16 no byte endereado. Essa instruo da verso 8
pode ser usada para implementar um semforo (veja o Captulo 6).
n CASA (CASXA) compara atomicamente um valor em um registrador do processador a um valor de 32 bits
(64 bits) na memria; se e somente se os valores forem iguais, a instruo permuta o valor na memria com o
valor em um segundo registrador de processador. Essa instruo da verso 9 pode ser utilizada para cons-
truir algoritmos de sincronizao de espera livre (wait-free) que no exigem o uso de bloqueios.
n XNOR calcula o OR exclusivo com o complemento do segundo operando.

n BPcc, BPr e FBPcc incluem um bit de previso de desvio, para que o compilador possa dar sugestes mquina
sobre a probabilidade de um desvio ser seguido ou no.
n ILLTRAP causa uma armadilha de instruo invlida. Muchnick [1988] explica como essa instruo usada
para a execuo correta de procedimentos de retorno de agregados em C.
n POPC efetua a contagem do nmero de bits definidos como um em um operando; tambm encontrada na ter-
ceira verso da arquitetura Alpha.

(a) Adio, subtrao ou 00 (R5)


comparao de inteiros
(codificados como 00) +
00 (R6)
TADDcc r7, r5, r6

00 (R7)

(b) Carregando via


ponteiro vlido 11 (R4)
(codificado como 11)

3
LD rD, r4, -3
00 (Endereo
de palavra)

Figura C.32 O SPARC utiliza os dois bits menos significativos para codificar diferentes tipos de dados corresponden-
tes s instrues aritmticas marcadas. (a) Aritmtica de inteiros, que demora um nico ciclo, desde que os operandos e o re-
sultado sejam inteiros. (b) A armadilha desalinhada pode ser usada para capturar acessos invlidos memria, como a tentativa
de usar um inteiro como ponteiro. Para linguagens com dados emparelhados como LISP, pode ser usado um deslocamento
igual a 3 para acessar a palavra par de um par (CAR) e o valor +1 pode ser usado para a palavra mpar de um par (CDR).
24 Apndice C Uma pesquisa de arquiteturas RISC para computadores desktop, servidores e embutidos

n Cargas sem defeitos permitem que os compiladores movam instrues de carga para a frente de estruturas de
controle condicional que controlam seu uso. Conseqentemente, as cargas sem defeitos sero executadas
de forma especulativa.
n A aritmtica de ponto flutuante e a transferncia de dados de preciso qudrupla permitem que os registradores
de ponto flutuante atuem como oito registradores de 128 bits em operaes e transferncias de dados de
ponto flutuante.
n Os resultados de ponto flutuante de preciso mltipla para a multiplicao significam que dois operandos de
preciso simples podem resultar em um produto de preciso dupla, e que dois operandos de preciso dupla
podem resultar em um produto de preciso qudrupla. Essas instrues podem ser teis em aritmtica com-
plexa e em alguns modelos de clculos de ponto flutuante.

C.10 Instrues exclusivas do PowerPC


O PowerPC o resultado de vrias geraes de mquinas RISC comerciais da IBM IBM RT/PC, IBM Power1 e
IBM Power2 alm do Motorola 88x00.

Registradores de desvios: link e contador


Em vez de dedicar um dos 32 registradores de uso geral para salvar o endereo de retorno em uma chamada de
procedimento, o PowerPC insere o endereo em um registrador especial chamado registrador de link. Tendo
em vista que muitos procedimentos retornaro sem chamar outro procedimento, o link nem sempre ter de ser
salvo. Fazer do endereo de retorno um registrador especial torna o salto de retorno mais rpido, pois o hard-
ware no precisa passar pela fase do pipeline de leitura do registrador no caso de saltos de retorno.
De modo semelhante, o PowerPC tem um registrador de contagem que ser usado em loops for nos quais o
programa iterage um nmero fixo de vezes. Usando um registrador especial, o hardware de desvio pode deter-
minar rapidamente se um desvio baseado no registrador de contagem tem probabilidade de ser seguido, pois o
valor do registrador ser conhecido antecipadamente no ciclo de execuo. Os testes do valor do registrador de
contagem em uma instruo de desvio iro decrementar automaticamente o registrador de contagem.
Considerando-se que o registrador de contagem e o registrador de link j esto localizados com o hardware
que controla desvios, e que um dos problemas na previso de desvio obter o endereo de destino bem cedo no
pipeline (consulte o Apndice A), os arquitetos do PowerPC decidiram criar um novo uso para esses registra-
dores. Qualquer dos registradores pode conter um endereo de destino de um desvio condicional. Desse modo,
o PowerPC suplementa seu desvio condicional bsico com duas instrues que obtm o endereo de destino a
partir desses registradores (BCLR, BCCTR).

Instrues restantes
Diferente da maioria das outras mquinas RISC, o registrador 0 no est conectado fisicamente ao valor 0. Ele
no pode ser utilizado como um registrador-base isto , ele gera um valor 0 nesse caso mas, no enderea-
mento de base + ndice, ele pode ser usado como ndice. As outras caractersticas exclusivas do PowerPC so:
n A carga mltipla e o armazenamento mltiplo salvam ou restauram at 32 registradores em uma nica instruo.
n LSW e STSW permitem a busca e o armazenamento de strings de comprimento fixo e varivel que tm alinha-
mento arbitrrio.
n As instrues de giro com mscara admitem a extrao e a insero de campos de bits. Uma verso gira os da-
dos e depois executa o AND lgico com uma mscara de valores 1, extraindo assim um campo. A outra verso
gira os dados, mas s insere os bits no registrador de destino onde existe um bit 1 correspondente na msca-
ra, inserindo assim um campo.
n O deslocamento algbrico direita ativa o bit de transporte (CA) se o operando negativo e quaisquer bits 1
so deslocados de forma circular. Desse modo, uma diviso com sinal por qualquer potncia de 2 constante
que arredondada para 0 pode ser realizada com uma instruo SRAWI seguida por ADDZE, que soma CA ao re-
gistrador.
C.11 Instrues exclusivas do PA-RISC 2.0 25

n CBTLZ contar os zeros iniciais.


n SUBFIC calcula (imediato RA); isso pode ser utilizado para desenvolver um complemento de um ou um
complemento de dois.
n As instrues de imediato lgico deslocado deslocam 16 bits esquerda o imediato de 16 bits antes da execu-
o de AND, OR ou XOR.

C.11 Instrues exclusivas do PA-RISC 2.0


O PA-RISC foi ligeiramente expandido em 1990 com a verso 1.1 e alterado de forma significativa na verso
2.0, de 1996, com extenses de 64 bits. O PA-RISC talvez tenha os recursos mais incomuns de qualquer mqui-
na RISC de desktop. Por exemplo, ele tem o maior nmero de modos de endereamento, formatos de instru-
es e, como veremos, diversas instrues que na realidade so formadas pela combinao de duas instrues
mais simples.

Anulao
Como mostra a Figura C.30, vrias mquinas RISC podem optar por no executar a instruo seguinte a um
desvio retardado, a fim de melhorar a utilizao do slot de desvio. Isso chamado anulao no PA-RISC, e foi
generalizado para se aplicar a qualquer instruo aritmtica/lgica, bem como a todos os desvios. Desse modo,
uma instruo de adio pode somar dois operandos, armazenar a soma e fazer a instruo seguinte ser ignora-
da se a soma for zero. Diferente das instrues de movimentao condicional, a anulao permite ao PA-RISC
evitar desvios em casos nos quais existe apenas uma instruo na parte then de uma instruo if.

Uma cornucpia de desvios condicionais


Dada a anulao, o PA-RISC no precisava ter instrues de desvio condicional separadas. Os criadores pode-
riam ter recomendado que as instrues de anulao precedessem os desvios incondicionais, simplificando as-
sim o conjunto de instrues. Em vez disso, o PA-RISC tem o maior nmero de desvios condicionais de qual-
quer mquina RISC. A Figura C.33 mostra os desvios condicionais do PA-RISC. Como podemos observar, v-
rias dessas instrues so realmente combinaes de duas instrues.

Multiplicao e diviso sintetizadas


O PA-RISC oferece vrias primitivas, de forma que a multiplicao e a diviso possam ser sintetizadas em soft-
ware. Instrues que deslocam um operando 1, 2 ou 3 bits e depois efetuam a soma, capturando ou no um es-

Nome Instruo Notao

COMB Comparao e desvio if (cond(Rs1,Rs2)) {PC <--- PC + offset12}


COMIB Comparao de imed. e desvio if (cond(imm5,Rs2)) {PC <--- PC + offset12}
MOVB Movimentao e desvio Rs2 <--- Rs1, {PC <--- PC + offset12}
if (cond(Rs1,0))
MOVIB Movimentao de imediato e desvio Rs2 <--- imm5, {PC <--- PC + offset12}
if (cond(imm5,0))
ADDB Adio e desvio Rs2 <--- Rs1 + Rs2, {PC <--- PC + offset12}
if (cond(Rs1 + Rs2,0))
ADDIB Adio de imed. e desvio Rs2 <--- imm5 + Rs2, {PC <--- PC + offset12}
if (cond(imm5 + Rs2,0))
BB Desviar em bit if (cond(Rsp,0) {PC <--- PC + offset12}
BVB Desviar em bit de varivel if (cond(Rssar,0) {PC <--- PC + offset12}
Figura C.33 As instrues de desvio condicional do PA-RISC. O deslocamento de 12 bits chamado offset12 nessa tabela, e o imedia-
to de 5 bits chamado imm5. As 16 condies so =, <, <=, mpar, estouro com sinal, no-estouro sem sinal, zero ou no-estouro sem si-
nal, nunca e seus respectivos complementos. A instruo BB seleciona um dos 32 bits do registrador e efetua o desvio dependendo de seu
valor ser 0 ou 1. A instruo BVB seleciona o bit para desvio usando o registrador de valor de deslocamento, um registrador de uso especial.
A notao de subscrito especifica um campo de bit.
26 Apndice C Uma pesquisa de arquiteturas RISC para computadores desktop, servidores e embutidos

touro, so teis em multiplicaes. (O Alpha tambm inclui instrues que multiplicam o segundo operando
de somas e subtraes por 4 ou por 8: S4ADD, S8ADD, S4SUB e S8SUB.) A etapa de diviso executa o passo crtico de
diviso sem restaurao, efetuando a soma ou a subtrao de acordo com o sinal do resultado anterior. Mage-
nheimer et al. [1988] mediram o tamanho de operandos em multiplicaes e divises para mostrar o quanto a
etapa de multiplicao funcionaria bem. Usando esses dados para programas C, Muchnick [1988] descobriu
que, em casos especiais, a multiplicao mdia por uma constante demora 6 ciclos de clock, e que a multiplica-
o de variveis demora 24 ciclos de clock. O PA-RISC tem 10 instrues correspondentes a essas operaes.
A arquitetura SPARC original usava otimizaes semelhantes, mas, com nmeros crescentes de transistores,
o conjunto de instrues foi expandido para incluir operaes completas de multiplicao e diviso. O
PA-RISC fornece algum suporte referente a essas operaes, inserindo uma multiplicao completa de inteiros
de 32 bits na unidade de ponto flutuante; porm, primeiro os dados inteiros devem ser movidos para registra-
dores de ponto flutuante.

Operaes decimais
Os programas COBOL efetuaro clculos sobre valores decimais armazenados como 4 bits por dgito, em vez
de efetuar converses entre a notao binria e a decimal. O PA-RISC tem instrues que convertero a soma de
uma adio de 32 bits normal em dgitos decimais apropriados. Ele tambm oferece operaes lgicas e aritm-
ticas que definem os cdigos de condio para testar transportes de dgitos, bytes ou meias palavras. Essas ope-
raes tambm testam se os bytes ou as meias palavras so iguais a zero. Essas operaes seriam teis em arit-
mtica sobre caracteres ASCII de 8 bits. Cinco instrues PA-RISC fornecem suporte para decimais.

Instrues restantes
Aqui esto algumas instrues restantes do PA-RISC:
n O desvio vetorizado desloca um registrador de ndice 3 bits esquerda, soma esse ndice a um registrador de
base, e depois efetua o desvio para o endereo calculado. usado em instrues de caso.
n As instrues de extrair e depositar permitem que campos de bits arbitrrios sejam selecionados de regis-
tradores ou inseridos em registradores. As variaes incluem o fato de o campo extrado ser estendido com
sinal, se o campo de bits especificado diretamente na instruo ou indiretamente em outro registrador, e
se o restante do registrador definido como zero ou permanece inalterado. O PA-RISC tem 12 instrues
desse tipo.
n Para simplificar o uso de constantes de endereo de 32 bits, o PA-RISC inclui ADDIL, que soma uma constante
de 21 bits ajustada esquerda a um registrador e insere o resultado no registrador 1. A instruo de transfe-
rncia de dados seguinte utiliza o endereamento de deslocamento para somar os 11 bits inferiores do ende-
reo ao registrador 1. Esse par de instrues permite ao PA-RISC somar uma constante de 32 bits a um regis-
trador de base, com o nus de alterar o registrador 1.
n O PA-RISC tem nove instrues de depurao que podem definir pontos de interrupo em endereos de
instrues ou dados e retornar os endereos capturados.
n Instrues de carga e limpeza fornecem um semforo ou bloqueio que l um valor da memria, e depois gra-
va zero.
n Armazenar bytes curtos otimiza as movimentaes de dados no-alinhados, movendo os bytes mais esquer-
da ou mais direita de uma palavra para o endereo efetivo, dependendo das opes da instruo e dos bits
de cdigos de condio.
n As instrues de carga e armazenamento funcionam bem com caches, tendo opes que fornecem sugestes
sobre a necessidade de carregar dados na cache se eles ainda no estiverem presentes na cache. Por exemplo,
a carga com um destino de registrador 0 definida como uma pr-busca de cache controlada por software.
n O PA-RISC 2.0 estendeu as sugestes da cache a armazenamentos, a fim de indicar cpias de blocos, reco-
mendando que o processador no carregue dados na cache se eles ainda no estiverem na cache. Ele tambm
pode sugerir que, durante instrues de carga e armazenamento, existe localidade espacial para preparar a
cache para acessos seqenciais subseqentes.
C.12 Instrues exclusivas do ARM 27

n O PA-RISC 2.0 tambm fornece uma pilha opcional de destino de desvio para prever saltos indiretos usados
em retornos de sub-rotinas. O software pode sugerir os endereos que sero colocados e removidos da pilha
de destino de desvio, mas o hardware controla se esses endereos so ou no vlidos.
n Multiply/add e multiply/subtract so operaes de ponto flutuante que podem iniciar duas operaes de pon-
to flutuante independentes em uma nica instruo, alm das operaes multiply/add e multiply/negate/add
fundidas, que foram introduzidas na verso 2.0 do PA-RISC.

C.12 Instrues exclusivas do ARM


difcil escolher o recurso mais incomum do ARM, mas talvez essa caracterstica seja a execuo condicional
de instrues. Toda instruo comea com um campo de 4 bits que determina se ela agir como uma instruo
no-operacional ou como uma instruo real, dependendo dos cdigos de condio. Assim, os desvios condicio-
nais so tratados corretamente como a execuo condicional da instruo de desvio incondicional. A execuo
condicional permite evitar que um desvio salte sobre uma nica instruo. A simples execuo condicional de
uma nica instruo ocupa menos espao de cdigo e demora menos tempo.
O campo imediato de 12 bits tem uma nova interpretao. Os 8 bits menos significativos so estendidos com
zeros at um valor de 32 bits, depois so girados direita conforme o nmero de bits especificado nos primeiros
4 bits do campo, multiplicado por 2. O fato de essa diviso realmente capturar mais imediatos que um simples
campo de 12 bits seria um estudo interessante. Uma vantagem que esse esquema pode representar todas as
potncias de 2 em uma palavra de 32 bits.
O deslocamento de operandos no se limita a imediatos. O segundo registrador de todas as operaes de
processamento aritmtico e lgico tem a opo de ser deslocado antes de ser utilizado na operao. As opera-
es de deslocamento so o deslocamento lgico esquerda, o deslocamento lgico direita, o deslocamento
aritmtico direita e o giro direita. Mais uma vez, seria interessante observar com que freqncia operaes
como girar e adicionar, deslocar direita e testar, e assim por diante, ocorrem em programas ARM.

Instrues restantes
Aqui est uma lista das instrues exclusivas restantes da arquitetura ARM:
n Cargas e armazenamentos de blocos Sob o controle de uma mscara de 16 bits no interior das instrues,
qualquer dos 16 registradores pode ser carregado ou armazenado na memria em uma nica instruo.
Essas instrues podem salvar e restaurar registradores na entrada e no retorno de procedimentos. Essas ins-
trues tambm podem ser usadas para copiar blocos de memria oferecendo at quatro vezes a largura de
banda de uma nica operao de carga-armazenamento de registrador e hoje as cpias de blocos constitu-
em o uso mais importante.
n Subtrao inversa A instruo RSB permite que o primeiro registrador seja subtrado do registrador imedia-
to ou deslocado. RSC faz o mesmo, mas inclui o transportar ao calcular a diferena.
n Multiplicaes longas Semelhante ao que ocorre no MIPS, os registradores Hi e Lo obtm o produto de 64
bits com sinal (SMULL) ou o produto de 64 bits sem sinal (UMULL).
n Sem diviso Como no Alpha, a diviso de inteiros no admitida em hardware.
n Armadilha condicional Uma extenso comum para o ncleo do MIPS encontrada em RISCs de desktop (Fi-
guras C.22 a C.25), ela gratuita na execuo condicional de todas as instrues ARM, inclusive SWI.
n Interface de co-processador Como muitos RISCs de desktop, o ARM define um conjunto completo de ins-
trues do co-processador: transferncia de dados, movimentaes entre registradores de uso geral e do
co-processador, e operaes do co-processador.
n Arquitetura de ponto flutuante Usando a interface do co-processador, uma arquitetura de ponto flutuante foi
definida para o ARM. Ela foi implementada como o co-processador FPA10.
n Conjuntos de instrues de desvio e troca A instruo BX a transio entre o ARM e o Thumb, usando os 31
bits inferiores do registrador para definir o PC, e o bit mais significativo para determinar se o modo ARM
(1) ou Thumb (0).
28 Apndice C Uma pesquisa de arquiteturas RISC para computadores desktop, servidores e embutidos

C.13 Instrues exclusivas do Thumb


No modelo da verso 4 do ARM, procedimentos executados com freqncia utilizaro instrues ARM para ob-
ter desempenho mximo, com os procedimentos executados com menor freqncia utilizando o Thumb para
reduzir o tamanho global do cdigo do programa. Tendo em vista que em geral apenas alguns procedimentos
dominaro o tempo de execuo, a esperana que esse hbrido obtenha o melhor de ambos os mundos.
Embora as instrues Thumb sejam convertidas pelo hardware em instrues ARM convencionais para exe-
cuo, h vrias restries. Primeiro, a execuo condicional extrada de quase todas as instrues. Em se-
gundo lugar, apenas os 8 primeiros registradores esto facilmente disponveis em todas as instrues, com o
ponteiro da pilha, o registrador de link e o contador de programa sendo usados implicitamente em algumas ins-
trues. Terceiro, o Thumb utiliza um formato de dois operandos para economizar espao. Em quarto lugar, os
imediatos deslocados exclusivos e os segundos operandos deslocados desapareceram, e foram substitudos por
instrues de deslocamento separadas. Em quinto, os modos de endereamento so simplificados. Por fim, a
colocao de todas as instrues em 16 bits fora o uso de muitos outros formatos de instrues.
Em vrios aspectos, a arquitetura Thumb simplificada mais convencional que a ARM. Aqui esto mudan-
as adicionais efetuadas na passagem de ARM para Thumb:
n Retirada de instrues lgicas de imediatos Os imediatos lgicos se foram.
n Cdigos de condio implcitos Em vez de ter os cdigos de condio definidos opcionalmente, eles so defi-
nidos pelo opcode. Todas as instrues da ULA e nenhuma das transferncias de dados definem os cdigos
de condio.
n Acesso a registradores Hi/Lo Os 16 registradores do ARM foram divididos igualmente entre registradores Lo
e registradores Hi, com os 8 registradores Hi incluindo o ponteiro da pilha (SP), o registrador de link e o PC.
Os registradores Lo esto disponveis em todas as operaes da ULA. Variaes de ADD, BX, CMP e MOV tambm
funcionam com todas as combinaes de registradores Lo e Hi. Os registradores SP e PC tambm esto dis-
ponveis em variaes de transferncias de dados e adio de imediatos. Todas as outras operaes sobre os
registradores Hi exigem uma MOV para inserir o valor em um registrador Lo, executar a operao ali e depois
transferir os dados de volta para o registrador Hi.
n Distncia de desvio/chamada Como as instrues tm 16 bits de largura, o endereo de desvio condicional de 8
bits deslocado por 1, e no por 2. O desvio com link especificado em duas instrues, concatenando 11 bits de
cada instruo e deslocando-os para a esquerda, a fim de formar um endereo de 23 bits para carregar no PC.
n Distncia para deslocamentos de transferncias de dados Agora o deslocamento de 5 bits para os registrado-
res de uso geral e de 8 bits para SP e PC.

C.14 Instrues exclusivas do SuperH


O registrador 0 desempenha um papel especial nos modos de endereo do SuperH. Ele pode ser adicionado a
outro registrador para formar um endereo em modo de endereamento indexado indireto e de endereamento
relativo ao PC. R0 usado para carregar constantes, a fim de fornecer um intervalo de endereamento maior do
que possvel caber facilmente nas instrues de 16 bits do SuperH. R0 tambm o nico registrador que pode
ser um operando para verses de imediatos de AND, CMP, OR e XOR.
Aqui est uma lista dos detalhes exclusivos restantes da arquitetura SuperH:
n Decrementar e testar DT decrementa um registrador e define o bit T como 1 se o resultado 0.
n Desvio retardado opcional Embora as outras mquinas RISC embutidas geralmente no utilizem desvios re-
tardados (consulte o Apndice A), o SuperH oferece a execuo opcional de desvios retardados para BT e BF.
n Muitas multiplicaes Dependendo do fato de a operao ser com sinal ou sem sinal, de os operandos serem
de 16 bits ou de 32 bits ou de o produto ser de 32 bits ou 64 bits, a instruo de multiplicao apropriada
MULS, MULU, DMULS, DMULU ou MUL. O produto encontrado nos registradores MACL e MACH.

n Extenso com zero e sinal Os valores de bytes ou meias palavras so estendidos com zero (EXTU) ou esten-
didos com sinal (EXTS) dentro de um registrador de 32 bits.
C.15 Instrues exclusivas do M32R 29

n Valores de deslocamento de um nico bit Talvez em uma tentativa de faz-las caber nas instrues de 16 bits,
as instrues de deslocamento s deslocam um bit nico de cada vez.
n Valor de deslocamento dinmico Esses deslocamentos variveis testam o sinal do valor em um registrador, a
fim de determinar se ele deve ser deslocado esquerda (positivo) ou deslocado direita (negativo). Tanto
instrues lgicas (SHLD) quanto aritmticas (SHAD) so admitidas. Essas instrues ajudam a alterar os valo-
res de deslocamento constantes de 1 bit dos deslocamentos padro.
n Girar O SuperH oferece rotaes de 1 bit esquerda (ROTL) e direita (ROTR), que definem o bit T com o va-
lor girado, e tambm tem variaes que incluem o bit T nas rotaes (ROTCL e ROTCR).
n SWAP Essa instruo troca os bytes alto e baixo de uma palavra de 32 bits ou os dois bytes dos 16 bits mais
direita.
n Extrair palavra (XTRCT) Os 32 bits intermedirios de um par de registradores de 32 bits so inseridos em ou-
tro registrador.
n Negao com transporte Semelhante a SUBC (Figura C.27), exceto pelo fato de o primeiro operando ser 0.
n Pr-busca de cache Como muitos RISCs de desktop (Figuras C.22 a C.25), o SuperH tem uma instruo
(PREF) para realizar a pr-busca de dados na cache.
n Testar e definir O SuperH utiliza a instruo mais antiga de testar e definir (TAS) para estabelecer bloqueios
atmicos ou semforos. Primeiro, TAS carrega um byte da memria. Em seguida, define o bit T como 1 se o
byte for 0 ou como 0 se o byte no for 0. Finalmente, ela define o bit mais significativo do byte como 1 e grava
o resultado de novo na memria.

C.15 Instrues exclusivas do M32R


A caracterstica mais incomum do M32R uma leve abordagem VLIW para os pares de instrues de 16 bits.
Um bit reservado na primeira instruo do par para informar se essa instruo pode ser executada em paralelo
com a prxima instruo isto , as duas instrues so independentes ou se essas duas instrues tm de ser
executadas seqencialmente. (Uma mquina anterior que oferecia uma opo semelhante era o Intel i860.)
Esse recurso ser includo em implementaes futuras da arquitetura.
Uma surpresa que todas as substituies de desvios so deslocadas 2 bits esquerda antes de serem soma-
das ao PC, e os 2 bits inferiores do PC so definidos como 0. Tendo em vista que algumas instrues tm apenas
16 bits de comprimento, esse deslocamento significa que um desvio no pode ir para qualquer instruo no
programa: ele s pode se desviar para instrues em limites de palavras. Uma restrio semelhante imposta
sobre o endereo de retorno correspondente s instrues de desvio e link e de salto e link: elas s podem retor-
nar a um limite de palavra. Desse modo, para uma distncia de desvio ligeiramente maior, o software deve asse-
gurar que todos os endereos de desvio e todos os endereos de retorno estaro alinhados em um limite de pala-
vra. O espao de cdigo do M32R provavelmente um pouco maior, e tambm provvel que ele execute mais
instrues NOP do que executaria se o endereo de desvio s fosse deslocado 1 bit esquerda.
Porm, o recurso de VLIW anterior significa que uma NOP pode se executada em paralelo com outra instru-
o de 16 bits, de forma que o preenchimento no ocupe mais ciclos de clock. A expanso de tamanho do cdi-
go depende da habilidade do compilador para programar a execuo do cdigo e para emparelhar instrues de
16 bits sucessivas; a Mitsubishi afirma que o tamanho global do cdigo apenas 7% maior que o da arquitetura
680x0 da Motorola.
O ltimo recurso inovador restante que o resultado da operao de diviso o resto, e no o quociente.

C.16 Instrues exclusivas do MIPS16


Na realidade, o MIPS16 no um conjunto de instrues separado, mas uma extenso de 16 bits da arquitetura
MIPS de 32 bits completa. Ele compatvel com qualquer das arquiteturas MIPS de endereos de 32 bits (MIPS
I, MIPS II) ou arquiteturas de 64 bits (MIPS III, IV, V). O bit de modo ISA determina a largura das instrues: 0
significa instrues de 32 bits de largura e 1 indica instrues de 16 bits de largura. A nova instruo JALX alter-
30 Apndice C Uma pesquisa de arquiteturas RISC para computadores desktop, servidores e embutidos

na o bit de modo ISA, fazendo-o corresponder ao outro modo ISA. JR e JALR foram redefinidas para ajustarem o
bit de modo ISA a partir do bit mais significativo do registrador que contm o endereo de desvio, e esse bit no
considerado parte do endereo. Todas as instrues de salto e link salvam o bit de modo atual como o bit mais
significativo do endereo de retorno.
Conseqentemente, o MIPS admite procedimentos inteiros contendo instrues de 16 bits ou de 32 bits,
mas no admite misturar os dois comprimentos de instrues em um nico procedimento. As nicas excees
so JAL e JALX: essas duas instrues precisam de 32 bits, mesmo no modo de 16 bits, presumivelmente para ob-
ter um endereo grande o suficiente para efetuar o desvio at procedimentos distantes.
Ao escolher esse subconjunto, o MIPS decidiu incluir opcodes para algumas instrues de trs operandos e
manter 16 opcodes para operaes de 64 bits. A combinao desse grande nmero de opcodes e operandos em
16 bits levou os arquitetos a fornecerem apenas 8 registradores fceis de usar exatamente como o Thumb
enquanto os outros RISCs embutidos oferecem cerca de 16 registradores. Tendo em vista que o hardware deve
incluir todos os 32 registradores do modo ISA de 32 bits, o MIPS16 inclui instrues de movimentao para co-
piar valores entre os 8 registradores do MIPS16 e os 24 registradores restantes da arquitetura MIPS completa.
Para reduzir a presso sobre os 8 registradores visveis, o ponteiro da pilha considerado um registrador sepa-
rado. O MIPS16 inclui uma variedade de opcodes separados para efetuar transferncias de dados usando sp
como um registrador de base e para incrementar sp: LWSP, LDSP, SWSP, SDSP, ADJSP, DADJSP, ADDIUSPD, e DADDIUSP.
Para caberem no limite de 16 bits, os campos imediatos geralmente so encurtados para 5 a 8 bits. O MIPS16
fornece um modo de estender seus imediatos mais curtos at a largura total de imediatos no modo de 32 bits.
Tomando emprestado um artifcio do 8086 da Intel, a instruo EXTEND na realidade um prefixo de 16 bits que
pode ser acrescentado a qualquer instruo MIPS16 com um campo de endereo ou de imediato. O prefixo for-
nece bits suficientes para transformar os campos de 5 bits de transferncias de dados e os campos de 5 a 8 bits
de imediatos aritmticos em constantes de 16 bits. Infelizmente, h duas excees. ADDIU e DADDIU comeam
com campos de imediatos de 4 bits, mas, como EXTEND s pode fornecer mais 11 bits, o imediato mais largo li-
mitado a 15 bits. EXTEND tambm estende os campos de deslocamento de 3 bits em campos de 5 bits para deslo-
camentos. (Caso voc esteja curioso, o prefixo EXTEND no precisa comear em um limite de 32 bits.)
Para enderear ainda mais o fornecimento de constantes, o MIPS16 acrescentou um novo modo de endere-
amento! O endereamento relativo ao PC para carga de palavra (LWPC) e para carga de palavra dupla (LDPC)
desloca um campo imediato de 8 bits por 2 ou 3 bits, respectivamente, somando-o ao PC com os 2 ou 3 bits in-
feriores apagados. A palavra ou palavra dupla constante ento carregada em um registrador. Desse modo, as
constantes de 32 bits ou de 64 bits podem ser includas com o cdigo de MIPS16, apesar da perda de LIU para
definir os bits superiores do registrador. Dado o novo modo de endereamento, tambm existe uma instruo
(ADDIUPC) para calcular um endereo relativo ao PC e inseri-lo em um registrador.
O MIPS16 difere dos outros RISCs embutidos pelo fato de poder formar um subconjunto de uma arquitetura
de endereos de 64 bits. Como resultado, ele tem verses de instrues com o comprimento de 16 bits das ope-
raes de dados de 64 bits: transferncia de dados (LD, SD, LWU), operaes aritmticas (DADDU/IU, DSUBU, DMULT/U,
DDIV/U) e deslocamentos (DSLL/V, DSRA/V, DSRL/V).
Tendo em vista que o MIPS desempenha um papel muito proeminente neste livro, mostraremos todas as
mudanas adicionais feitas desde as instrues do ncleo do MIPS, at chegarmos ao MIPS16:
n Retirada das instrues aritmticas com sinal As instrues aritmticas que podem gerar armadilhas foram
descartadas para poupar espao de opcode: ADD, ADDI, SUB, DADD, DADDI, DSUB.
n Retirada das instrues lgicas de imediatos Os imediatos lgicos tambm foram retirados: ANDI, ORI e XORI.
n Instrues reduzidas de desvio Comparar dois registradores e depois efetuar o desvio no era conveniente,
nem todas as outras comparaes de um registrador a zero. Conseqentemente, estas instrues tambm
no eram suficientes: BEQ, BNE, BGEZ, BGTZ, BLEZ e BLTZ. Como mencionamos na Seo C.3, para ajudar a com-
pensar essa falta, o MIPS16 inclui instrues de comparao que testam se dois registradores so iguais. Ten-
do em vista que a comparao e a operao de ajustar se menor que definem o novo registrador T, foram
acrescentados desvios para testar o registrador T.
n Distncia de desvio Como as instrues tm a largura de 16 bits, o endereo de desvio deslocado uma uni-
dade, em vez de duas.
n Os desvios retardados desaparecem Os desvios tm efeito antes da prxima instruo. Os saltos ainda tm
um slot de retardo.
C.17 Comentrios finais 31

n Extenso e distncia para deslocamentos de transferncia de dados Os campos de 5 bits e de 8 bits so estendi-
dos com zero, em vez de serem estendidos com sinal no modo de 32 bits. Para obter um intervalo maior, os
campos imediatos so deslocados esquerda 1, 2 ou 3 bits, dependendo de os dados serem de meia palavra,
palavra ou palavra dupla. Se o prefixo EXTEND for acrescentado a essas instrues, elas utilizaro o imediato
convencional de 16 bits com sinal no modo de 32 bits.
n Extenso de imediatos aritmticos Os campos de 5 bits e 8 bits so estendidos com zero para instrues de
ajuste se menor que e comparao, com a finalidade de formar um endereo relativo ao PC, e para efetuar a
adio a SP e colocar o resultado em um registrador (ADDIUSP, DADDIUSP). Mais uma vez, se o prefixo EXTEND
for acrescentado a essas instrues, elas utilizaro o imediato convencional de 16 bits com sinal do modo de
32 bits. Elas ainda sero estendidas com sinal nas adies gerais e na adio a SP e colocao do resultado de re-
torno em SP (ADJSP, DADJSP). Infelizmente, a densidade do cdigo e a ortogonalidade so companheiros es-
tranhos no MIPS16!
n Redefinio do valor de deslocamento 0 O MIPS16 define o valor 0 no campo de deslocamento de 3 bits, a fim
de indicar um deslocamento de 8 bits.
n Novas instrues foram acrescentadas devido perda do registrador 0 como zero A carga de imediato, a nega-
o e not foram adicionadas, pois essas operaes no podiam mais ser sintetizadas a partir de outras instru-
es, usando-se r0 como origem.

C.17 Comentrios finais


Este apndice cobre os modos de endereamento, os formatos de instrues e todas as instrues encontradas
em 10 arquiteturas RISC recentes. Embora as ltimas sees se concentrem nas diferenas, no seria possvel
cobrir 10 arquiteturas nestas poucas pginas se no houvesse tantas semelhanas. De fato, poderamos supor
que mais de 90% das instrues executadas por qualquer dessas arquiteturas seriam encontradas nas Figuras
C.9 a C.17. Em contraste com essa homogeneidade, a Figura C.34 fornece um resumo referente a quatro arqui-
teturas da dcada de 1970 em um formato semelhante ao da Figura C.1. (Imagine tentar escrever um nico ca-
ptulo no estilo deste livro para essas arquiteturas!) Na histria da informtica, nunca houve um consenso to
amplo em arquitetura de computadores.

IBM 360/370 Intel 8086 Motorola 68000 DEC VAX

Data de lanamento 1964/1970 1978 1980 1977


Tamanho(s) de instruo(es) 16, 32, 48 8, 16, 24, 32, 40, 48 16, 32, 48, 64, 80 8, 16, 24, 32,..., 432
(bits)
Endereamento (tamanho, 24 bits, plano/ 4 + 16 bits, 24 bits, plano 32 bits, plano
modelo) 31 bits, plano segmentado
Dados alinhados? Sim 360/No 370 No Alinhado de 16 bits No
Modos de endereamento de 2/3 5 9 = 14
dados
Proteo Pgina Nenhuma Opcional Pgina
Tamanho de pgina 2 KB & 4 KB 0,25 a 32 KB 0,5 KB
E/S Opcode Opcode Mapeada na memria Mapeada na memria
Registradores de inteiros 16 GPR 32 bits 8 dados 8 dados e 8 15 GPR 32 bits
(tamanho, modelo, nmero) dedicados 16 bits endereo 32 bits
Registradores de ponto 4 64 bits Opcionais: Opcionais: 0
flutuante separados 8 80 bits 8 80 bits
Formato de ponto flutuante IBM (hexadecimal IEEE 754 simples, IEEE 754 simples, DEC
flutuante) duplo, estendido duplo, estendido
Figura C.34 Resumo de quatro arquiteturas da dcada de 1970. Diferentes das arquiteturas da Figura C.1, h pouco consenso entre
essas arquiteturas, em qualquer categoria. (Consulte o Apndice D para ver mais detalhes sobre o 80x86 e o Apndice E para examinar uma
descrio do VAX.)
32 Apndice C Uma pesquisa de arquiteturas RISC para computadores desktop, servidores e embutidos

Porm, esse estilo de arquitetura no pode permanecer esttico. Os conjuntos de instrues tendem a se tor-
nar maiores medida que ficam mais antigos. A Figura C.35 mostra a genealogia desses conjuntos de instru-
es, e a Figura C.36 mostra as caractersticas que foram acrescentadas ou eliminadas de geraes de RISCs de
desktop ao longo do tempo.
Como podemos observar, todas as mquinas RISC de desktop evoluram para arquiteturas de endereos de
64 bits, e o fizeram sem esforo. A nica arquitetura de endereo desktop importante de 32 bits que resta o
Intel 80x86.
A sucessora com endereos de 64 bits dessa arquitetura a IA-64. Se a arquitetura IA-64 se mostrar
bem-sucedida, as arquiteturas de microprocessadores da dcada de 1970 finalmente passaro histria, em vez
de modelarem o custo e o desempenho da informtica de desktop de hoje.

C.18 Agradecimentos
Gostaramos de agradecer s seguintes pessoas pelos comentrios feitos sobre esboos deste apndice: Profes-
sor Steven B. Furber, University of Manchester; Dr. Dileep Bhandarkar, Intel Corporation; Dr. Earl Killian, Sili-
con Graphics/MIPS; e Dr. Hiokazu Takata, Mitsubishi Electric Corporation.

1960
CDC 6600
1963
1965

IBM ASC 1968


1970

IBM 801
1975 Cray 1 1975
1976

1980 Berkeley RISC-1


1981 Stanford MIPS
1982
ARM1
1985 America
1985 MIPS I PA-RISC RT/PC 1985
ARM2 SPARC v.8 1986 1986 1986
1987 Digital PRISM
1987 MIPS II 1988
1989 Power1
1990 SuperH ARM3
PA-RISC 1.1 1990
1992 1990 MIPS III Alpha
1992 1990
1992 Power2 PowerPC
SPARC v.9
MIPS IV 1993 1993
1995 Thumb ARM v.4 1994
M32R 1994
1995 1995
1997
MIPS 16 MIPS V Alpha v.3 PA-RISC 2.0
1996 1996 1996 1996
2000
Figura C.35 A linhagem de conjuntos de instrues RISC. As mquinas comerciais so mostradas em texto comum e as mquinas de
pesquisa em negrito. O CDC-6600 e o Cray-1 eram mquinas de carga-armazenamento com o registrador 0 fixo em 0, e com registradores
de inteiros e ponto flutuante separados. As instrues no podiam ultrapassar os limites de palavras. Uma antiga mquina de pesquisa IBM
levou aos projetos de pesquisa 801 e America, com o 801 resultando no malsucedido RT/PC e o America conduzindo bem-sucedida arqui-
tetura Power. Algumas pessoas que trabalharam no projeto 801 se uniram mais tarde Hewlett-Packard para trabalhar no PA-RISC. Os dois
projetos de universidades foram a base das mquinas MIPS e SPARC. De acordo com Furber [1996], o projeto RISC de Berkeley foi a inspira-
o da arquitetura ARM. Enquanto ARM1, ARM2 e ARM3 eram nomes de arquiteturas e chips, o nome ARM verso 4 representa a arquite-
tura utilizada nos chips ARM7, ARM8 e StrongARM. (No existem chips ARM v.4 e ARM5, mas os chips ARM6 e os primeiros chips ARM7
usavam a arquitetura ARM3.) A DEC construiu um microprocessador RISC em 1988, mas no o apresentou. Em vez disso, A DEC comerciali-
zou estaes de trabalho utilizando microprocessadores MIPS por trs anos, antes de lanar seu prprio conjunto de instrues RISC, o
Alpha 21064, muito semelhante ao MIPS III e ao PRISMA. A arquitetura Alpha teve pequenas extenses, mas elas no foram formalizadas
com nmeros de verses; utilizamos a verso 3 porque essa a verso do manual de referncia. O chip Alpha 21164A acrescentou instru-
es de carga e armazenamento de byte e meia palavra, e o Alpha 21264 inclui as instrues de multimdia e contagem de bits MAX. Inter-
namente, a Digital identifica seus chips conforme a tecnologia de fabricao: EV4 (21064), EV45 (21064A), EV5 (21164), EV56 (21164A) e
EV6 (21264). EV significa VAX estendido (ou Extended VAX).
Referncias 33

PA-RISC SPARC MIPS Power

Recurso 1.0 1.1 2.0 v.8 v.9 I II III IV V 1 2 PC

Cargas bloqueadas X " " X " + " " X " "


Carga-armazenamento de FP dupla X " " X " + " " X " "
Semforo X " " X " + " " X " "
Raiz quadrada X " " X " + " " + "
Operaes de FP de preciso simples X " " X " X " " " +
Sincronizao de memria X " " X " + " " X " "
Co-processador X " " X X " " "
Endereamento de base + ndice X " " X " + X
Equiv. 32 registradores de FP de 64 bits " " + + " X "
Anulao de desvio retardado X " " X " + " "
Contedo de registrador de desvio X " " + X " " "
Big/Little Endian + " + X " " " +
Bit de previso de desvio + + " " X " "
Movimentao condicional + + X "
Dados de pr-busca para cache + + + X " "
Operaes de endereamento/int. de 64 bits + + + " +
Multiplicao, diviso de 32 bits + " + X " " " X " "
Carga-armazenamento de FP qudrupla + +
Multiplicao/adio de FP fundidas + + X " "
Instrues de strings X " " X "
Suporte de multimdia X " X X
Figura C.36 Caractersticas acrescentadas a mquinas RISC de desktop. X significa na mquina original, + significa acrescentada
mais tarde, significa continuada a partir de mquina anterior e significa removida da arquitetura. O Alpha no est includo, mas adicio-
nou cargas e armazenamentos de bytes e palavras, e ainda as extenses de contagem de bits e multimdia, na verso 3. O MIPS V acrescen-
tou as instrues MDMX e operaes emparelhadas de ponto flutuante simples.

Referncias
Bhandarkar, D. P. [1995]. Alpha Architecture and Implementations, Digital Press, Newton, Mass.
Darcy, J. D. e D. Gay [1996]. FLECKmarks: Measuring floating point performance using a full IEEE compliant
arithmetic benchmark, CS 252 class project, U.C. Berkeley (consulte HTTP.CS.Berkeley.EDU/~darcy/Projects/
cs252/).
Digital Semiconductor [1996]. Alpha Architecture Handbook, Version 3, Digital Press, Maynard, Mass., Order number
EC-QD2KB-TE (outubro).
Furber, S. B. [1996]. ARM System Architecture, Addison-Wesley, Harlow, Inglaterra (consulte www.cs.man.ac.uk/
amulet/publications/books/ARMsysArch).
Hewlett-Packard [1994]. PA-RISC 2.0 Architecture Reference Manual, 3a edio.
Hitachi [1997]. SuperH RISC Engine SH7700 Series Programming Manual (consulte www.halsp.hitachi.com/tech_prod/
e pesquise por ttulo).
IBM [1994]. The PowerPC Architecture, Morgan Kaufmann, San Francisco.
Kane, G. [1996]. PA-RISC 2.0 Architecture, Prentice Hall PTR, Upper Saddle River, N.J.
Kane, G. e J. Heinrich [1992]. MIPS RISC Architecture, Prentice Hall, Englewood Cliffs, N.J.
Kissell, K. D. [1997]. MIPS16: High-Density for the Embedded Market (consulte www.sgi .com/MIPS/arch/MIPS16/
MIPS16.whitepaper.pdf).
Magenheimer, D. J., L. Peters, K. W. Pettis e D. Zuras [1988]. Integer multiplication and division on the HP precisi-
on architecture, IEEE Trans. on Computers 37:8, 980990.
MIPS [1997]. MIPS16 Application Specific Extension Product Description (consulte www.sgi.com/MIPS/arch/MIPS16/
mips16.pdf).
34 Apndice C Uma pesquisa de arquiteturas RISC para computadores desktop, servidores e embutidos

Mitsubishi [1996]. Mitsubishi 32-Bit Single Chip Microcomputer M32R Family Software Manual (setembro).
Muchnick, S. S. [1988]. Optimizing compilers for SPARC, Sun Technology 1:3 (vero), 6477.
Silicon Graphics [1996]. MIPS V Instruction Set (consulte http://www.sgi.com/MIPS/arch/ISA5/#MIPSV_indx).
Sites, R. L. e R. Witek (editores) [1995]. Alpha Architecture Reference Manual, Second Edition, Digital Press, Newton,
Mass.
Sun Microsystems [1989]. The SPARC Architectural Manual, Version 8, Part No. 800-1399-09, 25 de agosto.
Taylor, G., P. Hilfinger, J. Larus, D. Patterson e B. Zorn [1986]. Evulaation of the SPUR LISP architecture, Proc.
13th Symposium on Computer Architecture (junho), Tquio.
Ungar, D., R. Blau, P. Foley, D. Samples e D. Patterson [1984]. Architecture of SOAR: Smalltalk on a RISC, Proc.
11th Symposium on Computer Architecture (junho), Ann Arbor, Mich., 188197.
Weaver, D. L. e T. Germond [1994]. The SPARC Architectural Manual, Version 9, Prentice Hall, Englewood Cliffs,
N.J.
Weiss, S. e J. E. Smith [1994]. Power and PowerPC, Morgan Kaufmann, San Francisco.
D
Uma alternativa para
o RISC: o Intel 80x86
O x86 no to complexo assim ele s no faz muito sentido.
Mike Johnson
Lder de projeto do 80x86 na AMD,
relatrio de microprocessador (1994)

D.1 Introduo
D.2 Registradores e modos de endereamento de dados do 80x86
D.3 Operaes de inteiros do 80x86
D.4 Operaes de ponto flutuante do 80x86
D.5 Codificao de instrues do 80x86
D.6 Juntando tudo: medidas de utilizao do conjunto de instrues
D.7 Comentrios finais
D.8 Perspectiva histrica e referncias

2003, Elsevier Science (EUA).


2003, Editora Campus Ltda. uma empresa Elsevier. Todos os direitos reservados.
36 Apndice D Uma alternativa para o RISC: o Intel 80x86

D.1 Introduo
O MIPS foi a viso de um nico arquiteto. As peas dessa arquitetura se encaixam muito bem umas com as ou-
tras e a arquitetura inteira pode ser descrita de forma sucinta. Isso no ocorre no caso do 80x86: ele o produto
de vrios grupos independentes que desenvolveram a arquitetura ao longo de 20 anos, acrescentando novas ca-
ractersticas ao conjunto de instrues original, da mesma forma que se poderia acrescentar mais roupas a uma
bolsa cheia. Aqui esto marcos importantes no desenvolvimento do 80x86:
n 1978 A arquitetura Intel 8086 foi anunciada como uma extenso compatvel com a linguagem assembly do
Intel 8080, um microprocessador de 8 bits bem-sucedido na poca. O 8086 uma arquitetura de 16 bits, ten-
do todos os registradores internos com 16 bits de largura. Enquanto o 8080 era uma mquina de acumulador
simples, o 8086 estendeu a arquitetura com registradores adicionais. Como quase todo registrador tem um
uso dedicado, o 8086 fica em algum lugar entre uma mquina de acumulador e uma mquina de registrado-
res de uso geral, e pode muito bem ser chamada de mquina de acumulador estendido.
n 1980 O co-processador de ponto flutuante Intel 8087 anunciado. Essa arquitetura estende o 8086 com
cerca de 60 instrues de ponto flutuante. Seus arquitetos rejeitaram acumuladores estendidos e preferiram
um hbrido de pilhas e registradores, essencialmente uma arquitetura de pilha estendida: um conjunto de ins-
trues de pilha completo suplementado por um conjunto limitado de instrues de registrador-memria.
n 1982 O 80286 estendeu a arquitetura 8086, aumentando o espao de endereos para 24 bits, pela criao
de um modelo elaborado de mapeamento e proteo de memria, e pela adio de algumas instrues para
completar o conjunto de instrues e manipular o modelo de proteo. Como era importante executar pro-
gramas do 8086 sem alteraes, o 80286 oferecia um modo de endereamento real para tornar a mquina se-
melhante a um 8086.
n 1985 O 80386 estendeu a arquitetura 80286 para 32 bits. Alm de uma arquitetura de 32 bits com registra-
dores de 32 bits e um espao de endereos de 32 bits, o 80386 inclua novos modos de endereamento e ope-
raes adicionais. As instrues acrescentadas tornam o 80386 quase uma mquina de registradores de uso
geral. O 80386 tambm acrescentou o suporte de paginao, alm do endereamento segmentado (consulte
o Captulo 5). Como o 80286, o 80386 tem um modo de execuo de programas do 8086 sem alteraes.
Esse histrico ilustra o impacto das algemas douradas da compatibilidade no 80x86, pois a base de softwa-
re existente em cada etapa era importante demais para permitir riscos com mudanas arquitetnicas significati-
vas. Felizmente, os microprocessadores subseqentes, como o 80486 em 1989, o Pentium em 1992 e o P6 em
1995 se destinavam a um desempenho mais elevado, com apenas quatro instrues acrescentadas ao conjunto
de instrues visvel para o usurio: trs para ajudar no multiprocessamento, e mais uma instruo de movi-
mento condicional.
Desde 1997, a Intel acrescentou centenas de instrues para dar suporte multimdia, operando sobre mui-
tos tipos de dados mais estreitos dentro de um nico clock (consulte o Captulo 2). Essas instrues SIMD ou
vetoriais so usadas principalmente em bibliotecas ou drivers codificados mo e raramente so geradas por
compiladores. A primeira extenso, chamada MMX, surgiu em 1997. Ela consiste em 57 instrues que com-
pactam e descompactam vrios bytes, palavras de 16 bits ou palavras duplas de 32 bits em registradores de 64
bits, e executam operaes de deslocamento, lgicas e de aritmtica de inteiros em paralelo sobre os itens de da-
dos estreitos. Essa extenso admite tanto aritmtica saturante quanto no-saturante. A MMX utiliza os registra-
dores que compem a pilha de ponto flutuante e, conseqentemente, no h nenhum novo estado a salvar para
sistemas operacionais.
Em 1999, a Intel acrescentou outras 70 instrues, identificadas por SSE, como parte do Pentium III. As
principais mudanas tiveram o objetivo de adicionar oito registradores separados, duplicar sua largura para
128 bits e incluir um tipo de dados de ponto flutuante de preciso simples. Conseqentemente, quatro opera-
es de ponto flutuante de 32 bits podem ser executadas em paralelo. Para melhorar o desempenho da mem-
ria, a SSE incluiu instrues de pr-busca de cache, alm de instrues de armazenamento de fluxo que igno-
ram as caches e gravam diretamente na memria.
Em 2001, a Intel adicionou outras 144 instrues, dessa vez identificadas por SSE2. O novo tipo de dados
aritmtico de preciso dupla, o que permite a execuo em paralelo de pares de operaes de ponto flutuan-
te de 64 bits. Quase todas essas 144 instrues so verses de instrues MMX e SSE existentes que operam
D.2 Registradores e modos de endereamento de dados do 80x86 37

sobre 64 bits de dados em paralelo. Essa mudana no apenas permite operaes de multimdia, mas oferece
ao compilador um destino diferente para operaes de ponto flutuante, em relao arquitetura de pilha ni-
ca. Os compiladores podem escolher entre usar os oito registradores SSE como os registradores de ponto flu-
tuante encontrados nas mquinas RISC. Essa mudana impulsionou o desempenho do Pentium 4, o pri-
meiro microprocessador a incluir instrues SSE2. Na poca do lanamento, um Pentium 4 de 1,5 GHz era
1,24 vez mais rpido que um Pentium III de 1 GHz no SPECint2000(base), mas era 1,88 vez mais rpido no
SPECfp2000(base).
Quaisquer que sejam as falhas artsticas do 80x86, tenha em mente que existem mais instncias dessa famlia
arquitetnica do que de qualquer outro processador servidor ou de desktop no mundo, talvez 500 milhes em
2001. No obstante, sua ascendncia diversificada levou a uma arquitetura que difcil explicar e impossvel
amar.
Iniciamos nossa explicao com os registradores e os modos de endereamento, passaremos para as opera-
es de inteiros, e depois abordaremos as operaes de ponto flutuante, concluindo com um exame da codifi-
cao de instrues.

D.2 Registradores e modos de endereamento de dados do 80x86


A evoluo do conjunto de instrues pode ser vista nos registradores do 80x86 (Figura D.1). Os registradores
originais so mostrados em cor preta, com as extenses do 80386 apresentadas em uma tonalidade mais clara,
um esquema de colorao seguido nas figuras subseqentes. Basicamente, o 80386 estendeu todos os registra-
dores de 16 bits (exceto os registradores de segmentos) para 32 bits, antepondo uma letra E como prefixo em
seus nomes para indicar a verso de 32 bits. As instrues aritmticas, lgicas e de transferncia de dados so
instrues de dois operandos que permitem as combinaes mostradas na Figura D.2.
Para explicar os modos de endereamento, precisamos esclarecer se estamos mencionando o modo de 16
bits usado pelo 8086 e pelo 80286 ou o modo de 32 bits disponvel no 80386 e seus sucessores. Os sete modos
de endereamento da memria de dados admitidos so:
n Absoluto.
n Indireto de registrador.
n De base.
n Indexado.
n De base indexado com deslocamento.
n De base escalonado indexado.
n De base escalonado indexado e com deslocamento.
Os deslocamentos podem ser de 8 ou 32 bits no modo de 32 bits e de 8 ou 16 bits no modo de 16 bits. Se con-
siderarmos o tamanho do endereo um modo de endereamento separado, o total ser de 11 modos de endere-
amento.
Embora um operando de memria possa utilizar qualquer modo de endereamento, existem restries so-
bre quais registradores podem ser empregados em um modo. A Seo D.5 sobre as codificaes de instrues
do 80x86 fornece o conjunto completo de restries sobre registradores, mas a descrio de modos de endere-
amento a seguir apresenta as opes bsicas de registradores:
n Absoluto Com deslocamento de 16 bits ou de 32 bits, dependendo do modo.
n Indireto de registrador BX, SI, DI em modo de 16 bits e EAX, ECX, EDX, EBX, ESI e EDI em modo de 32 bits.
n Modo de base com deslocamento de 8 bits ou de 16 bits/32 bits BP, BX, SI, DI em modo de 16 bits e EAX, ECX, EDX,
EBX, ESI e EDI em modo de 32 bits. O deslocamento de 8 bits ou tem o tamanho do modo de endereos: 16
ou 32 bits. (A Intel fornece dois nomes diferentes para esse nico modo de endereamento, de base e indexa-
do, mas eles so essencialmente idnticos e vamos combin-los. Este livro utiliza a expresso endereamento
indexado para representar algo diferente, que ser explicado em seguida.)
38 Apndice D Uma alternativa para o RISC: o Intel 80x86

80x386, 80x486, Pentium 80x86, 80x286


31 15 8 7 0

GPR 0 EAX AX AH AL Acumulador

GPR 1 ECX CX CH CL Reg. de contagem: string, loop

GPR 2 EDX DX DH DL Reg. de dados: multiplicao, diviso

GPR 3 EBX BX BH BL Reg. de endereo bsico

GPR 4 ESP SP Ponteiro da pilha

GPR 5 EBP BP Ponteiro de base (para seg. de base da pilha)

GPR 6 ESI SI Reg. de ndice, ponteiro de string de origem

GPR 7 EDI DI Reg. de ndice, ponteiro de string de destino

CS Ponteiro de segmento de cdigo

SS Ponteiro de segmento da pilha (topo da pilha)

DS Ponteiro de segmento de dados

ES Ponteiro de segmento de dados extra

FS Ponteiro de segmento de dados 2

GS Ponteiro de segmento de dados 3

PC EIP IP Ponteiro de instruo (PC)

EFLAGS FLAGS Cdigos de condio


79 0

FPR 0

FPR 1

FPR 2

FPR 3

FPR 4

FPR 5

FPR 6

FPR 7

15 0
Topo da pilha de FP,
Status
Cdigos de condio de FP

Figura D.1 O 80x86 evoluiu com o passar do tempo, da mesma forma que seu conjunto de registradores. O conjunto original
mostrado em preto, e o conjunto estendido tem a cor cinza. O 8086 dividia os quatro primeiros registradores em dois grupos iguais, de for-
ma que eles pudessem ser utilizados como um nico registrador de 16 bits ou como dois registradores de 8 bits. A partir do 80386, os oito
registradores superiores foram estendidos para 32 bits e tambm podiam ser usados como registradores de uso geral. Os registradores de
ponto flutuante da parte inferior tm 80 bits de largura e, embora paream, no so registradores comuns. Eles implementam uma pilha,
com o topo da pilha indicado pelo registrador de status. Um operando deve estar no topo da pilha, e o outro pode ser qualquer um dos ou-
tros sete registradores abaixo do topo da pilha.

n Indexado O endereo a soma de dois registradores. As combinaes permitidas so BX+SI, BX+DI, BP+SI e
BP+DI. Esse modo chamado de base e indexado no 8086. (O modo de 32 bits utiliza um modo de enderea-
mento diferente para alcanar o mesmo efeito.)
n Modo de base indexado com deslocamento de 8 ou 16 bits O endereo a soma do deslocamento e do conte-
do de dois registradores. Aplicam-se sobre registradores as mesmas restries do modo indexado.
n Modo de base mais escalonado indexado Esse modo de endereamento e o prximo foram acrescentados no
80386, e s esto disponveis em modo de 32 bits. O clculo do endereo :
D.3 Operaes de inteiros do 80x86 39

Tipo do operando de origem/destino Segundo operando de origem

Registrador Registrador
Registrador Imediato
Registrador Memria
Memria Registrador
Memria Imediato
Figura D.2 Tipos de instrues correspondentes s instrues aritmticas, lgicas e de transferncia de dados. O
80x86 permite as combinaes mostradas. A nica restrio a ausncia de um modo de memria-memria. Os imediatos po-
dem ter o comprimento de 8, 16 ou 32 bits; um registrador qualquer um dos 14 registradores principais da Figura D.1 (no IP
ou FLAGS).

Registrador de base + 2Escala Registrador de ndice

onde Escala tem o valor 0, 1, 2 ou 3, Registrador de ndice pode ser qualquer dos oito registradores gerais de
32 bits exceto ESP, e Registrador de base pode ser qualquer um dos oito registradores gerais de 32 bits.
n Modo de base mais ndice escalonado com deslocamento de 8 ou 32 bits O endereo a soma do deslocamento
e do endereo calculado pelo modo escalonado imediatamente anterior. Aplicam-se as mesmas restries so-
bre registradores.
O 80x86 utiliza o endereamento Little Endian.
No caso ideal, deixaramos a discusso dos endereos lgicos e fsicos do 80x86 para o Captulo 5, mas o es-
pao de endereos segmentado nos impede de ocultar essa informao. A Figura D.3 mostra as opes de ma-
peamento de memria nas geraes de mquinas 80x86; o Captulo 5 descreve com mais detalhes o esquema de
proteo segmentado.
O programador de linguagem assembly deve especificar claramente que registrador segmento deve ser utili-
zado com um endereo, independente do modo de endereos empregado. Para economizar espao nas instru-
es, os registradores de segmentos so selecionados automaticamente, dependendo de qual registrador de en-
dereos utilizado. As regras so simples: referncias a instrues (IP) utilizam o registrador de segmento de
cdigo (CS), referncias pilha (BP ou SP) utilizam o registrador de segmento de pilha (SS) e o registrador de seg-
mento padro para os outros registradores o registrador de segmento de dados (DS). A prxima seo explica
como eles podem ser anulados.

D.3 Operaes de inteiros do 80x86


O 8086 fornece suporte para tipos de dados de 8 bits (byte) e de 16 bits (chamado de palavra). As distines de
tipos de dados se aplicam a operaes de registradores, como tambm aos acessos memria. O 80386 acres-
centa endereos e dados de 32 bits, chamados palavras duplas. Quase toda operao funciona sobre dados de 8
bits e sobre um tamanho de dados mais longo. Esse tamanho determinado pelo modo e de 16 ou 32 bits.
claro que alguns programas querem operar sobre dados de todos os trs tamanhos; assim, os arquitetos
do 80x86 fornecem um modo conveniente para especificar cada verso sem expandir de forma significativa o
tamanho do cdigo. Eles decidiram que a maioria dos programas seria dominada por dados de 16 ou 32 bits,
e assim fazia sentido ter a possibilidade de definir um tamanho grande padro. Esse tamanho padro defini-
do por um bit no registrador de segmento de cdigo. Para anular o tamanho padro, um prefixo de 8 bits as-
sociado instruo, a fim de informar mquina que ela deve utilizar o outro tamanho grande para essa ins-
truo.
A soluo do prefixo foi tomada por emprstimo do 8086, que permite o uso de vrios prefixos para modifi-
car o comportamento das instrues. Os trs prefixos originais anulam o registrador de segmento padro, blo-
queiam o barramento para executar um semforo (consulte o Captulo 6) ou repetem a instruo seguinte at
CX efetuar a contagem regressiva at zero. Este ltimo prefixo foi criado para ser emparelhado com uma instru-
o de movimentao de byte, de modo a mover um nmero varivel de bytes. O 80386 tambm incluiu um
prefixo para anular o tamanho de endereo padro.
40 Apndice D Uma alternativa para o RISC: o Intel 80x86

Modo real Modo protegido

(8086) (80286) (80386, 80486, Pentium)

Endereo lgico Endereo lgico Endereo lgico

Segmento Deslocamento Segmento Deslocamento Segmento Deslocamento

16 12 4 16 16 16 32

16
24 32
20

Endereo fsico Segmentao Segmentao

24 Endereo linear 32

20 12
Endereo fsico

10 10

20 20
Paginao

32

Endereo fsico

Figura D.3 O esquema segmentado original do 8086 mostrado esquerda. Todos os processadores 80x86 admitem esse estilo de
endereamento, chamado modo real. Ele simplesmente recebe o contedo de um registrador de segmento, desloca-o 4 bits esquerda e o
soma ao deslocamento de 16 bits, formando um endereo fsico de 20 bits. O 80286 (no centro) usava o contedo do registrador de seg-
mento para selecionar um descritor de segmento, que inclui um endereo de base de 24 bits entre outros itens. Ele somado ao deslo-
camento de 16 bits para formar o endereo fsico de 24 bits. O 80386 e seus sucessores ( direita) expandem esse endereo de base no des-
critor de segmento para 32 bits, e tambm acrescentam uma camada opcional de paginao abaixo da segmentao. Um endereo linear
de 32 bits formado primeiro a partir do segmento e do deslocamento, e depois esse endereo dividido em dois campos de 10 bits e um
campo de deslocamento de pgina de 12 bits. O primeiro campo de 10 bits seleciona a entrada na tabela de pginas do primeiro nvel, e de-
pois essa entrada usada em combinao com o segundo campo de 10 bits para acessar a tabela de pginas do segundo nvel, a fim de se-
lecionar os 20 bits mais altos do endereo fsico. A anexao desse endereo de 20 bits ao ltimo campo de 12 bits fornece o endereo fsico
de 32 bits. A paginao pode ser desativada, redefinindo-se o endereo linear de 32 bits como o endereo fsico. Observe que um espao
plano de endereos do 80x86 obtido simplesmente carregando-se o mesmo valor em todos os registradores de segmentos; isto , no
importa qual registrador de segmento selecionado.

As operaes de inteiros do 80x86 podem ser divididas em quatro classes importantes:


1. Instrues de movimentao de dados, incluindo movimentao (move), empurro (push) e extrao
(pop).
2. Instrues aritmticas e lgicas, incluindo operaes lgicas, teste, deslocamentos e operaes aritmticas
de inteiros e decimais.
3. Fluxo de controle, incluindo desvios condicionais, e ainda saltos, chamadas e retornos incondicionais.

4. Instrues de strings, incluindo a movimentao e a comparao de strings.

A Figura D.4 mostra algumas instrues tpicas do 80x86 e suas funes.


As instrues de transferncia de dados, aritmtica e lgica so comuns, exceto pelo fato de que as operaes
de instrues aritmticas e lgicas permitem que o destino seja um registrador ou uma posio de memria.
As instrues de fluxo de controle devem ser capazes de enderear destinos em outro segmento. Isso trata-
do com dois tipos de instrues de fluxo de controle: prximas para transferncias intra-segmento (dentro de
um segmento) e distantes para transferncias intersegmentos (entre segmentos). Em saltos distantes, que de-
vem ser incondicionais, duas quantidades de 16 bits seguem o opcode em modo de 16 bits. Uma delas usada
como ponteiro de instruo, enquanto a outra carregada em CS e se torna o novo segmento de cdigo. Em
D.4 Operaes de ponto flutuante do 80x86 41

Instruo Funo

JE nome if equal(CC) {IPnome}; IP128 nome < IP+128


JMP nome IPnome
CALLF nome, seg SPSP2; M[SS:SP]IP+5; SPSP2; M[SS:SP]CS; IPnome; CSseg;
MOVW BX,[DI+45] B16M[DS:DI+45]
PUSH SI SPSP2; M[SS:SP]SI
POP DI DIM[SS:SP]; SPSP+2
ADD AX,#6765 AXAX+6765
SHL BX,1 BXBX1..15 ## 0
TEST DX,#42 Ajusta flags CC com DX & 42
MOVSB M[ES:DI]8M[DS:SI]; DIDI+1; SISI+1

Figura D.4 Algumas instrues tpicas do 80x86 e suas funes. Uma lista de operaes freqentes aparece na Figura D.5.
Usamos a abreviao SR:X para indicar a formao de um endereo com registrador de segmento SR e deslocamento X. Esse
endereo efetivo correspondente a SR:X (SR<<4)+X. CALLF salva o IP da prxima instruo e o CS atual na pilha. A lingua-
gem de descrio de hardware descrita na terceira contracapa deste livro.

modo de 32 bits, o primeiro campo expandido para 32 bits, a fim de corresponder ao contador de programa de
32 bits (EIP).
As chamadas e retornos funcionam de modo semelhante uma chamada distante empurra o ponteiro de
instrues de retorno e o segmento de retorno para a pilha, carregando o ponteiro de instruo e o segmento de c-
digo. Um retorno distante extrai o ponteiro de instruo e o segmento de cdigo da pilha. Os programadores ou
criadores de compiladores devem se certificar de utilizar sempre o mesmo tipo de chamada e retornar para um
procedimento um retorno prximo no funciona com uma chamada distante, e vice-versa.
As instrues de strings fazem parte do 8080, ancestral do 80x86, e no so comumente executadas na maio-
ria dos programas.
A Figura D.5 lista algumas das instrues de inteiros do 80x86. Muitas dessas instrues esto disponveis
em formatos de byte e palavras.

D.4 Operaes de ponto flutuante do 80x86


A Intel forneceu uma arquitetura de pilha com suas instrues de ponto flutuante: as cargas empurram nme-
ros para a pilha, as operaes encontram operandos nos dois elementos superiores das pilhas e os armazena-
mentos podem extrair elementos da pilha, exatamente como sugere o exemplo de pilha da Figura 2.2.
A Intel suplementou sua arquitetura de pilha com instrues e modos de endereamento que permitem ar-
quitetura ter alguns dos benefcios de um modelo de registrador-memria. Alm de encontrar operandos nos
dois elementos superiores da pilha, um operando pode estar na memria ou em um dos sete registradores abai-
xo do topo da pilha.
Porm, esse hbrido ainda um modelo restrito de registrador-memria, pois as cargas sempre movem da-
dos para o topo da pilha enquanto incrementam o ponteiro do topo da pilha, e os armazenamentos s podem
mover o topo da pilha para a memria. A Intel utiliza a notao ST para indicar o topo da pilha, e ST(i) para re-
presentar o i-simo registrador abaixo do topo da pilha.
Uma caracterstica inovadora dessa arquitetura que os operandos so mais largos na pilha de registradores
do que quando esto armazenados na memria, e todas as operaes so executadas nessa preciso interna
mais larga. Os nmeros so convertidos automaticamente para o formato interno de 80 bits em uma carga e
convertidos de volta para o tamanho apropriado em um armazenamento. Os dados da memria podem ser n-
meros em ponto flutuante de 32 bits (preciso simples) ou de 64 bits (preciso dupla), chamados reais pela
Intel. A verso de registrador-memria dessas instrues converter ento o operando de memria para esse
formato de 80 bits da Intel, antes de executar a operao. As instrues de transferncia de dados tambm con-
vertero automaticamente inteiros de 16 e 32 bits em reais e vice-versa, no caso de operaes de carga e armaze-
namento de inteiros.
42 Apndice D Uma alternativa para o RISC: o Intel 80x86

Instruo Significado

Controle Desvios condicionais e incondicionais


JNZ, JZ Salto se condio para IP + deslocamento de 8 bits; JNE (para JNZ), JE (para JZ) so nomes
alternativos
JMP, JMPF Salto incondicional verses de deslocamento de 8 ou 16 bits intra-segmento (prximo) e
intersegmentos (distante)
CALL, CALLF Chamada de sub-rotina deslocamento de 16 bits; endereo de retorno empurrado; verses
prximas e distantes
RET, RETF Extrai o endereo de retorno da pilha e salta at ele; verses prximas e distantes
LOOP Desvio de loop decrementa CX; salta para IP + deslocamento de 8 bits se CX 0
Transferncia de dados Move dados entre registradores ou entre registrador e memria
MOV Move entre dois registradores ou entre registrador e memria
PUSH Empurra operando de origem sobre a pilha
POP Extrai operando do topo da pilha para um registrador
LES Carrega ES e um dos GPRs da memria
Aritmtica/lgica Operaes aritmticas e lgicas usando os registradores de dados e a memria
ADD Soma origem a destino; formato de registrador-memria
SUB Subtrai origem de destino; formato de registrador-memria
CMP Compara origem e destino; formato de registrador-memria
SHL Deslocamento esquerda
SHR Deslocamento lgico direita
RCR Rotao direita com transportar como preenchimento
CBW Converte byte em AL para palavra em AX
TEST AND lgico de origem e destino define flags
INC Incrementa destino; formato de registrador-memria
DEC Decrementa destino; formato de registrador-memria
OR OR lgico; formato de registrador-memria
XOR OR exclusivo; formato de registrador-memria
Instrues de strings Movimentao entre operandos strings; comprimento dado por prefixo de repetio
MOVS Efetua cpia de string de origem para destino; pode ser repetida
LODS Carrega um byte ou uma palavra de um string no registrador A
Figura D.5 Algumas operaes tpicas no 80x86. Muitas operaes utilizam o formato de registrador-memria, onde a origem ou o
destino pode ser a memria e o outro pode ser um registrador ou um operando imediato.

As operaes de ponto flutuante do 80x86 podem ser divididas em quatro classes principais:
1. Instrues de movimentao de dados, incluindo carga, carga de constante e armazenamento.

2. Instrues aritmticas, incluindo adio, subtrao, multiplicao, diviso, raiz quadrada e valor absoluto.

3. Comparao, incluindo instrues para enviar o resultado CPU de inteiros, de modo que ela possa se desviar.

4. Instrues transcendentais, incluindo seno, cos-seno, log e exponenciao.

A Figura D.6 mostra algumas das 60 operaes de ponto flutuante. Usamos as chaves { } para mostrar varia-
es opcionais das operaes bsicas: {I} significa que existe uma verso de inteiros da instruo, {P} significa
que essa variao extrair um operando da pilha aps a operao e {R} significa a inverso do sentido dos ope-
randos nessa operao.
Nem todas as combinaes so fornecidas. Conseqentemente,

F{I}SUB{R}{P}

representa estas instrues encontradas no 80x86:


D.5 Codificao de instrues do 80x86 43

Transferncia de dados Aritmtica Comparao Transcendental

F{I}LD mem/ST(i) F{I}ADD{P} mem/ST(i) F{I}COM{P}{P} FPATAN


F{I}ST{P} mem/ST(i) F{I}SUB{R}{P} mem/ST(i) F{I}UCOM{P}{P} F2XM1
FLDPI F{I}MUL{P} mem/ST(i) FSTSW AX/mem FCOS
FLD1 F{I}DIV{R}{P} mem/ST(i) FPTAN
FLDZ FSQRT FPREM
FABS FSIN
FRNDINT FYL2X
Figura D.6 As instrues de ponto flutuante do 80x86. A primeira coluna mostra as instrues de transferncia de dados, que mo-
vem dados para a memria ou para um dos registradores abaixo do topo da pilha. As trs ltimas operaes empurram constantes para
a pilha: pi, 1,0 e 0,0. A segunda coluna contm as operaes aritmticas descritas anteriormente. Observe que as trs ltimas s operam
sobre o topo da pilha. A terceira coluna a das instrues de comparao. Tendo em vista que no existe nenhuma instruo especial de
desvio de ponto flutuante, o resultado da comparao deve ser transferido para a CPU de inteiros por meio da instruo FSTSW, seja no
registrador AX ou na memria, seguida por uma instruo SAHF para definir os cdigos de condio. A comparao de ponto flutuante
pode ento ser testada com o uso de instrues de desvio de inteiros. A ltima coluna apresenta as operaes de ponto flutuante de n-
vel mais alto.

FSUB
FISUB
FSUBR
FISUBR
FSUBP
FSUBRP

No existe nenhuma verso de extrao ou extrao inversa das instrues de subtrao de inteiros.
Observe que obtemos ainda outras combinaes quando inclumos os modos de operandos para essas ope-
raes. A adio de ponto flutuante tem essas opes, ignorando-se as verses de inteiros e de extrao da ins-
truo:

FADD Ambos os operandos na pilha; o resultado substitui o topo da pilha.


FADD ST(i) Um operando de origem o i-simo registrador abaixo do topo da pilha, e o
resultado substitui o topo da pilha.
FADD ST(i),ST Um operando de origem o topo da pilha, e o resultado substitui o i-simo
registrador abaixo do topo da pilha.
FADD mem32 Um operando de origem uma posio de 32 bits na memria, e o resultado
substitui o topo da pilha.
FADD mem64 Um operando de origem uma posio de 64 bits na memria, e o resultado
substitui o topo da pilha.

Como mencionamos anteriormente, SSE2 apresenta ainda outro modelo de registradores de ponto flutuante
do IEEE.

D.5 Codificao de instrues do 80x86


Deixando o pior para o fim. A codificao de instrues no 8086 complexa, com muitos formatos de instru-
es diferentes. As instrues podem variar desde um byte, quando no existe nenhum operando, at seis
bytes, quando a instruo contm um imediato de 16 bits e utiliza um endereo de deslocamento de 16 bits.
Instrues de prefixo aumentam o comprimento das instrues do 8086 alm dos tamanhos bvios.
As adies do 80386 expandem ainda mais o tamanho da instruo, como mostra a Figura D.7. Tanto o cam-
po de deslocamento quanto o de imediato podem ter 32 bits de comprimento, so possveis mais dois prefixos,
o opcode pode ter 16 bits de comprimento e o especificador do modo de ndice escalonado acrescenta outros 8
bits. A instruo do 80386 de tamanho mximo possvel tem 17 bytes de comprimento.
44 Apndice D Uma alternativa para o RISC: o Intel 80x86

Repetio

Bloqueio

Anulao de seg. Prefixos

Anulao de end.

Anulao de tamanho

Opcode
Opcode
Ext. de opcode

mod, reg, r/m Especificadores


de endereos
sc, ndice, base

Disp8

Disp16
Deslocamento
Disp24

Disp32

Imm8

Imm16
Imediato
Imm24

Imm32

Figura D.7 O formato de instruo do 8086 (tipo preto) e as extenses para o 80386 (em cor cinza). Todo campo opcio-
nal, exceto o opcode.

A Figura D.8 mostra o formato de instruo para diversos exemplos de instrues da Figura D.4. O byte de
opcode normalmente contm um bit informando se o operando tem um byte de largura ou o tamanho maior,
16 bits ou 32 bits, dependendo do modo. No caso de algumas instrues, o opcode pode incluir o modo de en-
dereamento e o registrador; isso verdade em muitas instrues que tm a forma registradorregistrador op
imediato. Outras instrues utilizam um ps-byte ou byte de opcode extra, identificado por mod, reg, r/m
na Figura D.7, que contm as informaes de modo de endereamento. Esse ps-byte usado em muitas das
instrues que endeream a memria. O modo de base com ndice escalonado utiliza um segundo ps-byte,
identificado por SC, ndice, base na Figura D.7.
As instrues de ponto flutuante so codificadas no opcode de escape do 8086 e no especificador de endere-
o do ps-byte. As operaes de memria reservam 2 bits para decidir se o operando um nmero real de 32 ou
64 bits, ou um nmero inteiro de 16 ou 32 bits. Esses mesmos 2 bits so usados em verses que no acessam a
memria para decidir se deve haver extrao da pilha aps a operao e se o topo da pilha ou um registrador
mais baixo deve receber o resultado.
Infelizmente, no possvel separar as restries sobre registradores da codificao dos modos de enderea-
mento no 80x86. Conseqentemente, as Figuras D.9 e D.10 mostram a codificao dos dois especificadores de
endereo do ps-byte para o modo de 16 e de 32 bits.

D.6 Juntando tudo: medidas de utilizao do conjunto de instrues


Nesta seo, apresentaremos medies detalhadas para o 80x86, e em seguida compararemos as medies
referentes ao MIPS para os mesmos programas. Para facilitar as comparaes entre medies de conjuntos
dinmicos de instrues, utilizamos um subconjunto dos programas do SPEC92. Os resultados do 80x86
foram obtidos em 1994, usando-se compiladores FORTRAN e C da V2.0 do Sun Solaris e executados em
modo de 32 bits. Esses compiladores tinham qualidade comparvel dos compiladores utilizados para o
MIPS.
D.6 Juntando tudo: medidas de utilizao do conjunto de instrues 45

w=1 mod = 0 mod = 1 mod = 2

reg w=0 16b 32b r/m 16b 32b 16b 32b 16b 32b mod = 3

0 AL AX EAX 0 ender=BX+SI =EAX igual igual igual igual igual


1 CL CX ECX 1 ender=BX+DI =ECX ender como ender como ender como ender como ender como
2 DL DX EDX 2 ender=BP+SI =EDX mod=0 mod=0 mod=0 mod=0 reg
3 BL BX EBX 3 ender=BP+SI =EBX + disp8 + disp8 + disp16 + disp32 campo
4 AH SP ESP 4 ender=SI =(sib) SI+disp16 (sib)+disp8 SI+disp8 (sib)+disp32 "
5 CH BP EBP 5 ender=DI =disp32 DI+disp8 EBP+disp8 DI+disp16 EBP+disp32 "
6 DH SI ESI 6 ender=disp16 =ESI BP+disp8 ESI+disp8 BP+disp16 ESI+disp32 "
7 BH DI EDI 7 ender=BX =EDI BX+disp8 EDI+disp8 BX+disp16 EDI+disp32 "
Figura D.9 A codificao do primeiro especificador de endereo do 80x86, mod, reg, r/m. As quatro primeiras colunas mostram a co-
dificao do campo reg de 3 bits, que depende do bit w do opcode e do fato de a mquina estar no modo de 16 ou de 32 bits. As colunas restan-
tes explicam os campos mod e r/m. O significado do campo r/m de 3 bits depende do valor no campo mod de 2 bits e do tamanho do endereo.
Basicamente, os registradores usados no clculo do endereo esto listados na sexta e na stima coluna, sob mod = 0, com mod = 1 adicionan-
do um deslocamento de 8 bits e mod = 2 adicionando um deslocamento de 16 ou 32 bits, dependendo do modo do endereo. As excees so:
r/m = 6 quando mod = 1 ou mod = 2 no modo de 16 bits seleciona BP mais o deslocamento; r/m = 5 quando mod =1 ou mod = 2 no modo de
32 bits seleciona EBP mais deslocamento; e r/m = 4 no modo de 32 bits quando mod3 (sib) significa usar o modo de ndice escalonado mostra-
do na Figura D.10. Quando mod = 3, o campo r/m indica um registrador, utilizando a mesma codificao do campo reg combinado com o bit w.
46 Apndice D Uma alternativa para o RISC: o Intel 80x86

ndice Base

0 EAX EAX
1 ECX ECX
2 EDX EDX
3 EBX EBX
4 sem ndice ESP
5 EBP se mod = 0, disp32; se mod 0, EBP
6 ESI ESI
7 EDI EDI
Figura D.10 Especificador de endereo de modo de base mais ndice escalonado encontrado no 80386. Esse modo
indicado pela notao (sib) na Figura D.9. Observe que esse modo expande a lista de registradores a serem usados em outros
modos: o modo indireto de registrador usando ESP vem de Escala = 0, ndice = 4 e Base = 4, e o deslocamento de base com EBP
vem de Escala = 0, ndice = 5 e mod = 0. O campo de escala de dois bits empregado nesta frmula do endereo efetivo: Regis-
trador de base + 2Escala Registrador de ndice.

Lembre-se de que essas medidas dependem dos benchmarks escolhidos e da tecnologia de compilador utili-
zada. Embora possamos perceber que as medidas desta seo constituem uma indicao razovel da utilizao
dessas arquiteturas, outros programas podem se comportar de modo diferente de qualquer dos benchmarks
aqui apresentados, e compiladores diferentes podem gerar resultados diferentes. Ao realizar o estudo de um
conjunto de instrues real, o arquiteto desejaria ter um conjunto muito maior de benchmarks, que abrangesse
uma faixa de aplicao to grande quanto possvel, e considerar o sistema operacional e sua utilizao do con-
junto de instrues. Os benchmarks de um nico usurio como os que so medidos aqui no se comportam ne-
cessariamente da mesma forma que o sistema operacional.
Comearemos com uma avaliao das caractersticas do 80x86 isoladamente e, mais adiante, compararemos
as quantidades de instrues com as de DLX.

Medidas de endereamento de operandos do 80x86


Vamos comear com os modos de endereamento. A Figura D.11 mostra a distribuio dos tipos de operandos
no 80x86. Essas medidas cobrem o segundo operando da operao; por exemplo,

mov EAX, [45]

considerado um nico operando de memria. Se os tipos do primeiro operando fossem levados em conta, a
porcentagem de uso de registrador aumentaria aproximadamente 1,5 vez.
Os operandos de memria do 80x86 so divididos em seus respectivos modos de endereamento na Fi-
gura D.12. Provavelmente, a maior surpresa a popularidade dos modos de endereamento acrescentados
pelo 80386, as quatro ltimas linhas da figura. Eles respondem por cerca de metade de todos os acessos
memria. Outra surpresa a popularidade do endereamento direto. Na maioria das outras mquinas, o
equivalente do modo de endereamento direto raro. Talvez o espao de endereos segmentado do 80x86
torne o endereamento direto mais til, pois o endereo relativo a um endereo de base do registrador de
segmento.
Esses modos de endereamento determinam em grande parte o tamanho das instrues da Intel. A Figura
D.13 mostra a distribuio de tamanhos de instrues. O nmero mdio de bytes por instruo para programas

Mdia de inteiros Mdia de FP

Registrador 45% 22%


Imediato 16% 6%
Memria 39% 72%
Figura D.11 Distribuio de tipos de operandos para a mdia de cinco programas do SPECint92 (compress, eqntott,
espresso, gcc, li) e para a mdia de cinco programas do SPECfp92 (doduc, ear, hydro2d, mdljdp2, su2cor).
D.6 Juntando tudo: medidas de utilizao do conjunto de instrues 47

Modo de endereamento Mdia de inteiros Mdia de FP

Indireto de registrador 13% 3%


Base + desl. de 8 bits 31% 15%
Base + desl. de 32 bits 9% 25%
Indexado 0% 0%
De base indexado + desl. de 8 bits 0% 0%
De base indexado + desl. de 32 bits 0% 1%
Base + escalonado indexado 22% 7%
Base + escalonado indexado + desl. de 8 bits 0% 8%
Base + escalonado indexado + desl. de 32 bits 4% 4%
Direto de 32 bits 20% 37%
Figura D.12 Distribuio de modos de endereamento de operandos por programa. Este grfico no inclui modos de
endereamento usados por desvios ou instrues de controle.

0%
11
0%
0%
10 Mdia de ponto
0%
flutuante
0%
9 Mdia de inteiros
0%
0%
8
1%

4%
7
2%

39%
Comprimentos 6
8%
de instrues
4%
5
6%

7%
4
5%

18%
3
25%

19%
2
40%

10%
1
14%

0% 20% 40% 60%

Porcentagem de instrues em cada comprimento

Figura D.13 Mdias dos histogramas de comprimentos de instrues do 80x86 para cinco programas do SPECint92 e
para cinco programas do SPECfp92, todos funcionando em modo de 32 bits.

de inteiros 2,8, com um desvio-padro de 1,5 e 4,1 com um desvio-padro de 1,9 para programas de ponto
flutuante. A diferena de comprimento surge em parte das diferenas nos modos de endereamento: os progra-
mas de inteiros dependem mais dos modos de endereamento mais curtos, indireto de registrador e de desloca-
mento de 8 bits, enquanto os programas de ponto flutuante utilizam com maior freqncia os modos de ende-
reamento do 80386, com os deslocamentos mais longos de 32 bits.
Dado que as instrues de ponto flutuante tm aspectos de pilhas e registradores, como elas so usadas? A
Figura D.14 mostra que, pelo menos para os compiladores utilizados nessa medio, o modelo de execuo de
pilha raramente seguido. (Veja na Seo D.8 uma explicao histrica dessa observao.)
Finalmente, as Figuras D.15 e D.16 mostram as misturas de instrues para dez programas do SPEC92.

Medidas comparativas de operao


As Figuras D.17 e D.18 mostram o nmero de instrues executadas para cada um dos 10 programas no 80x86
e a razo de execuo de instrues comparada com a de DLX: nmeros menores que 1,0 significam que o
48 Apndice D Uma alternativa para o RISC: o Intel 80x86

Opo doduc ear hydro2d mdljdp2 su2cor Mdia de FP


o
Pilha (2 operando ST (1)) 1,1% 0,0% 0,0% 0,2% 0,6% 0,4%
Registrador (2o operando ST(i), i > 1) 17,3% 63,4% 14,2% 7,1% 30,7% 26,5%
Memria 81,6% 36,6% 85,8% 92,7% 68,7% 73,1%
Figura D.14 A porcentagem de instrues para as operaes de ponto flutuante (add, sub, mul, div) que utilizam cada uma das
trs opes para especificar um operando de ponto flutuante no 80x86. As trs opes so: 1) o modelo de pilha estrito para operan-
dos implcitos na pilha, 2) verso do registrador nomeando um operando explcito que no um dos dois elementos superiores da pilha e
3) operando de memria.

Instruo compress eqntott espresso gcc (cc1) li Mdia de inteiros

load 20,8% 18,5% 21,9% 24,9% 23,3% 22%


store 13,8% 3,2% 8,3% 16,6% 18,7% 12%
add 10,3% 8,8% 8,15% 7,6% 6,1% 8%
sub 7,0% 10,6% 3,5% 2,9% 3,6% 5%
mul 0,1% 0%
div 0%
compare 8,2% 27,7% 15,3% 13,5% 7,7% 16%
mov reg-reg 7,9% 0,6% 5,0% 4,2% 7,8% 4%
load imm 0,5% 0,2% 0,6% 0,4% 0%
desvio condicional 15,5% 28,6% 18,9% 17,4% 15,4% 20%
desvio incondicional 1,2% 0,2% 0,9% 2,2% 2,2% 1%
chamada 0,5% 0,4% 0,7% 1,5% 3,2% 1%
retorno, salto indireto 0,5% 0,4% 0,7% 1,5% 3,2% 1%
deslocamento 3,8% 2,5% 1,7% 1%
e 8,4% 1,0% 8,7% 4,5% 8,4% 6%
ou 0,6% 2,7% 0,4% 0,4% 1%
outra (xor, not, ...) 0,9% 2,2% 0,1% 1%
load FP 0%
store FP 0%
add FP 0%
sub FP 0%
mul FP 0%
div FP 0%
compare FP 0%
mov reg-reg FP 0%
outra (abs, sqrt, ...) 0%
Figura D.15 O mix de instrues do 80x86 para cinco programas do SPECint92.

80x86 executa menos instrues que o DLX. A contagem de instrues surpreendentemente prxima do
DLX para muitos programas de inteiros, pois seria de esperar que uma arquitetura de conjunto de instrues de
carga-armazenamento como DLX executasse mais instrues que uma arquitetura de registrador-memria
como o 80x86. Os programas de ponto flutuante sempre tm contagens mais altas para o 80x86, presumivel-
mente devido falta de registradores de ponto flutuante e ao uso de uma arquitetura de pilha.
D.7 Comentrios finais 49

Instruo doduc ear hydro2d mdljdp2 su2cor Mdia de FP

load 8,9% 6,5% 18,0% 27,6% 27,6% 20%


store 12,4% 3,1% 11,5% 7,8% 7,8% 8%
add 5,4% 6,6% 14,6% 8,8% 8,8% 10%
sub 1,0% 2,4% 3,3% 2,4% 2,4% 3%
mul 0%
div 0%
compare 1,8% 5,1% 0,8% 1,0% 1,0% 2%
mov reg-reg 3,2% 0,1% 1,8% 2,3% 2,3% 2%
load imm 0,4% 1,5% 0%
desvio condicional 5,4% 8,2% 5,1% 2,7% 2,7% 5%
desvio incondicional 0,8% 0,4% 1,3% 0,3% 0,3% 1%
chamada 0,5% 1,6% 0,1% 0,1% 0%
retorno, salto indireto 0,5% 1,6% 0,1% 0,1% 0%
deslocamento 1,1% 4,5% 2,5% 2,5% 2%
e 0,8% 0,8% 0,7% 1,3% 1,3% 1%
ou 0,1% 0,1% 0,1% 0%
outra (xor, not, ...) 0%
load FP 14,1% 22,5% 9,1% 12,6% 12,6% 14%
store FP 8,6% 11,4% 4,1% 6,6% 6,6% 7%
add FP 5,8% 6,1% 1,4% 6,6% 6,6% 5%
sub FP 2,2% 2,7% 3,1% 2,9% 2,9% 3%
mul FP 8,9% 8,0% 4,1% 12,0% 12,0% 9%
div FP 2,1% 0,8% 0,2% 0,2% 0%
compare FP 9,4% 6,9% 10,8% 0,5% 0,5% 5%
mov reg-reg FP 2,5% 0,8% 0,3% 0,8% 0,8% 1%
outra (abs, sqrt, ...) 3,9% 3,8% 4,1% 0,8% 0,8% 2%
Figura D.16 O mix de instrues do 80x86 para cinco programas do SPECfp92.

Outra questo a quantidade total de trfego de dados para o 80x86 em comparao com o DLX, pois o
80x86 pode especificar operandos de memria como parte de operaes, enquanto o DLX s pode acessar a
memria via cargas e armazenamentos. As Figuras D.17 e D.18 tambm mostram as leituras de dados, as gra-
vaes de dados e as operaes de leitura-modificao-gravao de dados para esses 10 programas. A razo
total de acessos para DLX de cada tipo de acesso memria mostrada nas linhas inferiores, sendo a opera-
o de leitura-modificao-gravao contada como uma leitura e uma gravao. O 80x86 executa cerca de
duas a quatro vezes mais acessos a dados que o DLX no caso de programas de ponto flutuante, e 1,25 vez no
caso de programas de inteiros. Por fim, a Figura D.19 mostra a porcentagem de instrues em cada categoria
para o 80x86 e o DLX.

D.7 Comentrios finais


A beleza est nos olhos de quem v.
Antigo adgio

Como vimos, ortogonal no um termo encontrado no dicionrio de arquitetura da Intel. Para entender ple-
namente quais registradores e quais modos de endereamento esto disponveis, voc precisa ver a codificao
de todos os modos de endereamento, e s vezes a codificao das instrues.
50 Apndice D Uma alternativa para o RISC: o Intel 80x86

compress eqntott espresso gcc (cc1) li Mdia int.

Instrues executadas no 80x86 (milhes) 2.226 1.203 2.216 3.770 5.020


Razo de instrues executadas para o DLX 0,61 1,74 0,85 0,96 0,98 1,03
Leituras de dados no 80x86 (milhes) 589 229 622 1.079 1.459
Gravaes de dados no 80x86 (milhes) 311 39 191 661 981
Leitura-modificao-gravao de dados no 80x86 (milhes) 26 1 129 48 48
Leituras de dados totais no 80x86 (milhes) 615 230 751 1.127 1.507
Razo de leituras de dados para o DLX 0,85 1,09 1,38 1,25 0,94 1,10
Gravaes de dados totais no 80x86 (milhes) 338 40 319 709 1.029
Razo de gravaes de dados para o DLX 1,67 9,26 2,39 1,25 1,20 3,15
Acessos de dados totais no 80x86 (milhes) 953 269 1.070 1.836 2.536
Razo de acessos a dados para o DLX 1,03 1,25 1,58 1,25 1,03 1,23
Figura D.17 Instrues executadas e acessos de dados no 80x86, e razes de comparao com o DLX para cinco programas do
SPECint92.

doduc ear hydro2d mdljdp2 su2cor Mdia de FP

Instrues executadas no 80x86 (milhes) 1.223 15.220 13.342 6.197 6.197


Razo de instrues executadas para o DLX 1,19 1,19 2,53 2,09 1,62 1,73
Leituras de dados no 80x86 (milhes) 515 6.007 5.501 3.696 3.643
Gravaes de dados no 80x86 (milhes) 260 2.205 2.085 892 892
Leitura-modificao-gravao de dados no 80x86 (milhes) 1 0 189 124 124
Leituras de dados totais no 80x86 (milhes) 517 6.007 5.690 3.820 3.767
Razo de leituras de dados para o DLX 2,04 2,36 4,48 4,77 3,91 3,51
Gravaes de dados totais no 80x86 (milhes) 261 2.205 2.274 1.015 1.015
Razo de gravaes de dados para o DLX 3,68 33,25 38,74 16,74 9,35 20,35
Acessos de dados totais no 80x86 (milhes) 778 8.212 7.965 4.835 4.782
Razo de acessos a dados para o DLX 2,40 3,14 5,99 5,73 4,47 4,35
Figura D.18 Instrues executadas e acessos de dados para cinco programas do SPECfp92 no 80x86, e razo de comparao
com o DLX.

Mdia de inteiros Mdia de FP

Categoria x86 DLX x86 DLX

Transferncia de dados total 34% 36% 28% 2%


Aritmtica de inteiros total 34% 31% 16% 12%
Controle total 24% 20% 6% 10%
Lgica total 8% 13% 3% 2%
Transferncia de dados de FP total 0% 0% 22% 33%
Aritmtica de FP total 0% 0% 25% 41%
Figura D.19 Porcentagem de instrues executadas por categoria para o 80x86 e o DLX, correspondentes s mdias de cinco
programas do SPECint92 e do SPECfp92 das Figuras D.17 e D.18.

Algumas pessoas argumentaro que a deselegncia do conjunto de instrues do 80x86 inevitvel, o pre-
o que deve ser pago pelo sucesso extraordinrio de qualquer arquitetura. Rejeitamos essa noo. bvio que
nenhuma arquitetura bem-sucedida pode descartar caractersticas que foram adicionadas em implementaes
anteriores e, com o tempo, alguns recursos podem ser vistos como indesejveis. A inaptido do 80x86 comeou
em seu ncleo com o conjunto de instrues do 8086, e se exacerbou com as expanses arquitetonicamente in-
consistentes do 8087, 80286 e do 80386.
D.8 Perspectiva histrica e referncias 51

Um contra-exemplo a arquitetura IBM 360/370, muito mais antiga que a do 80x86. Ela domina o mercado
de mainframes, da mesma forma que o 80x86 domina o mercador de computadores pessoais. Sem dvida, gra-
as a uma base melhor e a aperfeioamentos mais compatveis, esse conjunto de instrues faz muito mais sen-
tido que o 80x86, mais de 30 anos aps sua primeira implementao.
De qualquer modo, a Intel tinha um microprocessador de 16 bits anos antes das arquiteturas mais elegantes
dos seus concorrentes, e isso resultou em uma vantagem competitiva na seleo do 8086 como a CPU para o
IBM PC. O que lhe falta em estilo sobra em quantidade e, sob esse aspecto, o 80x86 muito bem feito.
A vantagem do 80x86 que seus componentes arquitetnicos no so muito difceis de implementar, con-
forme a Intel demonstrou, melhorando rapidamente o desempenho de programas de inteiros desde 1978.
Alcanar um desempenho elevado em ponto flutuante um desafio maior nessa arquitetura.

D.8 Perspectiva histrica e referncias


A complexidade do x86 no uma barreira intransponvel.... A maior deficincia no conjunto de instrues x86
a falta de registradores, acoplada a um esquema de endereamento extremamente penoso.
Mike Johnson, lder do projeto do 80x86 na AMD
Relatrio de microprocessador (1994)

Existem numerosas descries publicadas da arquitetura 80x86 a de Wakerly [1989] ao mesmo tempo con-
cisa e fcil de entender. Crawford e Gelsinger [1988] uma descrio completa do 80386.
Os ancestrais do 80x86 foram os primeiros microprocessadores, produzidos no final da primeira metade da
dcada de 1970. O Intel 4004 e o 8008 eram mquinas extremamente simples no estilo de acumulador de 4 e 8
bits. Morse et al. [1980] descrevem a evoluo do 8086 a partir do 8080 no final da dcada de 1970, como uma
tentativa de fornecer uma mquina de 16 bits com throughput melhor. Naquela poca, quase toda a programao
de microprocessadores era realizada em linguagem assembly havia pouca oferta de memria e de compiladores.
A Intel queria manter sua base de usurios do 8080, e assim o 8086 foi projetado para ser compatvel com o
8080. O 8086 nunca foi compatvel no nvel de cdigo-objeto com o 8080, mas as mquinas eram prximas o bas-
tante para que a converso de programas em linguagem assembly pudesse ser feita de forma automtica.
No incio de 1980, a IBM selecionou uma verso do 8086 com um barramento externo de 8 bits, chamada
8088, para uso no IBM PC. A empresa escolheu a verso de 8 bits para reduzir o custo da mquina. Essa esco-
lha, juntamente com o tremendo sucesso do IBM PC, tornou onipresente a arquitetura 8086. Em parte, o suces-
so do IBM PC se devia atitude da IBM de abrir a arquitetura do PC e permitir o florescimento da indstria de
clones do PC. Como vimos na introduo deste apndice, o 80286, o 80386, o 80486, o Pentium e o P6 esten-
deram a arquitetura e forneceram uma srie de aperfeioamentos de desempenho.
Embora o 68000 fosse escolhido para o popular Macintosh, o Macintosh nunca teve tanta penetrao quan-
to o PC, em parte porque a Apple no permitia clones at recentemente, e o 68000 no alcanou o mesmo im-
pulso desfrutado pelo 8086 na rea de software. O Motorola 68000 pode ter sido mais significativo tecnicamente
que o 8086, mas o impacto da seleo pela IBM e a estratgia de arquitetura aberta da IBM superaram as vanta-
gens tcnicas do 68000 no mercado.
A histria de Kahan [1990] sobre a seleo de arquitetura de pilha para o 8086 interessante. A arquitetura
de ponto flutuante do 8087 complementar teve de ser reformulada no espao de opcode do 8086, tornando-a
inconveniente para oferecer dois operandos por instruo, como havia no restante do 8086. Da a deciso de
utilizar um operando por instruo com o emprego de uma pilha: a tarefa do projetista era transformar essa
necessidade em uma virtude. Em lugar da arquitetura de pilha clssica, que no tinha previso para evitar que
as subexpresses comuns fossem empurradas e extradas da memria para o topo da pilha encontrada nos re-
gistradores, a Intel tentou combinar um arquivo de registradores plano com uma pilha. O raciocnio era que a
restrio do topo da pilha como um operando no era to ruim, pois s era necessria a execuo de uma ins-
truo FXCH (que permutava registradores) para se obter o mesmo resultado de uma instruo de dois operan-
dos, e FXCH era muito mais rpida que as operaes de ponto flutuante do 8087.
Tendo em vista que as expresses de ponto flutuante no so muito complexas, Kahan argumentou que oito
registradores significavam que a pilha raramente sofreria overflow (estouro). Conseqentemente, ele aconse-
lhou o uso pelo 8087 desse esquema hbrido, com a previso de que o overflow ou o underflow da pilha causa-
ria uma interrupo do 8086, de forma que o software de interrupo pudesse dar ao criador do compilador a
52 Apndice D Uma alternativa para o RISC: o Intel 80x86

iluso de uma pilha ilimitada para dados de ponto flutuante. O 8087 da Intel foi implementado em Israel, e a
distncia de 12.000 quilmetros (7.500 milhas) e 10 fusos horrios tornaram difcil a comunicao com a Cali-
frnia. De acordo com Palmer e Morse [1984]:

Infelizmente, ningum tentou escrever um gerenciador de pilha em software antes de terminar a elaborao do
8087 e, nessa poca, j era muito tarde; aquilo que era complicado demais para executar em hardware se tornou
ainda pior em software. Faltava a habilidade para descobrir de forma conveniente se uma exceo de operao in-
vlida era de fato causada por um overflow de pilha.... Tambm no havia a possibilidade de reiniciar a instruo
que causava o overflow da pilha... [p. 93]

O resultado que as excees da pilha so lentas demais para serem manipuladas em software. Como afirma
Kahan [1990]:

Em conseqncia disso, quase todos os compiladores de linguagens de nvel mais alto geravam cdigo ineficiente
para a famlia 80x87, degradando o desempenho do chip tipicamente em 50%, com armazenamentos esprios e
cargas necessrias apenas para impedir o overflow/underflow da pilha...

Ainda lamento que a implementao de pilha do 8087 no tenha sido to limpa quanto era minha inteno origi-
nal.... Se o projeto original fosse realizado, os compiladores atuais utilizariam o 80x87 e seus descendentes com
maior eficincia, e os concorrentes da Intel poderiam comercializar com mais facilidade imitaes do 80x87 mais
rpidas, porm compatveis.

O P6 renomeia os registradores de ponto flutuante (consulte o Captulo 3), fornecendo efetivamente at 40


registradores de ponto flutuante em qualquer instante dado. O principal efeito da organizao de pilha forar
as equipes de projeto a usarem transistores para desreferenciar a pilha antes de efetuarem a mudana de nome
A Hewlett-Packard e a Intel anunciaram uma nova arquitetura de conjunto de instrues comum. Ela tam-
bm apresenta compatibilidade direta com o 80x86 e, desse modo, o conjunto de instrues 80x86 estar dis-
ponvel em alguma forma nos computadores deste sculo. Os antroplogos de conjuntos de instrues remo-
vero camada por camada dessas mquinas at descobrirem resqucios da estrutura do primeiro microproces-
sador. Aps tal descoberta, como eles iro julgar a arquitetura de computadores do sculo XX?

Referncias
Crawford, J. e P. Gelsinger [1988]. Programming the 80386, Sybex Books, Alameda, Calif.
Kahan, J. [1990]. On the advantage of the 8087s stack, notas de curso no publicadas, Computer Science Division,
University of California at Berkeley.
Morse, S., B. Ravenal, S. Mazor e W. Pohlman [1980]. Intel microprocessors 8080 to 8086, Computer 13:10 (ou-
tubro).
Palmer, J. e S. Morse [1984]. The 8087 Primer, J. Wiley, Nova York, p. 93.
Wakerly, J. [1989]. Microcomputer Architecture and Programming, J. Wiley, Nova York.
E
Outra alternativa para o
RISC: a arquitetura VAX
Em princpio, no existe nenhum grande desafio em projetar um sistema
de minicomputador com endereos virtuais extensos.... O desafio real resi-
de em duas reas: compatibilidade muito tangvel e importante; e sim-
plicidade intangvel mas, apesar de tudo, importante.
William Strecker
VAX-11/780 A Virtual Address Extension to the PDP-11 Family, AFIPS Proc.,
National Computer Conference, 1978.

Entidades no devem ser multiplicadas desnecessariamente.


Guilherme de Occam
Quodlibeta Septem, 1320
(Essa citao conhecida como Occams Razor ou Navalha de Occam.)

E.1 Introduo
E.2 Operandos e modos de endereamento do VAX
E.3 Codificao de instrues do VAX
E.4 Operaes do VAX
E.5 Um exemplo para juntar tudo: swap
E.6 Um exemplo mais longo: sort
E.7 Falcias e armadilhas
E.8 Comentrios finais
E.9 Perspectiva histrica e leitura adicional
Exerccios
2003, Elsevier Science (EUA).
2003, Editora Campus Ltda. uma empresa Elsevier. Todos os direitos reservados.
54 Apndice E Outra alternativa para o RISC: a arquitetura VAX

E.1 Introduo
Para ampliar sua compreenso de arquiteturas de conjuntos de instrues, escolhemos o VAX como o re-
presentante dos computadores com conjuntos complexos de instrues (CISC Complex Instruction Set
Computers), porque ele bem diferente do MIPS e, ainda assim, fcil de entender. Observando dois estilos
to divergentes, estamos certos de que voc ser capaz de estudar outros conjuntos de instrues por conta
prpria.
Na poca em que o VAX foi projetado, a filosofia dominante era a de criar conjuntos de instrues que fos-
sem prximos das linguagens de programao, a fim de simplificar os compiladores. Por exemplo, como as lin-
guagens de programao tinham loops, os conjuntos de instrues deveriam ter instrues de loops. O arquite-
to do VAX William Strecker disse (A Virtual Address Extension to the PDP-11 Family, AFIPS Proc., National
Computer Conference, 1978):

Um objetivo importante do conjunto de instrues VAX-11 foi fornecer cdigo efetivo gerado por compilador.
Quatro decises ajudaram a realizar esse objetivo:... 1) Um tratamento muito regular e consistente de operado-
res.... 2) Evitar instrues com pouca probabilidade de serem geradas por um compilador.... 3) Incluses de diver-
sas formas de operadores comuns.... 4) Substituio de seqncias de instrues comuns por instrues nicas.
Os exemplos incluem chamadas de procedimentos, desvios de vrias vias, controle de loops e clculo de subscri-
tos de arrays.

Lembre-se de que as DRAMs da metade da dcada de 1970 continham menos de 1/1.000 da capacidade das
DRAMs de hoje, e assim o espao de cdigo tambm era crtico. Conseqentemente, outra filosofia dominante
era minimizar o tamanho do cdigo, o que tirou a nfase de conjuntos de instrues de comprimento fixo
como o MIPS. Por exemplo, os campos de endereos do MIPS sempre utilizam 16 bits, mesmo quando o ende-
reo muito pequeno. Em contraste, o VAX permite que as instrues tenham um nmero varivel de bytes, e
assim pouco espao desperdiado em campos de endereos.
Foram escritos livros to volumosos quanto este apenas sobre o VAX; assim, esta extenso sobre o VAX no
pode ser exaustiva. Por essa razo, as prximas sees descrevem apenas alguns de seus modos de enderea-
mento e algumas instrues. Para mostrar as instrues do VAX em ao, as prximas sees apresentam o c-
digo assembly do VAX correspondente a dois procedimentos de C. O estilo geral ser o de contrastar essas ins-
trues com o cdigo MIPS a que voc j est habituado.
Os objetivos distintos do VAX e do MIPS levaram a arquiteturas muito diferentes. As metas do VAX, compi-
ladores simples e densidade de cdigo, conduziram a poderosos modos de endereamento, instrues eficien-
tes e codificao de instrues eficaz. As metas do MIPS eram alto desempenho via pipelining, facilidade de im-
plementao de hardware e compatibilidade com compiladores altamente otimizados. As metas do MIPS resul-
taram em instrues simples, modos de endereamento simples, formatos de instrues de comprimento fixo e
um grande nmero de registradores.

E.2 Operandos e modos de endereamento do VAX


O VAX uma arquitetura de 32 bits, com endereos e registradores de 32 bits de largura. Mesmo assim, o VAX
admite muitos outros tamanhos e tipos de dados, como mostra a Figura E.1. Infelizmente, o VAX utiliza o
nome palavra para se referir a quantidades de 16 bits; neste texto, uma palavra significa 32 bits. A Figura E.1
mostra a converso entre os nomes de tipos de dados do MIPS e os nomes do VAX. Tenha cuidado ao ler sobre
instrues do VAX, pois elas fazem referncia aos nomes dos tipos de dados do VAX.
O VAX fornece 16 registradores de 32 bits. O assembler do VAX utiliza a notao r0, r1, ..., r15 para se referir
a esses registradores, e adotaremos essa notao. Infelizmente, 4 desses 16 registradores so reivindicados de
forma efetiva pela arquitetura do conjunto de instrues. Por exemplo, r14 o ponteiro da pilha (sp) e r15 o
contador de programa (pc). Conseqentemente, r15 no pode ser empregado como um registrador de uso ge-
ral, e a utilizao de r14 muito difcil, porque ele interfere com instrues que manipulam a pilha. Os outros
registradores dedicados so r12, usado como ponteiro de argumento (ap) e r13, usado como ponteiro de quadro
(fp); sua finalidade se tornar clara mais adiante. (Como o MIPS, o assembler do VAX aceita o nmero do regis-
trador ou o nome do registrador.)
E.2 Operandos e modos de endereamento do VAX 55

Bits Tipo de dados Nome do MIPS Nome do VAX

8 Inteiro Byte Byte


16 Inteiro Meia palavra Palavra
32 Inteiro Palavra Palavra longa
32 Ponto flutuante Preciso simples F_floating
64 Inteiro Palavra dupla Palavra qudrupla
64 Ponto flutuante Preciso dupla D_floating ou G_floating
8n String de caracteres Caractere Caractere
Figura E.1 Tipos de dados do VAX, seus comprimentos e nomes. A primeira letra do tipo do VAX (b, w, l, f, q, d, g, c) fre-
qentemente utilizada para completar o nome de uma instruo. Os exemplos de instrues de movimentao incluem movb,
movw, movl, movf, movq, movd, movg e movc3. Cada instruo de movimentao transfere um operando do tipo de dados indica-
do pela letra que segue mov.

Os modos de endereamento do VAX incluem os que foram discutidos no Captulo 2, que tem todos os mo-
dos de endereamento do MIPS: registrador, deslocamento, imediato e relativo do PC. Alm disso, todos esses
modos podem ser utilizados como endereos de saltos ou endereos de dados.
Porm, esses no so todos os modos de endereamento. Para reduzir o tamanho do cdigo, o VAX tem trs
comprimentos de endereos para endereamento de deslocamento: endereos de 8 bits, de 16 bits e de 32 bits;
cada um deles chamado respectivamente endereamento de deslocamento de byte, deslocamento de palavra e
deslocamento longo. Desse modo, um endereo pode ser no apenas to pequeno quanto possvel, mas to gran-
de quanto necessrio; endereos grandes no precisam ser divididos, e assim no h nenhum equivalente ins-
truo lui do MIPS (veja a pgina 99).
Esses ainda no so todos os modos de endereamento do VAX. Vrios deles tm uma opo adiado, signifi-
cando que o objeto endereado apenas o endereo do objeto real, exigindo outro acesso memria para obter
o operando. Esse modo de endereamento chamado endereamento indireto em outras mquinas. Assim, ou-
tros modos de endereamento sua escolha so: registrador adiado, auto-incremento adiado e deslocamento de
byte/palavra/longo adiado. Por exemplo, usando-se a notao do assembler do VAX, r1 significa que o operando
o registrador 1 e (r1) significa que o operando a posio de memria apontada por r1.
Existe ainda outro modo de endereamento. O endereamento indexado converte automaticamente o valor
em um operando de ndice para o endereo de byte apropriado, a fim de som-lo ao restante do endereo. No
caso de uma palavra de 32 bits, necessrio multiplicar o ndice de uma quantidade de 4 bytes por 4 antes de
adicion-la a um endereo bsico. O endereamento indexado, chamado endereamento escalonado em alguns
computadores, multiplica automaticamente por 4 o ndice de uma quantidade 4 de bytes, como parte do clcu-
lo do endereo.
Para lidar com tal pletora de opes de endereamento, a arquitetura do VAX separa a especificao do modo
de endereamento da especificao da operao. Conseqentemente, o opcode fornece a operao e o nmero de
operandos, e cada operando tem seu prprio especificador de modo de endereamento. A Figura E.2 mostra o
nome, a notao assembler, o exemplo, o significado e o comprimento do especificador de endereo.
O estilo de endereamento do VAX significa que uma operao no sabe de onde vm seus operandos; uma
instruo add do VAX pode ter trs operandos em registradores, trs operandos na memria ou qualquer com-
binao de operandos de registradores e memria.

EXEMPLO Qual o comprimento da instruo a seguir?

addl3 r1,737(r2),(r3)[r4]

O nome addl3 significa uma instruo de adio de 32 bits com trs operandos. Suponha que o comprimen-
to do opcode do VAX seja 1 byte.
Resposta O primeiro especificador de operando r1 indica endereamento de registrador e 1 byte de comprimento. O
segundo especificador de operando 737(r2) indica endereamento de deslocamento e tem duas partes: a
primeira parte um byte que especifica o modo de endereamento de deslocamento de palavra e o registrador-
56 Apndice E Outra alternativa para o RISC: a arquitetura VAX

base (r2); a segunda parte o deslocamento de 2 bytes (737). O terceiro especificador de operando (r3)[r4]
tambm tem duas partes: o primeiro byte especifica o modo de endereamento de registrador adiado ((r3)) e o
segundo byte especifica o registrador de ndice e o uso de endereamento indexado ([r4][TN).
Desse modo, o comprimento total da instruo 1 + (1) + (1 + 2) + (1 + 1) = 7 bytes.

Nesse exemplo de instruo, mostramos o operando de destino do VAX no lado esquerdo e os operandos de
origem no lado direito, da mesma forma que o cdigo MIPS. Na realidade, o assembler do VAX espera operan-
dos na ordem oposta, mas sentimos que seria menos confuso manter o destino esquerda para ambas as mqui-
nas. bvio que a orientao esquerda ou direita arbitrria; o nico requisito a consistncia.

Elaborao Como o PC um dos 16 registradores que podem ser selecionados em um modo de endereamento do VAX, 4
dos 22 modos de endereamento do VAX so sintetizados a partir de outros modos de endereamento. Usan-
do-se o PC como o registrador escolhido em cada caso, o endereamento imediato na realidade au-
to-incremento, o relativo ao PC deslocamento, o absoluto auto-incremento adiado e o relativo adiado deslo-
camento adiado.

E.3 Codificao de instrues do VAX


Dada a independncia das operaes e dos modos de endereamento, a codificao de instrues bem dife-
rente do MIPS.
As instrues do VAX comeam com um opcode de um nico byte contendo a operao e o nmero de ope-
randos. Os operandos seguem o opcode. Cada operando comea com um nico byte, chamado especificador de
endereo, que descreve o modo de endereamento para esse operando. Para um modo de endereamento sim-
ples, como endereamento de registrador, esse byte especifica o nmero do registrador, bem como o modo
(veja a coluna mais esquerda na Figura E.2). Em outros casos, esse byte inicial pode ser seguido por muitos
outros bytes, a fim de especificar o restante das informaes de endereo.

Comprimento do
Nome do modo de especificador de
endereamento Sintaxe Exemplo Significado endereo em bytes

Literal #valor #1 1 1 (valor de 6 bits


com sinal)
Imediato #valor #100 100 1 + comprimento
do imediato
Registrador rn r3 r3 1
Registrador adiado (rn) (r3) Memria[r3] 1
Deslocamento de Deslocamento (rn) 100(r3) Memria[r3 + 100] 1 + comprimento
byte/palavra/longo do deslocamento
Deslocamento de @deslocamento (rn) @100(r3) Memria|Memria [r3 + 100]] 1 + comprimento
byte/palavra/longo adiado do deslocamento
Indexado (escalonado) Modo base [rx] (r3)[r4] Memria[r3 + r4 d] (onde d o 1 + comprimento do
tamanho dos dados em bytes) modo de endereamento
bsico
Auto-incremento (rn)+ (r3)+ Memria[r3]; r3 = r3 + d 1
Autodecremento (rn) (r3) r3 = r3 d; Memria[r3] 1
Auto-incremento adiado @(rn)+ @(r3)+ Memria|Memria[r3]]; r3 = r3 + d 1
Figura E.2 Definio e comprimento dos especificadores de operandos do VAX. O comprimento de cada modo de endereamento
de 1 byte mais o comprimento de qualquer campo de deslocamento ou imediato exigido pelo modo. O modo literal utiliza uma tag especial
de 2 bits e os 6 bits restantes codificam o valor da constante. Se a constante for grande demais, ela dever usar o modo de endereamento
imediato. Observe que o comprimento de um operando imediato ditado pelo comprimento do tipo de dados indicado no opcode, e no
pelo valor do imediato. O smbolo d nos quatro ltimos modos representa o comprimento dos dados em bytes; d 4 para a adio de 32
bits.
E.4 Operaes do VAX 57

Como um exemplo especfico, vamos mostrar a codificao da instruo de adio do exemplo da pgi-
na 55:

addl3 r1,737(r2),(r3)[r4]

Suponha que essa instruo se inicie na posio 201.


A Figura E.3 mostra a codificao. Observe que os operandos esto armazenados na memria em ordem
oposta do cdigo assembly anterior. A execuo de instrues do VAX comea com a busca dos operandos de
origem, e assim faz sentido eles aparecerem primeiro. A ordem no importante em instrues de comprimen-
to fixo como MIPS, pois os operandos de origem e de destino so encontrados facilmente dentro de uma pala-
vra de 32 bits.
O primeiro byte, na posio 201, o opcode. O prximo byte, na posio 202, um especificador para o
modo de ndice que utiliza o registrador r4. Como muitos outros especificadores, os 4 bits da esquerda do espe-
cificador determinam o modo, e os 4 bits da direita indicam o registrador usado nesse modo. Tendo em vista
que addl3 uma operao de 4 bytes, r4 ser multiplicado por 4 e somado ao endereo que for especificado em
seguida. Nesse caso, ele o endereamento de registrador adiado que utiliza o registrador r3. Desse modo, os
bytes 202 e 203 combinados definem o terceiro operando no cdigo assembly.
O byte seguinte, no endereo 204, um especificador para o endereamento de deslocamento de palavra que
utiliza o registrador r2 como o registrador-base. Esse especificador informa ao VAX que os dois bytes seguintes,
as posies 205 e 206, contm um endereo de 16 bits que ser somado a r2.
O ltimo byte da instruo fornece o operando de destino, e esse especificador seleciona o endereamento
de registrador que utiliza o registrador r1.
Tal variabilidade no endereamento significa que uma nica operao do VAX pode ter muitos comprimen-
tos diferentes; por exemplo, uma soma de inteiros varia desde 3 bytes at 19 bytes. As implementaes do VAX
devem decodificar o primeiro operando antes de poderem encontrar o segundo, e assim os implementadores
so fortemente tentados a usar um ciclo de clock para decodificar cada operando; desse modo, essa arquitetura
de conjunto de instrues sofisticada pode resultar em ciclos de clock mais altos por instruo, mesmo quando
se utilizam endereos simples.

E.4 Operaes do VAX


Mantendo sua filosofia, o VAX tem um grande nmero de operaes, bem como um grande nmero de modos
de endereamento. Revisamos alguns deles aqui para lhe dar uma idia do funcionamento da mquina.
Dada a potncia dos modos de endereamento, a instruo move do VAX executa vrias operaes encontra-
das em outras mquinas. Ela transfere dados entre duas posies endereveis quaisquer e inclui carga, arma-
zenamento, movimentos de registrador-registrador e movimentos de memria-memria como casos especiais.
A primeira letra do tipo de dados do VAX (b, w, l, f, q, d, g, c na Figura E.1) acrescentada ao acrnimo mov para
determinar o tamanho dos dados. Uma movimentao especial, chamada endereo de movimentao, move o en-
dereo de 32 bits do operando em lugar dos dados. Ela utiliza o acrnimo mova.

Cdigo de
Endereo de byte Contedo em cada byte mquina

201 opcode contendo addl3 c1hexa


202 especificador de modo de ndice para [r4] 44hexa
203 especificador de modo indireto de registrador para (r3) 63hexa
204 especificador de modo de deslocamento de palavra usando r2 como base c2hexa
205 e1hexa
a constante de 16 bits 737
206 02hexa
207 especificador de modo de registrador para r1 51hexa
Figura E.3 A codificao da instruo do VAX addl3 r1,737(r2),(r3)[r4], supondo-se que ela comea no endereo
201. Para satisfazer sua curiosidade, a coluna da direita mostra a codificao real do VAX em notao hexadecimal. Observe que
a constante de 16 bits 737hexa ocupa dois bytes.
58 Apndice E Outra alternativa para o RISC: a arquitetura VAX

As operaes aritmticas do MIPS tambm so encontradas no VAX, com duas diferenas importantes. Pri-
meiro, o tipo dos dados est associado ao nome. Desse modo, addb, addw e addl operam sobre dados de 8 bits, de
16 bits e de 32 bits na memria ou em registradores, respectivamente; o MIPS tem uma nica instruo de adi-
o que opera apenas sobre o registrador de 32 bits completo. A segunda diferena que, para reduzir o tama-
nho do cdigo, a instruo de adio especifica o nmero de operandos exclusivos; o MIPS sempre especifica
trs deles, mesmo se um operando for redundante. Por exemplo, a instruo do MIPS

add $1, $1, $2

ocupa 32 bits, como todas as instrues do MIPS, mas a instruo do VAX

addl2 r1, r2

utiliza r1 para o destino e tambm para uma origem, ocupando apenas 24 bits: 8 bits para o opcode e 8 bits para
cada um dos dois especificadores de registradores.

Nmero de operaes
Agora podemos mostrar como os nomes de instrues do VAX so formados:

2
(operao)(tipo de dados)
3

A operao add funciona com os tipos de dados byte, word, long, float e double e surge em verses para 2 ou
3 operandos exclusivos; assim, as instrues a seguir so todas encontradas no VAX:

addb2 addw2 addl2 addf2 addd2


addb3 addw3 addl3 addf3 addd3

Levando-se em conta todos os modos de endereamento (mas ignorando nmeros de registradores e valores
de imediatos) e limitando-se apenas a byte, word e long, existem mais de 30.000 verses de adio de inteiros
no VAX; o MIPS tem apenas 4!
Outra razo para o grande nmero de instrues do VAX que as instrues substituem seqncias de ins-
trues ou ocupam menos bytes para representar uma nica instruo. Aqui esto quatro exemplos desse tipo
(* representa o tipo de dados):

Operao do VAX Exemplo Significado

clr* clrl r3 r3 = 0
inc* incl r3 r3 = r3 + 1
dec* decl r3 r3 = r3 1
push* pushl r3 sp = sp 4; Memria[sp] = r3;

A instruo push na ltima linha exatamente igual a utilizar a instruo de movimentao com enderea-
mento de autodecremento sobre o ponteiro da pilha:

movl (sp), r3

A brevidade a vantagem de pushl: ela um byte mais curta, pois sp est implcito.

Desvios, saltos e chamadas de procedimentos


As instrues de desvio do VAX esto relacionadas s instrues aritmticas, porque as instrues de desvio
contam com cdigos de condio. Os cdigos de condio so definidos como um efeito colateral de uma opera-
o e indicam se o resultado positivo, negativo, zero ou se ocorreu um estouro. A maioria das instrues defi-
E.5 Um exemplo para juntar tudo: swap 59

ne os cdigos de condio do VAX de acordo com seu resultado; as instrues sem resultados, como desvios,
no o fazem. Os cdigos de condio do VAX so N (Negative), Z (Zero), V (oVerflow) e C (Carry). Tambm
existe uma instruo de comparao cmp* apenas para definir os cdigos de condio correspondentes a um
desvio subseqente.
As instrues de desvio do VAX incluem todas as condies. As instrues de desvio populares incluem beql
(=), bneq (), blss (<), bleq (), bgtr (>) e bgeq (), que fazem exatamente o que se espera. Tambm existem
desvios incondicionais cujo nome determinado pelo tamanho do deslocamento relativo ao PC. Desse modo,
brb (branch byte desviar byte) tem um deslocamento de 8 bits e brw (branch word desviar palavra) tem um
deslocamento de 16 bits.
A ltima categoria importante que abordaremos aqui a das instrues de chamada e retorno de procedi-
mentos. Diferente do que ocorre na arquitetura MIPS, essas instrues elaboradas podem demorar dezenas de
ciclos de clock para serem executadas. As duas sees seguintes mostram como elas funcionam, mas precisa-
mos explicar o propsito dos ponteiros associados pilha manipulada por calls e ret. O ponteiro da pilha, sp,
semelhante ao ponteiro da pilha no MIPS; ele aponta para o topo da pilha. O ponteiro de argumento, ap, aponta
para a base da lista de argumentos ou parmetros na memria que so repassados ao procedimento. O ponteiro
de quadro, fp, aponta para a base das variveis locais do procedimento que so mantidas na memria (o quadro de
pilha). As instrues de chamada e retorno do VAX manipulam esses ponteiros para manter a pilha em condi-
o apropriada durante chamadas de procedimentos e para fornecer registradores-base convenientes para se
utilizar ao acessar operandos de memria. Como veremos, as instrues de chamada e retorno tambm salvam
e restauram os registradores de uso geral, bem como o contador de programa. A Figura E.4 fornece uma amos-
tragem adicional do conjunto de instrues do VAX.

E.5 Um exemplo para juntar tudo: swap


Para ver a programao em linguagem assembly do VAX, convertemos dois procedimentos de C, swap e sort. O
cdigo de C para swap reproduzido na Figura E.5. A prxima seo aborda sort.
Descrevemos o procedimento swap em trs etapas gerais de programao em linguagem assembly:
1. Alocar registradores a variveis de programa.

2. Produzir cdigo para o corpo do procedimento.

3. Preservar registradores durante a invocao do procedimento.

O cdigo VAX para esses procedimentos se baseia no cdigo produzido pelo compilador VMS C usando oti-
mizao.

Alocao de registradores para swap


Em contraste com o MIPS, os parmetros do VAX normalmente so alocados memria, e assim essa etapa de
programao em linguagem assembly mais apropriadamente chamada alocao de variveis. A conveno
padro do VAX sobre passagem de parmetros utilizar a pilha. Os dois parmetros, v[ ] e k, podem ser acessa-
dos usando-se o registrador ap, o ponteiro de argumentos: o endereo 4(ap) corresponde a v[ ] e 8(ap) corres-
ponde a k. Lembre-se de que, com o endereamento de byte, o endereo de palavras seqenciais de 4 bytes dife-
re por 4 unidades. A nica varivel alm dessas temp, que associamos ao registrador r3.

Cdigo para o corpo do procedimento swap


As linhas restantes de cdigo de C em swap so:

temp = v[k];
v[k] = v[k + 1];
v[k + 1] = temp;

Como esse programa utiliza v[ ] e k vrias vezes, para fazer os programas funcionarem com maior rapidez,
primeiro o compilador VAX move ambos os parmetros para registradores:
60 Apndice E Outra alternativa para o RISC: a arquitetura VAX

Tipo de instruo Exemplo Significado da instruo

Transferncias de dados Mover dados entre operandos de byte, meia palavra, palavra ou palavra dupla; * o tipo de dados
mov* Mover entre dois operandos
movzb* Mover um byte para uma meia palavra ou palavra, estendendo-a com zeros
mova* Mover o endereo de 32 bits de um operando; o tipo de dados o ltimo
push* Empurrar (push) operando para a pilha
Aritmticas/lgicas Operaes sobre inteiros ou bytes lgicos, meias palavras (16 bits), palavras (32 bits); * o tipo de dados
add*_ Soma com 2 ou 3 operandos
cmp* Comparar e definir cdigos de condio
tst* Comparar a zero e definir cdigos de condio
ash* Deslocamento aritmtico
clr* Limpar
cvtb* Byte estendido com sinal at o tamanho do tipo de dados
Controle Desvios condicionais e incondicionais
beql, bneq Desviar se igual, desviar se no-igual
bleq, bgeq Desviar se menor que ou igual a, desviar se maior que ou igual a
brb, brw Desvio incondicional com um endereo de 8 bits ou de 16 bits
jmp Salto usando qualquer modo de endereamento para especificar destino
aobleq Adicionar uma unidade ao operando; desviar se resultado segundo operando
case_ Salto com base em seletor de caso
Procedimento Chamada/retorno de procedimento
calls Chamar procedimento com argumentos na pilha (ver Seo E.6)
callg Chamar procedimento com lista de parmetros no estilo de FORTRAN
jsb Saltar para sub-rotina, salvando endereo de retorno (como jal do MIPS)
ret Retornar de chamada de procedimento
Ponto flutuante Operaes de ponto flutuante nos formatos D, F, G e H
addd_ Adicionar nmeros de ponto flutuante no formato D de preciso dupla
subd_ Subtrair nmeros de ponto flutuante no formato D de preciso dupla
mulf_ Multiplicar nmeros de ponto flutuante no formato F de preciso simples
polyf Avaliar um polinmio usando tabela de coeficientes no formato F
Outras Operaes especiais
crc Calcular verificao de redundncia cclica
insque Inserir uma entrada de fila em uma fila
Figura E.4 Classes de instrues do VAX com exemplos. O asterisco representa vrios tipos de dados: b, w, l, d, f, g, h e q. A sublinha,
como em addd_, significa que existem formas de 2 operandos (addd2) e de 3 operandos (addd3) dessa instruo.

swap(int v[ ], int k)
{
int temp;
temp = v[k];
v[k] = v[k + 1];
v[k + 1] = temp;
}
Figura E.5 Um procedimento de C que permuta duas posies na memria. Esse procedimento ser usado no exemplo de ordena-
o da prxima seo.
E.5 Um exemplo para juntar tudo: swap 61

movl r2, 4(ap) ;r2 = v[ ]


movl r1, 8(ap) ;r1 = k

Observe que seguimos a conveno do VAX de utilizar um ponto-e-vrgula para iniciar um comentrio; o
smbolo de comentrio # do MIPS representa um operando constante em linguagem assembly do VAX.
O VAX tem endereamento indexado, e assim podemos usar o ndice k sem convert-lo em um endereo de
byte. Ento, o cdigo VAX direto:

movl r3, (r2)[r1] ;r3 (temp) = v[k]


addl3 r0, #1,8(ap) ;r0 = k + 1
movl (r2)[r1],(r2)[r0] ;v[k] = v[r0] (v[k + 1])
movl (r2)[r0,r3] ;v[k + 1] = r3 (temp)

Diferente do cdigo MIPS, que consiste basicamente em duas cargas e dois armazenamentos, o cdigo-chave
do VAX uma movimentao de memria para registrador, uma movimentao de memria para memria e
uma movimentao de registrador para memria. Observe que a instruo addl3 mostra a flexibilidade dos mo-
dos de endereamento do VAX: ela adiciona a constante 1 a um operando de memria e coloca o resultado em
um registrador.
A essa altura, j alocamos espao de armazenamento e escrevemos o cdigo para executar as operaes do
procedimento. O nico item que falta o cdigo que preserva registradores atravs da rotina que chama swap.

Preservando registradores atravs da invocao de procedimento de swap


O VAX tem um par de instrues que preservam os registradores, calls e ret. Este exemplo mostra como elas
funcionam.
O compilador C do VAX utiliza uma forma de conveno de chamado. Examinando o cdigo anterior, ve-
mos que os valores nos registradores r0, r1, r2 e r3 devem ser salvos para que possam ser restaurados mais tar-
de. A instruo calls espera uma mscara de 16 bits no incio do procedimento para determinar que registrado-
res sero salvos: se o bit i estiver ativo na mscara, ento o registrador i ser salvo na pilha pela instruo calls.
Alm disso, calls salva essa mscara na pilha para permitir instruo de retorno (ret) restaurar os registrado-
res adequados. Desse modo, a instruo calls executada pelo chamador efetua a gravao, mas o chamado defi-
ne a mscara de chamada para indicar o que deve ser salvo.
Um dos operandos para calls fornece o nmero de parmetros que esto sendo repassados, de forma que
calls possa ajustar os ponteiros associados com a pilha: o ponteiro de argumento (ap), o ponteiro de quadro
(fp) e o ponteiro da pilha (sp). claro que calls tambm salva o contador do programa, de tal forma que o pro-
cedimento possa retornar!
Desse modo, para preservar esses quatro registradores para swap, simplesmente adicionamos a mscara ao
incio do procedimento, deixando a instruo calls no chamador fazer todo o trabalho:

.word ^m<r0,r1,r2,r3> ;ativa bits na mscara para 0,1,2,3.

Essa diretiva diz ao assembler para posicionar uma constante de 16 bits com os bits apropriados ativos para
salvar os registradores de r0 a r3.
A instruo de retorno desfaz o trabalho de calls. Ao terminar, ret configura o ponteiro da pilha a partir do
ponteiro de quadro atual para extrair tudo o que calls colocou na pilha. Nesse processo, ela restaura os valores
de registradores salvos por calls, incluindo os que foram marcados pela mscara e os valores antigos de fp, ap e
pc.
Para completar o procedimento swap, simplesmente adicionamos uma instruo:

ret ;restaura registradores e retorna

O procedimento swap completo


Agora estamos prontos para a rotina inteira. A Figura E.6 identifica cada bloco de cdigo com seu propsito
no procedimento, com o cdigo MIPS esquerda e o cdigo VAX direita. Este exemplo mostra a vantagem
do endereamento indexado escalonado e das sofisticadas instrues de chamada e retorno do VAX na redu-
62 Apndice E Outra alternativa para o RISC: a arquitetura VAX

MIPS versus VAX

Salvando registrador
swap: addi $29,$29, 12 swap: .word ^m<r0,r1,r2,r3>
sw $2, 0($29)
sw $15, 4($29)
sw $16, 8($29)
Corpo de procedimento
muli $2, $5,4 movl r2, 4(a)
add $2, $4,$2 movl r1, 8(a)
lw $15, 0($2) movl r3, (r2)[r1]
lw $16, 4($2) addl3 r0, #1,8(ap)
sw $16, 0($2) movl (r2)[r1],(r2)[r0]
sw $15, 4($2) movl (r2)[r0],r3
Restaurando registradores
lw $2, 0($29)
lw $15, 4($29)
lw $16, 8($29)
addi $29,$29, 12
Retorno de procedimento
jr $31 ret
Figura E.6 Comparao entre o cdigo assembly do MIPS e do VAX para o procedimento swap da Figura E.5.

o do nmero de linhas de cdigo. As 17 linhas de cdigo assembly do MIPS se tornaram 8 linhas de cdigo
assembly do VAX. Ele tambm mostra que a passagem de parmetros na memria resulta em acessos extras
memria.
Tenha em mente que o nmero de instrues executadas no significa o mesmo que desempenho; a falcia
da pgina 65 destaca esse ponto.

Elaborao O software do VAX segue uma conveno de tratar os registradores r0 e r1 como temporrios que no so sal-
vos atravs de uma chamada de procedimento; assim, o compilador C do VMS inclui os registradores r0 e r1 na
mscara de gravao de registradores. Alm disso, o compilador C deve ter usado r1 em vez de 8(ap) na instru-
o addl3; tais exemplos inspiram arquitetos de computadores a tentarem escrever compiladores!

E.6 Um exemplo mais longo: sort


Mostramos o exemplo mais longo do procedimento sort. A Figura E.7 mostra a verso de C do programa. Mais
uma vez, apresentamos esse procedimento em vrias etapas, concluindo com uma comparao lado a lado com
o cdigo MIPS.

Alocao de registradores para sort


Os dois parmetros do procedimento sort, v e n, so encontrados na pilha nas posies 4(ap) e 8(ap), respecti-
vamente. As duas variveis locais so atribudas a registradores: i a r6 e j a r4. Tendo em vista que os dois par-
metros freqentemente so referenciados no cdigo, o compilador C do VMS copia o endereo desses parme-
tros em registradores ao entrar no procedimento:

moval r7,8(ap) ;move o endereo de n para r7


moval r5,4(ap) ;move o endereo de v para r5
E.6 Um exemplo mais longo: sort 63

sort (int v[ ], int n)


{
int i, j;
for (i = 0; i < n; i = i + 1) {
for (j = i 1; j >= 0 && v[j] > v[j + 1]; j = j 1)
{ swap(v,j);
}
}
}
Figura E.7 Um procedimento de C que executa uma ordenao bubble sort no array v.

primeira vista, talvez parea que mover o valor do operando para um registrador seria mais til que mover
seu endereo; porm, mais uma vez, acatamos a deciso do compilador C do VMS. Aparentemente, o compila-
dor no pode ter certeza de que v e n no se sobrepem na memria.

Cdigo para o corpo do procedimento sort


O corpo do procedimento consiste em dois loops for aninhados e em uma chamada a swap, que inclui parme-
tros. Vamos abrir o cdigo de fora dentro.

O loop exterior
A primeira etapa de converso o primeiro loop for:

for (i = 0; i < n; i = i + 1) {

Lembre-se de que a instruo for de C tem trs partes: inicializao, teste de loop e incremento de iterao.
Para inicializar i como 0 basta uma instruo, a primeira parte da instruo for:

clrl r6 ;i = 0

Tambm basta apenas uma instruo para incrementar i, a ltima parte do loop for:

incl r6 ;i = i + 1

Devemos sair do loop se i < n falso ou, em outras palavras, sair do loop se i n. Esse teste ocupa duas ins-
trues:

for1tst: cmpl r6,(r7) ;compara r6 e memory[r7] (i:n)


bgeq exit1 ;vai para exit1 se r6 mem[r7] (i n)

Observe que cmpl define os cdigos de condio para uso pela instruo de desvio condicional bgeq.
A parte inferior do loop simplesmente salta de volta para o teste de loop:

brb for1tst ;desvia para teste de loop exterior


exit1:

A estrutura de cdigo do primeiro loop for ento:

clrl r6 ;i = 0
for1tst: cmpl r6,(r7) ;compara r6 e memory[r7] (i:n)
bgeq exit1 ;vai para exit1 se r6 mem[r7] (i n)
. . .
(corpo do primeiro loop for)
. . .
incl r6 ;i = i + 1
brb for1tst ;desvia para teste de loop exterior
exit1:
64 Apndice E Outra alternativa para o RISC: a arquitetura VAX

O loop interno
O segundo para loop :

for (j = i 1; j >= 0 && v[j] > v[j + 1]; j = j 1) {

A parte de inicializao desse loop novamente uma nica instruo:

subl3 r4,r6,#1 ;j = i 1

O decremento de j tambm uma nica instruo:

decl r4 ;j = j 1

O teste de loop tem duas partes. Deixamos o loop se qualquer condio falhar; assim, o primeiro teste deve
deixar o loop se houver falhar de (j < 0):

for2tst:blss exit2 ;vai para exit2 se r4 < 0 (j < 0)

Note que no h nenhuma comparao explcita. A falta de comparao uma vantagem dos cdigos de
condio, com as condies sendo definidas como um efeito colateral da instruo anterior. Esse desvio ignora
o segundo teste de condio.
O segundo teste sai se v[j] > v[j + 1] falso ou se v[j] v[j + 1]. Primeiro, carregamos v e colocamos j + 1
em registradores:

movl r3,(r5) ;r3 = Memory[r5] (r3 = v)


addl3 r2,r4,#1 ;r2 = r4 + 1 (r2 = j + 1)

O endereamento indireto de registrador usado para obter o operando apontado por r5.
Mais uma vez, o modo de endereamento de ndice significa que podemos usar ndices sem converso para o
endereo de byte, e assim as duas instrues para v[j] v[j + 1] so:

cmpl (r3)[r4],(r3)[r2] ;v[r4] : v[r2] (v[j]:v[j + 1])


bleq exit2 ;vai para exit2 se v[j] v[j + 1]

A parte inferior do loop salta de volta para o teste de loop completo:

brb for2tst # salta para o teste do loop interno

Combinando os fragmentos, o segundo loop for semelhante a este:

subl3 r4,r6, #1 ;j = i 1
for2tst: blss exit2 ;vai para exit2 se r4 < 0 (j < 0)
movl r3,(r5) ;r3 = Memory[r5] (r3 = v)
addl3 r2,r4,#1 ;r2 = r4 + 1 (r2 = j + 1)
cmpl (r3)[r4],(r3)[r2] ;v[r4] : v[r2]
bleq exit2 ;vai para exit2 se v[j v[j+1]
. . .
(corpo do segundo loop for)
. . .
decl r4 ;j = j 1
brb for2tst ;salta para teste de loop interno
exit2:

Note que a instruo blss (na parte superior do loop) est testando os cdigos de condio com base no
novo valor de r4 (j), definido por subl3 antes da entrada no loop ou por decl na parte inferior do loop.

A chamada de procedimento
A prxima etapa o corpo do segundo loop for:

swap(v,j);
E.7 Falcias e armadilhas 65

fcil chamar swap:

calls #2,swap

A constante 2 indica o nmero de parmetros empurrados para a pilha.

Passagem de parmetros
O compilador C repassa variveis para a pilha; assim, repassamos os parmetros para swap com estas duas ins-
trues:

pushl (r5) ;o primeiro parmetro de swap v


pushl r4 ;o segundo parmetro de swap j

O endereamento indireto de registrador usado para obter o operando da primeira instruo.

Preservando registradores atravs da invocao de procedimento de sort


O nico cdigo restante a gravao e restaurao de registradores, usando a conveno de gravao pelo cha-
mado. Este procedimento utiliza os registradores r2 a r7; assim, vamos acrescentar uma mscara com esses bits
ativos:

.word ^m<r2,r3,r4,r5,r6,r7>; definhe mscara para registradores 2 a 7

Tendo em vista que ret ir desfazer todas as operaes, simplesmente a inclumos no fim do procedimento.

O procedimento sort completo


Agora, juntamos todas as peas na Figura E.8. Para tornar o cdigo mais fcil de acompanhar, mais uma vez
identificamos cada bloco de cdigo com seu propsito no procedimento e listamos o cdigo MIPS e VAX lado a
lado. Neste exemplo, 11 linhas do procedimento sort em C se transformam nas 44 linhas da linguagem as-
sembly do MIPS e em 20 linhas na linguagem assembly do VAX. As maiores vantagens do VAX esto na grava-
o e restaurao de registradores e no endereamento indexado.

E.7 Falcias e armadilhas


A habilidade para simplificar significa eliminar o desnecessrio, de forma que o necessrio possa se expressar.
Hans Hoffman
Search for the Real, 1967

Falcia possvel projetar uma arquitetura sem defeitos.

Todo o projeto de arquitetura envolve compromissos assumidos no contexto de um conjunto de tecnologias


de hardware e software. Ao longo do tempo, essas tecnologias provavelmente mudaro, e decises que podem
ter sido corretas em uma poca podero parecer equvocos mais tarde. Por exemplo, em 1975, os projetistas do
VAX superenfatizaram a importncia da eficincia do tamanho do cdigo e subestimaram a importncia que a
facilidade de decodificao e o pipelining teriam dez anos mais tarde. Alm disso, quase todas as arquiteturas
sucumbem eventualmente falta de espao de endereos suficiente. Porm, evitar esses problemas a longo pra-
zo talvez signifique comprometer a eficincia da arquitetura a curto prazo.

Falcia Uma arquitetura com falhas no pode ser bem-sucedida.

O IBM 360 freqentemente criticado na literatura os desvios no so relativos ao PC, e o endereo pe-
queno demais no endereamento de deslocamento. Ainda assim, a mquina teve um enorme sucesso, porque
manipulava de forma correta diversos problemas novos. Primeiro, a arquitetura tem uma grande quantidade de
espao de endereos. Em segundo lugar, ela endereada por byte e manipula bem os bytes. Terceiro, mqui-
na de registrador de uso geral. Por fim, simples o bastante para ser implementada de modo eficiente em uma
ampla faixa de desempenho e custo.
66 Apndice E Outra alternativa para o RISC: a arquitetura VAX

MIPS versus VAX

Salvando registradores
sort: addi $29,$29, 36 sort: .word ^m<r2,r3,r4,r5,r6,r7>
sw $15, 0($29)
sw $16, 4($29)
sw $17, 8($29)
sw $18,12($29)
sw $19,16($29)
sw $20,20($29)
sw $24,24($29)
sw $25,28($29)
sw $31,32($29)
Corpo do procedimento
Parmetros de movimentao move $18, $4 moval r7,8(ap)
move $20, $5 moval r5,4(ap)
Loop exterior add $19, $0, $0 clrl r6
for1tst: slt $8, $19, $20 for1tst: cmpl r6,(r7)
beq $8, $0, exit1 bgeq exit1
Loop interno addi $17, $19, 1 subl3 r4,r6,#1
for2tst: slti $8, $17, 0 for2tst:
bne $8, $0, exit2 blss exit2
muli $15, $17, 4 movl r3,(r5)
add $16, $18, $15
lw $24, 0($16)
lw $25, 4($16) addl3 r2,r4,#1
slt $8, $25, $24 cmpl (r3)[r4],(r3)[r2]
beq $8, $0, exit2 bleq exit2
Passagem de parmetros e move $4, $18 pushl (r5)
chamada move $5, $17 pushl r4
jal swap calls #2,swap
Loop interno addi $17, $17, 1 decl r4
j for2tst brb for2tst
Loop exterior exit2: addi $19, $19, 1 exit2: incl r6
j for1tst brb for1tst
Restaurando registradores
exit1: lw $15, 0($29)
lw $16, 4($29)
lw $17, 8($29)
lw $18,12($29)
lw $19,16($29)
lw $20,20($29)
lw $24,24($29)
lw $25,28($29)
lw $31,32($29)
addi $29,$29, 36
Retorno de procedimento
jr $31 exit1: ret
Figura E.8 Comparao da verso do MIPS32 e de assembly do VAX do procedimento sort da Figura E.7.

O Intel 8086 fornece um exemplo ainda mais drstico. A arquitetura do 8086 a nica arquitetura difundida
existente hoje que no verdadeiramente uma mquina de registrador de uso geral. Alm disso, o espao de en-
dereos segmentado do 8086 causa problemas importantes tanto para os programadores quanto para os criado-
res de compiladores. Finalmente, ele difcil de implementar. Em geral, ele oferecias apenas metade do desem-
penho das arquiteturas RISC durante os ltimos oito anos, apesar de um investimento significativo por parte da
Intel. Apesar disso, a arquitetura 8086 devido sua seleo como microprocessador no IBM PC conseguiu
um enorme sucesso.
E.8 Comentrios finais 67

Falcia A arquitetura que executa menos instrues mais rpida.

Os projetistas de mquinas VAX executavam uma comparao quantitativa do VAX com o MIPS para imple-
mentaes com organizaes comparveis, o VAX 8700 e o MIPS M2000. A Figura E.9 mostra a razo entre o
nmero de instrues executadas e a razo de desempenho medida em ciclos de clock. O MIPS executa aproxi-
madamente duas vezes mais instrues que o VAX, enquanto o MIPS M2000 tem quase trs vezes o desempe-
nho do VAX 8700.

3,5
Instrues executadas Desempenho
3

2,5

MIPS/VAX
2

1,5

0,5

0
spice matrix nasa7 fpppp tomcatv doduc espresso eqntott li
Nmero de bits de deslocamento

Figura E.9 Relao entre o MIPS M2000 e o VAX 8700 em instrues executadas e desempenho em ciclos de clock, usan-
do programas do SPEC89. Em mdia, o MIPS executa pouco mais de duas vezes o nmero de instrues executadas pelo VAX;
porm, o CPI para o VAX quase seis vezes o CPI do MIPS, resultando em uma vantagem de desempenho de quase trs vezes. (Ba-
seada em dados de Performance from Architecture: Comparing a RISC and CISC with Similar Hardware Organization, de D.
Bhandarkar e D. Clark, em Proc.Symp.Architectural Support for Programming Languages and Operating Systems IV, 1991.).

E.8 Comentrios finais


A Virtual Address eXtension da arquitetura PDP-11... oferece um endereo virtual de aproximadamente 4,3 gi-
gabytes que, mesmo com o rpido aperfeioamento da tecnologia de memria, deve ser adequado por muito
tempo no futuro.
William Strecker
VAX-11/780 A Virtual Address Extension to the PDP-11
Family, AFIPS Proc., National Computer Conference, 1978

Vimos que os conjuntos de instrues podem variar de forma bastante drstica, tanto na maneira como aces-
sam operandos quanto nas operaes que podem ser executadas por uma nica instruo. A Figura E.10 com-
para a utilizao de instrues por ambas as arquiteturas para dois programas; mesmo arquiteturas muito dife-
rentes se comportam de modo semelhante em seu uso de classes de instrues.
Sendo um produto de seu tempo, a nfase do VAX em densidade de cdigo e operaes e modos de endere-
amento complexos entra em conflito com a nfase atual na facilidade de decodificao, operaes e modos de
endereamento simples e desempenho com pipeline.

Aritmtica/ Transferncia Ponto


Programa Mquina Desvio lgica de dados flutuante Totais

gcc VAX 30% 40% 19% 89%


MIPS 24% 35% 27% 86%
spice VAX 18% 23% 15% 23% 79%
MIPS 4% 29% 35% 15% 83%
Figura E.10 A freqncia de distribuio de instrues para dois programas no VAX e no MIPS.
68 Apndice E Outra alternativa para o RISC: a arquitetura VAX

Com mais de 600.000 unidades vendidas, a arquitetura VAX teve um perodo muito bem-sucedido. Em
1991, a DEC fez a transio do VAX para o Alpha, uma arquitetura de endereos de 64 bits muito semelhante ao
MIPS.
A ortogonalidade a chave para a arquitetura VAX; o opcode independente dos modos de endereamento,
que so independentes dos tipos de dados e at do nmero de operandos exclusivos. Desse modo, algumas cen-
tenas de operaes se expandem at centenas de milhares de instrues quando se levam em conta os tipos de
dados, as quantidades de operandos e os modos de endereamento.

E.9 Perspectiva histrica e leitura adicional


VAX: o projeto de minicomputador mais bem-sucedido na histria da indstria... o VAX provavelmente era a m-
quina favorita do hacker.... Observa-se em especial seu grande conjunto de instrues em assembler amigvel
para o programador um recurso que se tornou uma obrigao depois da revoluo do RISC.
Eric Raymond
The New Hacker's Dictionary, 1991

Em meados da dcada de 1970, a DEC percebeu que o PDP-11 estava ficando sem espao de endereos. O espa-
o de 16 bits tinha sido estendido de vrias maneiras criativas, mas o pequeno espao de endereos era um pro-
blema que s podia ser adiado, no superado.
Em 1977, a DEC introduziu o VAX. Strecker descreveu a arquitetura e chamou o VAX de uma Virtual
Address eXtension do PDP-11. Um dos principais objetivos da DEC era manter a base instalada de clientes
do PDP-11. Desse modo, os clientes eram levados a pensar no VAX como um sucessor de 32 bits do PDP-11.
Um PDP-11 de 32 bits era possvel havia trs projetos mas Strecker informa que eles estavam comprome-
tidos demais em termos de eficincia, funcionalidade e facilidade de programao. A soluo escolhida foi
criar uma nova arquitetura e incluir um modo de compatibilidade com o PDP-11 que executaria programas
do PDP-11 sem alteraes. Esse modo tambm permitiu que os compiladores do PDP-11 funcionassem e
continuassem a ser usados. O VAX-11/780 lembrava o PDP-11 em muitos aspectos. Estes esto entre os mais
importantes:
1. Tipos de dados e formatos so em sua maioria equivalentes aos do PDP-11. Os formatos flutuantes F e D vie-
ram do PDP-11. Os formatos G e H foram acrescentados mais tarde. O uso do termo palavra para descre-
ver uma quantidade de 16 bits foi transportado do PDP-11 para o VAX.
2. A linguagem assembly era semelhante das mquinas PDP-11.

3. Os mesmos barramentos eram admitidos (Unibus e Massbus).

4. O sistema operacional, o VMS, era uma evoluo do SO RSX-11M/IAS (em oposio ao SO DECsystem
10/20, que era um sistema mais avanado), e o sistema de arquivos era basicamente o mesmo.
O VAX-11/780 foi a primeira mquina anunciada na srie VAX. uma das mais bem-sucedidas e intensa-
mente estudadas mquinas j construdas. Ela se baseava fortemente em microprogramao, tirando proveito
da capacidade crescente da memria rpida de semicondutor para implementar as instrues e os modos de en-
dereamento complexos. O VAX est to ligado ao microcdigo que prevemos que ser impossvel construir o
conjunto de instrues VAX completo sem microcdigo.
Para oferecer um VAX de um nico chip em 1984, a DEC reduziu as instrues interpretadas por microcdi-
go capturando algumas instrues e executando-as em software. Os engenheiros da DEC descobriram que 20%
das instrues do VAX so responsveis por 60% do microcdigo, ainda que s sejam executadas durante 0,2%
do tempo. O resultado final foi um chip que oferecia 90% do desempenho, reduzindo a rea de silcio a um ta-
manho mais de cinco vezes menor.
O fundamento da estratgia da DEC era uma nica arquitetura, o VAX, executando um nico sistema opera-
cional, o VMS. Essa estratgia funcionou bem por mais de dez anos. Hoje, a DEC fez a transio para a arquite-
tura RISC do Alpha. Como a transio do PDP-11 para o VAX, o Alpha oferece o mesmo sistema operacional, o
mesmo sistema de arquivos e os mesmos tipos e formatos de dados do VAX. Em vez de oferecer um modo de
compatibilidade com o VAX, a abordagem do Alpha compilar o cdigo de mquina do VAX no cdigo de m-
quina do Alpha.
Exerccios 69

Para pesquisa adicional


Levy, H. e R. Eckhouse [1989]. Computer Programming and Architecture: The VAX, Digital Press, Boston.
Este livro se concentra no VAX, mas inclui descries de outras mquinas.

Exerccios
E.1 [3] <E.4> A instruo VAX a seguir decrementa a posio apontada para ser o registrador r5:

decl (r5)

Qual a nica instruo do MIPS ou, se ela no puder ser representada em uma nica instruo, a seqncia mais
curta de instrues MIPS que executa a mesma operao? Quais so os comprimentos das instrues em cada mqui-
na?
E.2 [5] <E.4> Este exerccio igual ao Exerccio E.1, exceto pelo fato de esta instruo VAX limpar uma posio usando o
endereamento de auto-incremento adiado:

clrl @(r5)+

E.3 [5] <E.5> Este exerccio igual ao Exerccio E.1, exceto pelo fato de esta instruo VAX somar 1 ao registrador r5,
colocar a soma de volta no registrador r5, comparar a soma ao registrador r6, e depois se desviar para L1 se r5 < r6:

aoblss r6, r5,L1 # r5 = r5 + 1; if (r5 < r6) goto L1

E.4 [5] <E.2> Mostre a nica instruo do VAX ou a seqncia mnima de instrues correspondente a esta instruo de
C:

a = b + 100;

Suponha que a corresponda ao registrador r3 e b corresponda ao registrador r4.


E.5 [10] <E.2> Mostre a nica instruo do VAX ou a seqncia mnima de instrues correspondente a esta instruo de
C:

x[i + 1] = x[i] + c;

Suponha que c corresponda ao registrador r3, i ao registrador r4, e que x seja um array de palavras de 32 bits co-
meando na posio de memria 4.000.000dez.
F
A arquitetura IBM
360/370 para
computadores
de grande porte
No estamos sendo de forma alguma humildes neste lanamento. Este o
anncio de produto mais importante que esta corporao j realizou em
sua histria. No um computador em qualquer sentido anterior. No
um produto, mas uma linha de produtos... que se estende em desempe-
nho desde a parte muito baixa da linha de computadores at a parte mui-
to alta.
Porta-voz da IBM
ao anunciar o System/360 (1964)

F.1 Introduo
F.2 Conjunto de instrues do System/360
F.3 Medies detalhadas do 360
F.4 Perspectiva histrica e referncias

2003, Elsevier Science (EUA).


2003, Editora Campus Ltda. uma empresa Elsevier. Todos os direitos reservados.
72 Apndice F A arquitetura IBM 360/370 para computadores de grande porte

F.1 Introduo
A expresso arquitetura de computadores foi cunhada pela IBM em 1964 para uso com o IBM 360. Amdahl,
Blaauw e Brooks [1994] usaram a expresso para se referir poro do conjunto de instrues visvel para o
programador. Eles acreditavam que uma famlia de mquinas da mesma arquitetura deveria ser capaz de execu-
tar o mesmo software. Embora essa idia possa nos parecer bvia hoje, ela era bastante inovadora na poca. A
IBM, ainda que fosse a empresa lder na indstria, tinha cinco diferentes arquiteturas antes do 360. Desse
modo, a noo de padronizao por uma empresa de uma nica arquitetura era radical. Os projetistas do 360 ti-
nham esperana de que seis diferentes divises da IBM pudessem ser reunidas pela definio de uma arquitetu-
ra comum. Sua definio de arquitetura era

... a estrutura de um computador que um programador de linguagem de mquina deve entender para escrever um
programa correto (independente da contagem de tempo) para essa mquina.

A expresso programador de linguagem de mquina significava que a compatibilidade se manteria, mes-


mo em linguagem assembly, enquanto independente da contagem de tempo permitia diferentes implementa-
es.
O IBM 360 foi introduzido em 1964 com seis modelos e uma relao de desempenho de 25:1. Amdahl, Blaauw
e Brooks [1994] descrevem a arquitetura do IBM 360 e o conceito de permitir vrias implementaes de cdi-
go-objeto compatvel. A noo de uma arquitetura de conjunto de instrues como entendemos hoje era o as-
pecto mais importante do 360. A arquitetura tambm introduziu vrias inovaes importantes, agora em uso
disseminado:

1. Arquitetura de 32 bits.

2. Memria enderevel por bytes com bytes de 8 bits.

3. Tamanhos de dados de 8, 16, 32 e 64 bits.

Em 1971, a IBM entregou o primeiro System/370 (modelos 155 e 165), que inclua uma srie de extenses
significativas do 360, descritas por Case e Padegs [1978], que tambm discutem o histrico inicial do
System/360. A incluso mais importante foi a memria virtual, embora mquinas 370 com memria virtual no
tenham sido comercializadas at 1972, quando ficou pronto um sistema operacional de memria virtual. Em
1978, o 370 de alta tecnologia era vrias centenas de vezes mais rpido que as mquinas 360 de nvel de entrada
entregues dez anos antes. Em 1984, o modelo de endereamento de 24 bits construdo no IBM 360 precisou ser
abandonado, e foi introduzido o 370-XA (eXtended Architecture). Embora os programas antigos de 24 bits pu-
dessem ser admitidos sem alteraes, vrias instrues no podiam funcionar da mesma maneira quando es-
tendidas para um modelo de endereamento de 32 bits (com suporte de endereos de 31 bits) porque elas no
produziriam endereos de 31 bits. A converso do sistema operacional, escrito principalmente em linguagem
assembly, era sem dvida a maior tarefa.
Vrios estudos do IBM 360 e da medio de instrues foram realizados. A tese de Shustek [1978] o mais
conhecido e mais completo estudo da arquitetura do 360/370. Ele fez diversas observaes sobre a complexida-
de do conjunto de instrues que no foram totalmente apreciadas at alguns anos mais tarde. Outro importan-
te estudo do 360 o estudo de Toronto, realizado por Alexander e Wortman [1975] em um IBM 360, usando
19 programas XPL.

F.2 Conjunto de instrues do System/360


O conjunto de instrues do 360 mostrado nas tabelas a seguir, organizado por tipo de instruo e formato. O
System/370 contm 15 instrues do usurio adicionais.
F.2 Conjunto de instrues do System/360 73

Instrues R-R de inteiros/lgicas e de ponto flutuante


O * indica que a instruo de ponto flutuante e pode ser D (de preciso dupla) ou E (de preciso simples).

Instruo Descrio

ALR Adicionar registrador lgico


AR Adicionar registrador
A*R Adio de FP
CLR Comparar registrador lgico
CR Comparar registrador
C*R Comparao de FP
DR Dividir registrador
D*R Diviso de FP
H*R Diviso metade de FP
LCR Carregar registrador de complemento
LC*R Carregar complemento
LNR Carregar registrador negativo
LN*R Carregar negativo
LPR Carregar registrador positivo
LP*R Carregar positivo
LR Carregar registrador
L*R Carregar registrador de FP
LTR Carregar e testar registrador
LT*R Carregar e testar registrador de FP
MR Multiplicar registrador
M*R Multiplicao de FP
NR And de registrador
OR Or de registrador
SLR Subtrair registrador lgico
SR Subtrair registrador
S*R Subtrao de FP
XR Or exclusivo de registrador

Instrues R-R de desvios e configurao de status


Essas so instrues de formato R-R que efetuam um desvio ou definem algum status do sistema; vrias delas
so privilegiadas e s so vlidas em modo de supervisor.

Instruo Descrio

BALR Desvio e link


BCTR Desvio em contagem
BCR Desvio/condio
ISK Inserir chave
SPM Definir mscara de programa
SSK Definir chave de armazenamento
SVC Chamada de supervisor
74 Apndice F A arquitetura IBM 360/370 para computadores de grande porte

Instrues de desvios/lgicas e de ponto flutuante formato RX


Estas so todas instrues no formato RX. O smbolo + significa uma operao de palavra (e ento no repre-
senta nada) ou H (significando meia palavra); por exemplo, A+ representa os dois opcodes A e AH. O smbolo *
D ou E, representando ponto flutuante de preciso dupla ou de preciso simples.

Instruo Descrio

A+ Adio
A* Adio de FP
AL Adio lgica
C+ Comparao
C* Comparao de FP
CL Comparao lgica
D Diviso
D* Diviso de FP
L+ Carregar
L* Carregar registrador de FP
M+ Multiplicao
M* Multiplicao de FP
N And
O Or
S+ Subtrao
S* Subtrao de FP
SL Subtrao lgica
ST+ Armazenar
ST* Armazenar registrador de FP
X Or exclusivo

Instrues de desvio e instrues especiais de carga e armazenamento formato RX

Instruo Descrio

BAL Desvio e link


BC Condio de desvio
BCT Desvio em contagem
CVB Converso de binrio
CVD Converso de decimal
EX Executar
IC Inserir caractere
LA Carregar endereo
STC Armazenar caractere

Instrues nos formatos RS e SI


Estas so as instrues nos formatos RS e SI. O smbolo * pode ser A (aritmtica) ou L (lgica).

Instruo Descrio

BXH Desvio/alto
BXLE Desvio/baixo-igual
CLI Comparar imediato lgico
HIO Suspender E/S
F.2 Conjunto de instrues do System/360 75

Instruo Descrio

LPSW Carregar PSW


LM Carregar mltiplo
MVI Mover imediato
NI And de imediato
OI Or de imediato
RDD Ler direto
SIO Iniciar E/S
SL* Deslocar A/L esquerda
SLD* Deslocar A/L duplo esquerda
SR* Deslocar A/L direita
SRD* Deslocar A/L duplo direita
SSM Configurar mscara de sistema
STM Armazenar mltiplo
TCH Testar canal
TIO Testar E/S
TM Testar sob mscara
TS Testar e definir
WRD Gravar direto
XI Or exclusivo de imediato

Instrues no formato SS
Estas so instrues de adio de decimais ou de strings.

Instruo Descrio

AP Adicionar compactado
CLC Comparar caracteres lgicos
CP Comparar compactado
DP Dividir compactado
ED Editar
EDMK Editar e marcar
MP Multiplicar compactado
MVC Mover caractere
MVN Mover numrico
MVO Mover com deslocamento
MVZ Mover zona
NC And de caracteres
OC Or de caracteres
PACK Compactar (Caractere decimal)
SP Subtrair compactado
TR Converter
TRT Converter e testar
UNPK Descompactar
XC Or exclusivo de caracteres
ZAP Zerar e somar compactado
76 Apndice F A arquitetura IBM 360/370 para computadores de grande porte

F.3 Medies detalhadas do 360


A Figura F.1 mostra a freqncia de utilizao de instrues para quatro programas do IBM 360.

Instruo PLIC FORTGO PLIGO COBOLGO Mdia

Controle 32% 13% 5% 16% 16%


BC, BCR 28% 13% 5% 14% 15%
BAL, BALR 3% 2% 1%
Aritmtica/lgica 29% 35% 29% 9% 26%
A, AR 3% 17% 21% 10%
SR 3% 7% 3%
SLL 6% 3% 2%
LA 8% 1% 1% 2%
CLI 7% 2%
NI 7% 2%
C 5% 4% 4% 0% 3%
TM 3% 1% 3% 2%
MH 2% 1%
Transferncia de dados 17% 40% 56% 20% 33%
L, LR 7% 23% 28% 19% 19%
MVI 2% 16% 1% 5%
ST 3% 7% 3%
LD 7% 2% 2%
STD 7% 2% 2%
LPDR 3% 1%
LH 3% 1%
IC 2% 1%
LTR 1% 0%
Ponto flutuante 7% 2%
AD 3% 1%
MDR 3% 1%
Decimal, string 4% 40% 11%
MVC 4% 7% 3%
AP 11% 3%
ZAP 9% 2%
CVD 5% 1%
MP 3% 1%
CLC 3% 1%
CP 2% 1%
ED 1% 0%
Totais 82% 95% 90% 85% 88%
Figura F.1 Distribuio de freqncias de execuo de instrues para os quatro programas do 360. Todas as instrues com uma
freqncia de execuo maior que 1,5% foram includas. Instrues de imediatos, que operam somente sobre um nico byte, esto inclu-
das na seo que caracterizou sua operao, em vez de serem listadas com as verses de strings de caracteres longos da mesma operao.
Em comparao, as freqncias mdias para as classes de instrues mais importantes do VAX so 23% (controle), 28% (aritmtica), 29%
(transferncia de dados), 7% (ponto flutuante) e 9% (decimais). Mais uma vez, uma entrada de 1% na coluna da mdia pode ocorrer, devi-
do a entradas nas colunas constituintes. Esses programas so um compilador para a linguagem de programao PL-I e sistemas runtime
para as linguagens de programao FORTRAN, PL/I e Cobol.
F.4 Perspectiva histrica e referncias 77

F.4 Perspectiva histrica e referncias


O IBM 360 foi o primeiro computador a ser vendido em grandes quantidades com endereamento de byte usan-
do bytes de 8 bits e com registradores de uso geral. O 360 tambm tinha instrues de registrador-memria e
instrues limitadas de memria-memria. Essa arquitetura definiu o caminho para a compatibilidade binria,
que foi seguido por outros.
Os arquitetos do IBM 360 estavam conscientes da importncia do tamanho do endereo e tinham planos
para estender a arquitetura at 32 bits de endereo. Porm, apenas 24 bits foram utilizados no IBM 360 porque,
em 1964, os modelos 360 de nvel de entrada seriam ainda mais lentos com os endereos maiores. Infelizmente,
os arquitetos no revelaram seus planos ao pessoal do software, e os programadores que armazenavam infor-
maes extras nos 8 bits de endereo superiores no utilizados anularam o esforo de expanso. Virtualmen-
te todo computador desde ento ir verificar se os bits no utilizados permanecem no utilizados, e executaro
a captura se os bits tiverem o valor errado.
A IBM estendeu oficialmente o endereo para 32 bits em 1970, com a arquitetura IBM/370. Apenas h pouco
tempo a IBM expandiu essa arquitetura para um endereo plano de 64 bits, com o IBM/390.

Referncias
Alexander, W. G. e D. B. Wortman [1975]. Static and dynamic characteristics of XPL programs, IEEE Computer
8(11) (novembro), 4146.
Amdahl, G. M., G. A. Blaauw e F. P. Brooks, Jr. [1964]. Architecture of the IBM System/360, IBM J. Research and
Development 8:2 (abril), 87101.
Case, R. P. e A. Padegs [1 978]. The architecture of the IBM System/370, Communications of the ACM, 21:1, 7396.
Shustek, L. J. [1978]. Analysis and Performance of Computer Instruction Sets. Dissertao de doutorado, Stanford Uni-
versity (janeiro).
G
Processadores vetoriais
Revisado por Krste Asanovic
Departamento de Engenharia Eltrica e Cincia da Computao do MIT

Certamente no estou criando processadores vetoriais. Existem hoje trs


tipos que conheo. Eles so representados pelo Illiac-IV, pelo processador
(CDC) Star e pelo processador TI (ASC). Todos trs foram processadores pio-
neiros.... Um dos problemas de ser um pioneiro que voc sempre comete
erros. Por essa razo, nunca desejei ser um pioneiro. sempre melhor ficar
em segundo lugar quando se tem a possibilidade de estudar os erros co-
metidos pelos pioneiros.
Seymour Cray
Palestra pblica nos Lawrence Livermore Laboratories,
na apresentao do Cray-1 (1976)

G.1 Por que processadores vetoriais?


G.2 Arquitetura vetorial bsica
G.3 Duas questes reais: comprimento de vetor e espaamento
G.4 Otimizao do desempenho vetorial
G.5 Eficcia dos compiladores de vetorizao
G.6 Juntando tudo: desempenho de processadores vetoriais
G.7 Falcias e armadilhas
G.8 Comentrios finais
G.9 Perspectiva histrica e referncias
Exerccios

2003, Elsevier Science (EUA).


2003, Editora Campus Ltda. uma empresa Elsevier. Todos os direitos reservados.
80 Apndice G Processadores vetoriais

G.1 Por que processadores vetoriais?


Nos Captulos 3 e 4 vimos como podamos aumentar significativamente o desempenho de um processador
emitindo vrias instrues por ciclo de clock e realizando o pipelining mais profundo das unidades de execu-
o para permitir maior explorao do paralelismo em nvel de instruo. (Este apndice pressupe que voc
leu totalmente os Captulos 3 e 4; alm disso, a discusso sobre sistemas de memria vetorial pressupe que
voc leu o Captulo 5.) Infelizmente, tambm vimos que existem srias dificuldades na explorao de graus
ainda maiores de ILP.
medida que aumentamos tanto a largura de emisso de instrues quanto a profundidade dos pipelines
das mquinas, tambm aumentamos o nmero de instrues independentes necessrias para manter o proces-
sador ocupado com trabalho til. Isso significa um aumento no nmero de instrues parcialmente executadas
que podem estar em trnsito ao mesmo tempo. No caso de uma mquina com programao de execuo din-
mica, estruturas de hardware como janelas de instrues, buffers de reordenao e arquivos de registradores de
mudana de nomes, devem crescer at terem capacidade suficiente para conter todas as instrues em trnsito
e, pior ainda, o nmero de portas em cada elemento dessas estruturas deve crescer com a largura de emisso. A
lgica para controlar dependncias entre todas as instrues em trnsito cresce com o quadrado do nmero de
instrues. At mesmo uma mquina VLIW estaticamente programada, que desloca uma parte maior do traba-
lho de programao de execuo para o compilador, exige mais registradores, mais portas por registrador e
mais lgica de bloqueio de riscos (supondo-se um projeto em que o hardware administre os bloqueios aps o
tempo de emisso) para admitir mais instrues em trnsito, o que, de forma semelhante, provoca aumentos
quadrticos no tamanho e na complexidade dos circuitos. Esse rpido aumento na complexidade dos circuitos
torna difcil construir mquinas que possam controlar grande nmero de instrues em trnsito e, conseqen-
temente, limita as larguras de emisso e as profundidades de pipelines prticas.
Os processadores vetoriais foram comercializados com sucesso muito antes das mquinas paralelas em nvel de
instruo e adotam uma abordagem alternativa para controlar vrias unidades funcionais com pipelines profun-
dos. Os processadores vetoriais fornecem operaes de alto nvel que funcionam sobre vetores arrays lineares de
nmeros. Uma operao vetorial tpica pode somar dois vetores de ponto flutuante de 64 elementos para obter
um nico vetor resultado de 64 elementos. A instruo vetorial equivalente a um loop inteiro, com cada iterao
computando um dos 64 elementos do resultado, atualizando os ndices e se desviando de volta para o incio.
As instrues vetoriais tm vrias propriedades importantes que resolvem a maior parte dos problemas
mencionados antes:
n Uma nica instruo vetorial especifica uma grande quantidade de trabalho ela equivalente execuo
de um loop inteiro. Cada instruo representa dezenas ou centenas de operaes, e assim a largura de banda de
busca e decodificao de instrues necessria para manter ocupadas vrias unidades funcionais com pipeli-
ne profundo drasticamente reduzida.
n Usando uma instruo vetorial, o compilador ou o programador indica que a computao de cada resultado
no vetor independente da computao de outros resultados no mesmo vetor, e assim o hardware no tem
de verificar riscos de dados dentro de uma instruo vetorial. Os elementos no vetor podem ser calculados
com o uso de um array de unidades funcionais paralelas ou de uma nica unidade funcional com pipeline
muito profundo ou de qualquer configurao intermediria de unidades funcionais paralelas e com pipeline.
n O hardware s precisa verificar riscos de dados entre duas instrues vetoriais uma vez por operando veto-
rial, e no uma vez para cada elemento dentro dos vetores. Isso significa que a lgica de verificao de depen-
dncias necessria entre duas instrues vetoriais aproximadamente igual que exigida entre duas ins-
trues escalares, mas agora um nmero muito maior de operaes elementares pode estar em trnsito para
a mesma complexidade da lgica de controle.
n Instrues vetoriais que acessam a memria tm um padro de acesso conhecido. Se todos os elementos do
vetor forem adjacentes, a busca do vetor a partir de um conjunto de bancos de memria fortemente interca-
lados funcionar muito bem (como vimos na Seo 5.8). O alta latncia de iniciar um acesso memria prin-
cipal em vez de acessar uma cache ser amortizado, porque um nico acesso ser iniciado para o vetor intei-
ro, em vez de uma nica palavra. Desse modo, o custo da latncia para a memria principal s ser visto uma
vez para o vetor inteiro, e no uma vez para cada palavra do vetor.
G.2 Arquitetura vetorial bsica 81

n Pelo fato de um loop inteiro ser substitudo por uma instruo vetorial cujo comportamento predetermina-
do, os riscos de controle que surgiriam normalmente do desvio do loop so inexistentes.
Por essas razes, as operaes vetoriais podem se tornar mais rpidas que uma seqncia de operaes esca-
lares sobre o mesmo nmero de itens de dados, e os projetistas so motivados a incluir unidades vetoriais se o
domnio da aplicao puder us-los com freqncia.
Como mencionamos antes, os processadores vetoriais canalizam e dispem em paralelo as operaes sobre
os elementos individuais de um vetor. Elas incluem no apenas as operaes aritmticas (multiplicao, adio
e assim por diante), mas tambm acessos memria e clculos de endereos efetivos. Alm disso, a maioria dos
processadores vetoriais de ponta permite que vrias instrues vetoriais estejam em andamento ao mesmo tem-
po, criando um paralelismo ainda maior entre as operaes sobre vetores diferentes.
Os processadores vetoriais so particularmente teis para grandes aplicaes cientficas e de engenharia, in-
cluindo simulaes de desastres de automveis e previso do tempo, para as quais um trabalho tpico poderia
exigir dezenas de horas de tempo de supercomputador, funcionando sobre conjuntos de dados de vrios gi-
gabytes. As aplicaes de multimdia tambm podem se beneficiar do processamento vetorial, pois elas contm
um paralelismo de dados abundante e processam grandes fluxos de dados. Em geral, um processador com pipe-
line de alta velocidade usar uma cache para evitar forar instrues de referncia de memria a terem uma la-
tncia muito longa. Infelizmente, grandes programas cientficos de execuo demorada com freqncia tm
conjuntos de dados ativos muito extensos, que s vezes so acessados com baixa localidade, resultando em um
desempenho fraco da hierarquia de memria. Esse problema poderia ser superado pela no-colocao dessas
estruturas na cache, se fosse possvel determinar os padres de acesso memria e canalizar os acessos me-
mria de forma eficiente. As arquiteturas de cache inovadoras e a assistncia do compilador durante a formao
de blocos e a pr-busca esto diminuindo esses problemas de hierarquia de memria, mas eles continuam a ser
srios em algumas aplicaes.

G.2 Arquitetura vetorial bsica


Em geral, um processador vetorial consiste em uma unidade escalar com pipeline comum, e mais uma unidade
vetorial. Todas as unidades funcionais dentro da unidade vetorial tm uma latncia de vrios ciclos de clock.
Isso permite um menor tempo de ciclo de clock e compatvel com operaes vetoriais demoradas que podem
ter um pipeline profundo sem gerar riscos. A maioria dos processadores vetoriais permite que os vetores sejam
tratados como nmeros em ponto flutuante, como inteiros ou como dados lgicos. Aqui, vamos nos concentrar
no ponto flutuante. Basicamente, a unidade escalar no difere em nada do tipo de CPU com pipeline avanado
descrito nos Captulos 3 e 4, e as mquinas vetoriais comerciais incluam tanto unidades escalares fora de or-
dem (NEC SX/5) quanto unidades escalares VLIW (Fujitsu VPP5000).
Existem dois tipos principais de arquiteturas para processadores vetoriais: processadores de registradores ve-
toriais e processadores vetoriais de memria-memria. Em um processador de registrador vetorial, todas as ope-
raes vetoriais exceto carga e armazenamento ocorrem entre os registradores vetoriais. Essas arquiteturas
so o equivalente vetorial de uma arquitetura de carga-armazenamento. Todos os computadores vetoriais im-
portantes comercializados desde o final da dcada de 1980 empregam uma arquitetura de registrador vetorial,
inclusive os processadores da Cray Research (Cray-1, Cray-2, X-MP, Y-MP, C90, T90 e SV1), os supercompu-
tadores japoneses (NEC SX/2 a SX/5, Fujitsu VP200 a VPP5000 e as mquinas Hitachi S820 e S-8300) e os su-
perminicomputadores (Convex C-1 a C-4). Em um processador vetorial de memria-memria, todas as opera-
es vetoriais so realizadas da memria para a memria. Os primeiros computadores vetoriais eram desse tipo,
bem como os computadores vetoriais da CDC. Deste ponto em diante, nos concentraremos somente em arqui-
teturas de registrador vetorial; retornaremos em breve s arquiteturas vetoriais de memria-memria no fim do
apndice (Seo G.9) para discutir por que elas no tm sido to bem-sucedidas quanto as arquiteturas de re-
gistrador vetorial.
Comearemos com um processador de registrador vetorial que consiste nos principais componentes mos-
trados na Figura G.1. Esse processador, livremente baseado no Cray-1, a base para a discusso que forma a
maior parte deste apndice. Ns o chamaremos VMIPS; sua poro escalar MIPS e sua poro vetorial a ex-
tenso vetorial lgica do MIPS. O restante desta seo examina como a arquitetura bsica do VMIPS se relacio-
na a outros processadores.
82 Apndice G Processadores vetoriais

Memria principal

Carga-armazenamento Adio/subtrao de FP
vetorial

Multiplicao de FP

Diviso de FP

Registradores
Inteiros
vetoriais

Lgica

Registradores
escalares

Figura G.1 A estrutura bsica de uma arquitetura de registrador vetorial, o VMIPS. Esse processador tem uma arquitetu-
ra escalar muito semelhante ao MIPS. Tambm existem oito registradores vetoriais de 64 elementos, e todas as unidades funcio-
nais so unidades funcionais vetoriais. Instrues vetoriais especiais so definidas, tanto para aritmtica quanto para acessos
memria. Mostraremos as unidades vetoriais para operaes lgicas e de inteiros. Essas unidades so includas para que o
VMIPS se parea com um processador vetorial padro, que normalmente inclui essas unidades. Todavia, no discutiremos essas
unidades, exceto nos exerccios. Os registradores vetoriais e escalares tm um nmero significativo de portas de leitura e grava-
o para permitir vrias operaes vetoriais simultneas. Essas portas so conectadas s entradas e sadas das unidades funcio-
nais vetoriais por um conjunto de barras (mostradas nas linhas grossas em cor cinza). Na Seo G.4, acrescentaremos o enca-
deamento, que exigir a capacidade adicional de interconexo.

Os principais componentes da arquitetura de conjunto de instrues do VMIPS so os seguintes:


n Registradores vetoriais Cada registrador vetorial um banco de comprimento fixo contendo um nico ve-
tor. O VMIPS tem oito registradores vetoriais e cada registrador vetorial contm 64 elementos. Cada regis-
trador vetorial deve ter pelo menos duas portas de leitura e uma porta de gravao no VMIPS. Isso permitir
um grau elevado de sobreposio entre operaes vetoriais para registradores vetoriais diferentes. (No con-
sideramos o problema da escassez de portas de registrador vetorial. Em mquinas reais, isso resultaria em
um risco estrutural.) As portas de leitura e gravao, que totalizam pelo menos 16 portas de leitura e 8 portas
de gravao, esto conectadas s entradas ou sadas da unidade funcional por um par de barras. (A descrio
do projeto de arquivo de registrador vetorial foi simplificada aqui. As mquinas reais fazem uso do padro de
acesso regular dentro de uma instruo vetorial para reduzir os custos dos circuitos do arquivo de registra-
dores vetoriais [Asanovic 1998]. Por exemplo, o Cray-1 consegue implementar o arquivo de registrador com
apenas uma nica porta por registrador.)
n Unidades funcionais vetoriais Cada unidade tem um pipeline completo e pode iniciar uma nova operao em
cada ciclo de clock. Uma unidade de controle necessria para detectar riscos, tanto de conflitos para as unida-
des funcionais (riscos estruturais) quanto de conflitos para acesso a registradores (riscos de dados). O VMIPS
tem cinco unidades funcionais, como mostra a Figura G.1. Por simplicidade, vamos nos concentrar exclusiva-
mente nas unidades funcionais de ponto flutuante. Dependendo do processador vetorial, as operaes escala-
res utilizaro as unidades funcionais vetoriais ou um conjunto dedicado. Supomos que as unidades funcionais
so compartilhadas; porm, mais uma vez por simplicidade, ignoraremos conflitos potenciais.
n Unidade vetorial de carga-armazenamento Essa uma unidade de memria vetorial que carrega ou armaze-
na um vetor de ou para a memria. As cargas e os armazenamentos vetoriais do VMIPS tm pipeline total, de
forma que as palavras possam ser movimentadas entre os registradores vetoriais e a memria com uma lar-
gura de banda de uma palavra por ciclo de clock, depois de uma latncia inicial. Normalmente, essa unidade
tambm manipularia cargas e armazenamentos escalares.
G.2 Arquitetura vetorial bsica 83

n Um conjunto de registradores escalares Os registradores escalares tambm podem fornecer dados como en-
trada para as unidades funcionais vetoriais, bem como calcular endereos para repass-los unidade vetorial
de carga-armazenamento. Esses so os 32 registradores normais de uso geral e os 32 registradores de ponto
flutuante do MIPS. Os valores escalares so lidos do arquivo de registradores escalares, depois so conecta-
das a uma entrada das unidades funcionais vetoriais.
A Figura G.2 mostra as caractersticas de alguns processadores vetoriais tpicos, inclusive o tamanho e a
quantidade de registradores, o nmero e os tipos de unidades funcionais, e ainda o nmero de unidades de car-
ga-armazenamento. A ltima coluna na Figura G.2 mostra o nmero de pistas na mquina, que o nmero de
pipelines paralelos usados para executar operaes dentro de cada instruo vetorial. As pistas sero descritas
mais adiante, na Seo G.4; aqui, vamos supor que o VMIPS tem apenas um pipeline por unidade funcional ve-
torial (uma pista).
No VMIPS, as operaes vetoriais utilizam os mesmos nomes que as operaes do MIPS, mas tm a letra V
acrescentada a elas. Desse modo, ADDV.D uma adio de dois vetores de preciso dupla. As instrues veto-
riais tomam como sua entrada um par de registradores vetoriais (ADDV.D) ou um registrador vetorial e um regis-
trador escalar, designados pela incluso de VS (ADDVS.D). Nesse ltimo caso no registrador escalar usado
como entrada para todas as operaes a operao ADDVS.D somar o contedo de um registrador escalar a
cada elemento em um registrador vetorial. O valor escalar ser copiado para a unidade funcional vetorial em
tempo de emisso. A maioria das operaes vetoriais tem um registrador de destino vetorial, embora algumas
(contagem de preenchimento) produzam um valor escalar, que armazenado em um registrador escalar. Os
nomes LV e SV denotam carga vetorial e armazenamento vetorial, e carregam ou armazenam um vetor inteiro
de dados de preciso dupla. Um operando o registrador vetorial a ser carregado ou armazenado; o outro ope-
rando, um registrador MIPS de uso geral, o endereo inicial do vetor na memria. A Figura G.3 lista as instru-
es vetoriais do VMIPS. Alm dos registradores vetoriais, precisamos de dois registradores adicionais de uso
especial: os registradores de comprimento de vetor e de mscara de vetor. Discutiremos esses registradores e
sua finalidade nas Sees G.3 e G.4, respectivamente.

Como os processadores vetoriais funcionam: um exemplo


Um processador vetorial melhor entendido observando-se um loop vetorial no VMIPS. Vamos utilizar um
problema vetorial tpico, que ser focalizado em todo este apndice:

Y = a X + Y

X e Y so vetores, inicialmente residentes na memria, e a um escalar. Esse o chamado loop SAXPY ou


DAXPY que forma o loop interno do benchmark Linpack. (SAXPY significa single-precision ; DAXPY significa
double-precision a X plus Y.) Linpack uma coleo de rotinas de lgebra linear, e as rotinas para executar a
eliminao gaussiana constituem aquilo que se conhece como benchmark Linpack. A rotina DAXPY, que im-
plementa o loop precedente, representa uma pequena frao do cdigo-fonte de benchmark Linpack, mas res-
ponde pela maior parte do tempo de execuo do benchmark.
Por enquanto, vamos supor que o nmero de elementos, ou comprimento, de um registrador vetorial (64)
corresponde ao comprimento da operao vetorial na qual estamos interessados. (Essa restrio ser suspensa
em breve.)

EXEMPLO Mostre o cdigo correspondente ao MIPS e ao VMIPS para o loop de DAXPY. Suponha que os endereos ini-
ciais de X e Y estejam em Rx e Ry, respectivamente.
Resposta Aqui est o cdigo MIPS.

L.D F0,a ;carrega escalar a


DADDIU R4,Rx,#512 ;ltimo endereo a carregar
Loop: L.D F2,0(Rx) ;carrega X(i)
MUL.D F2,F2,F0 ;a X(i)
L.D F4,0(Ry) ;carrega Y(i)
ADD.D F4,F4,F2 ;a X(i) + Y(i)
84 Apndice G Processadores vetoriais

Elementos por
registrador Unidades
Processador Clock-rate Registradores (elementos vetoriais de carga-
(ano) (MHz) vetoriais de 64 bits) Unidades vetoriais de aritmtica armazenamento Pistas
Cray-1 (1976) 80 8 64 6: adio de FP, multiplicao 1 1
de FP, recproco de FP, adio de
inteiros, lgica, deslocamento
Cray X-MP (1983) 118 8 64 8: adio de FP, multiplicao 2 cargas 1
Cray Y-MP (1988) 166 de FP, recproco de FP, 1 armazenamento
adio de inteiros, 2 lgicas,
deslocamento, contagem/
paridade de preenchimento
Cray-2 (1985) 244 8 64 5: adio de FP, multiplicao de 1 1
FP, recproco/raiz quadrada de FP,
adio/deslocamento/
contagem de preenchimento
de inteiros, lgica
Fujitsu VP100/ 133 8 a 256 32 a 1.024 3: adio/lgica de FP ou inteiros, 2 1 (VP100)
VP200 (1982) multiplicao, diviso 2 (VP200)
Hitachi S810/ 71 32 256 4: multiplicao-adio 3 cargas 1 (S810)
S820 (1983) de FP, unidade de 1 armazenamento 2 (S820)
multiplicao/diviso-
adio de FP, 2 adio/lgica
de inteiros
Convex C-1 (1985) 10 8 128 2: multiplicao/diviso de FP 1 1 (64 bits)
ou inteiros, adio/lgica 2 (32 bits)
NEC SX/2 (1985) 167 8 + 32 256 4: multiplicao/diviso de FP, 1 4
adio de FP, adio/lgica de
inteiros, deslocamento
Cray C90 (1991) 240 8 128 8: adio de FP, multiplicao 2 cargas 2
Cray T90 (1995) 460 de FP, recproco de FP, adio 1 armazenamento
de inteiros, 2 lgicas,
deslocamento, contagem/
paridade de preenchimento
NEC SX/5 (1998) 312 8 + 64 512 4: adio/deslocamento de FP ou 1 16
inteiros, multiplicao, diviso,
lgica
Fujitsu VPP5000 300 8 a 256 128 a 4.096 3: multiplicao de FP ou inteiros, 1 carga 16
(1999) adio/lgica, diviso 1 armazenamento
Cray SV1 (1998) 300 8 64 8: adio de FP, multiplicao de 1 de carga- 2
SV1ex (2001) 500 FP, recproco de FP, adio de armazenamento 8 (MSP)
inteiros, 2 lgicas, deslocamento, 1 carga
contagem/paridade de
preenchimento
VMIPS (2001) 500 8 64 5: multiplicao de FP, diviso de 1 de carga- 1
FP, adio de FP, adio/ armazenamento
deslocamento de inteiros, lgica

Figura G.2 Caractersticas de vrias arquiteturas de registrador vetorial. Se a mquina um multiprocessador, as entradas corres-
pondem s caractersticas de um nico processador. Vrias das mquinas tm diferentes velocidades do clock nas unidades vetoriais e esca-
lares; as velocidades do clock mostradas correspondem s unidades vetoriais. Os registradores vetoriais das mquinas Fujitsu so configu-
rveis: o tamanho e a quantidade das 8K entradas de 64 bits podem variar inversamente um em relao ao outro (por exemplo, no VP200,
desde oito registradores, cada um com 1K elemento de comprimento, at 256 registradores, cada um com 32 elementos de comprimento).
As mquinas NEC tm oito registradores vetoriais de primeiro plano conectados s unidades aritmticas, mais 32 a 64 registradores veto-
riais de segundo plano conectados entre o sistema de memria e os registradores vetoriais do primeiro plano. A unidade de recprocos nos
processadores Cray usada para efetuar a diviso (e a raiz quadrada no Cray-2). Pipelines de adio executam a adio e a subtrao. A uni-
dade de multiplicao/diviso-adio no Hitachi S810/820 executa uma multiplicao ou diviso de FP, seguida por uma soma ou subtra-
o (enquanto a unidade de multiplicao-adio executa uma multiplicao seguida por uma adio ou subtrao). Observe que a maio-
ria dos processadores utiliza as unidades vetoriais de multiplicao e diviso de FP para realizar a multiplicao e a diviso vetorial de intei-
ros, e vrios dos processadores utilizam as mesmas unidades para operaes escalares de FP e vetoriais de FP. Cada unidade vetorial de car-
ga-armazenamento representa a habilidade para efetuar uma transferncia sobreposta independente de ou para os registradores vetoriais.
O nmero de pistas o nmero de pipelines paralelos em cada uma das unidades funcionais, como descreve a Seo G.4. Por exemplo, o
NEC SX/5 pode completar 16 multiplicaes por ciclo na unidade funcional de multiplicao. O Convex C-1 pode desmembrar sua nica pis-
ta de 64 bits em duas pistas de 32 bits, a fim de aumentar o desempenho para aplicaes que exigem apenas preciso reduzida. O Cray SV1
pode agrupar quatro CPUs com duas pistas cada para atuar em unssono como uma nica CPU maior com oito pistas, o que a Cray denomi-
na MSP (Multi-Streaming Processor).
G.2 Arquitetura vetorial bsica 85

Instruo Operandos Funo

ADDV.D V1,V2,V3 Adicionar elementos de V2 e V3, depois colocar cada resultado em V1.
ADDVS.D V1,V2,F0 Adicionar F0 a cada elemento de V2, depois colocar cada resultado em V1.
SUBV.D V1,V2,V3 Subtrair elementos de V3 de V2, depois colocar cada resultado em V1.
SUBVS.D V1,V2,F0 Subtrair F0 de elementos de V2, depois colocar cada resultado em V1.
SUBSV.D V1,F0,V2 Subtrair elementos de V2 de F0, depois colocar cada resultado em V1.
MULV.D V1,V2,V3 Multiplicar elementos de V2 e V3, depois colocar cada resultado em V1.
MULVS.D V1,V2,F0 Multiplicar cada elemento de V2 por F0, depois colocar cada resultado em V1.
DIVV.D V1,V2,V3 Dividir elementos de V2 por V3, depois colocar cada resultado em V1.
DIVVS.D V1,V2,F0 Dividir elementos de V2 por F0, depois colocar cada resultado em V1.
DIVSV.D V1,F0,V2 Dividir F0 por elementos de V2, depois colocar cada resultado em V1.
LV V1,R1 Carregar o registrador vetorial V1 da memria, a partir do endereo R1.
SV R1,V1 Armazenar o registrador vetorial V1 na memria, a partir do endereo R1.
LVWS V1,(R1,R2) Carregar V1 do endereo em R1 com espaamento em R2, isto , R1+i R2.
SVWS (R1,R2,V1) Armazenar V1 a partir do endereo em R1 com espaamento em R2, isto , R1+i R2.
LVI V1,(R1+V2) Carregar V1 com vetor cujos elementos esto em R1+V2(i), isto , V2 um ndice.
SVI (R1+V2,V1) Armazenar V1 no vetor cujos elementos esto em R1+V2(i), isto , V2 um ndice.
CVI V1,R1 Criar um vetor de ndice armazenando os valores 0, 1 R1, 2 R1, ..., 63 R1 em V1.
S--V.D V1,V2 Comparar os elementos (EQ, NE, GT, LT, GE, LE) em V1 e V2. Se a condio for verdadeira, inserir 1
S--VS.D V1,F0 no vetor de bits correspondente; caso contrrio, inserir 0. Inserir o vetor de bits resultante no
registrador de mscara vetorial (VM). A instruo S--VS.D executa a mesma comparao, mas
utiliza um valor escalar como um operando.
POP R1,VM Contar a quantidade de valores 1 no registrador de mscara vetorial e armazenar a contagem em R1.
CVM Definir o registrador de mscara vetorial com todos os valores iguais a 1.
MTC1 VLR,R1 Mover o contedo de R1 para o registrador de comprimento de vetor.
MFC1 R1,VLR Mover o contedo do registrador de comprimento de vetor para R1.
MVTM VM,F0 Mover o contedo de F0 para o registrador de mscara vetorial.
MVFM F0,VM Mover o contedo do registrador de mscara vetorial para F0.
Figura G.3 As instrues vetoriais do VMIPS. Somente as operaes de FP de preciso dupla so mostradas. Alm dos registradores
vetoriais, existem dois registradores especiais, VLR (discutido na Seo G.3) e VM (discutido na Seo G.4). Supomos que esses registrado-
res especiais estejam presentes no espao 1 do co-processador MIPS, juntamente com os registradores FPU. As operaes com espaa-
mento sero explicadas na Seo G.3, e o uso das operaes de criao de ndices e de carga-armazenamento indexado sero explicadas
na Seo G.4.

S.D 0(Ry,F4) ;armazena em Y(i)


DADDIU Rx,Rx,#8 ;incrementa ndice para X
DADDIU Ry,Ry,#8 ;incrementa ndice para Y
DSUBU R20,R4,Rx ;calcula limite
BNEZ R20,Loop ;verifica se terminou

Aqui est o cdigo VMIPS para DAXPY.

L.D F0,a ;carrega escalar a


LV V1,Rx ;carrega vetor X
MULVS.D V2,V1,F0 ;multiplicao de vetor por escalar
LV V3,Ry ;carrega vetor Y
ADDV.D V4,V2,V3 ;soma
SV Ry,V4 ;armazena o resultado
86 Apndice G Processadores vetoriais

Existem algumas comparaes interessantes entre os dois segmentos de cdigo desse exemplo. A mais drs-
tica que o processador vetorial reduz muito a largura de banda de instrues dinmicas, executando apenas
seis instrues contra quase 600 para o MIPS. Essa reduo ocorre tanto porque as operaes vetoriais atuam
sobre 64 elementos quanto porque as instrues de overhead que constituem quase metade do loop no MIPS
no esto presentes no cdigo VMIPS.

Outra diferena importante a freqncia de bloqueios do pipeline. No cdigo MIPS direto, toda instruo
ADD.D deve esperar por uma MUL.D, e toda S.D deve esperar pela ADD.D. No processador vetorial, cada instruo
vetorial s se desdobrar para o primeiro elemento em cada vetor, e depois os elementos subseqentes fluiro
suavemente no pipeline. Desse modo, os desdobramentos do pipeline s sero necessrios uma vez por opera-
o vetorial, em lugar de uma vez por elemento de vetor. Nesse exemplo, a freqncia de desdobramentos de
pipeline no MIPS ser aproximadamente 64 vezes maior que no VMIPS. Os desdobramentos de pipeline podem
ser eliminados no MIPS usando-se pipelining de software ou desenvolvimento de loops (como vimos no Cap-
tulo 4). Porm, a grande diferena na largura de banda de instrues no pode ser reduzida.

Tempo de execuo vetorial


O tempo de execuo de uma seqncia de operaes vetoriais depende principalmente de trs fatores: do
comprimento dos vetores operandos, dos riscos estruturais entre as operaes e das dependncias de dados.
Dado o comprimento de vetor e a taxa de iniciao, que a taxa em que uma unidade vetorial consome novos
operandos e produz novos resultados, podemos calcular o tempo para uma nica instruo vetorial. Todos os
supercomputadores modernos tm unidades funcionais vetoriais com vrios pipelines paralelos (ou pistas) que
podem produzir dois ou mais resultados por ciclo de clock, mas tambm podem ter algumas unidades funcio-
nais que no tm pipeline total. Por simplicidade, nossa implementao de VMIPS tem uma pista com uma taxa
de iniciao de um elemento por ciclo de clock para operaes individuais. Desse modo, o tempo de execuo
para uma nica instruo vetorial aproximadamente igual ao comprimento de vetor.
Para simplificar a discusso da execuo vetorial e de seu sincronismo, utilizaremos a noo de comboio, que
o conjunto de instrues vetoriais que poderiam potencialmente iniciar juntas a execuo em um nico perodo
de clock. (Embora o conceito de comboio seja usado em compiladores vetoriais, no existe nenhuma terminolo-
gia padro. Por essa razo, criamos o termo comboio.) As instrues em um comboio no devem conter quaisquer
riscos estruturais ou de dados (embora essa restrio seja relaxada mais adiante); se tais riscos estivessem presen-
tes, as instrues no comboio potencial precisariam ser serializadas e iniciadas em comboios diferentes. A coloca-
o de instrues vetoriais em um comboio anloga a colocar operaes escalares em uma instruo VLIW. Para
manter a anlise simples, supomos que um comboio de instrues deve completar a execuo antes de quaisquer
outras instrues (escalares ou vetoriais) poderem iniciar sua execuo. Relaxaremos essa restrio na Seo G.4,
usando um mtodo menos restritivo, embora mais complexo, para emitir instrues.
Acompanhando a noo de um comboio encontra-se uma mtrica de sincronismo, chamada chime, que
pode ser usada para avaliar o desempenho de uma seqncia vetorial que consiste em comboios. Um chime a
unidade de tempo usada para executar um nico comboio. Um chime uma medida aproximada do tempo de
execuo para uma seqncia vetorial; uma medio de chime independente do comprimento de vetor . Des-
se modo, uma seqncia vetorial que consiste em m comboios executada em m chimes e, para um compri-
mento de vetor igual a n, isso corresponde aproximadamente a m n ciclos de clock. Uma aproximao de chi-
me ignora alguns overheads especficos do processador, muitos dos quais so dependentes do comprimento de
vetor . Conseqentemente, a medio do tempo em chimes uma aproximao melhor para vetores longos.
Utilizaremos a medida de chime, em lugar de ciclos de clock por resultado, para indicar explicitamente que cer-
tos overheads esto sendo ignorados.
Se conhecermos o nmero de comboios em uma seqncia vetorial, saberemos o tempo de execuo em chi-
mes. Uma fonte de overhead ignorada na medio de chimes qualquer limitao sobre a iniciao de vrias
instrues vetoriais em um ciclo de clock. Se apenas uma instruo vetorial puder ser iniciada em um ciclo de
clock (a realidade na maioria dos processadores vetoriais), a quantidade de chimes ir subestimar o tempo de exe-
cuo real de um comboio. Pelo fato de o comprimento de vetor em geral ser muito maior que o nmero de ins-
trues no comboio, simplesmente iremos supor que o comboio executado em um nico chime.
G.2 Arquitetura vetorial bsica 87

EXEMPLO Mostre como a seqncia de cdigo a seguir est disposta em comboios, supondo-se uma nica cpia de cada
unidade funcional vetorial:

LV V1,Rx ;carrega vetor X


MULVS.D V2,V1,F0 ;multiplicao de vetor por escalar
LV V3,Ry ;carrega vetor Y
ADDV.D V4,V2,V3 ;soma
SV Ry,V4 ;armazena o resultado

Quantos chimes essa seqncia vetorial ocupar? Quantos ciclos por FLOP (operao de ponto flutuante)
so necessrios, ignorando-se o overhead de emisso de instrues vetoriais?
Resposta O primeiro comboio ocupado pela primeira instruo LV. MULVS.D dependente da primeira LV, e assim no
pode estar no mesmo comboio. A segunda instruo LV pode estar no mesmo comboio que MULVS.D. A instruo
ADDV.D dependente da segunda LV, e assim deve vir ainda em um terceiro comboio; finalmente, SV depende
de ADDV.D, e portanto deve ficar em um comboio seguinte. Isso leva a este layout de instrues vetoriais em
comboios:
1. LV

2. MULVS.D LV

3. ADDV.D

4. SV

A seqncia exige quatro comboios e conseqentemente demora quatro chimes. Tendo em vista que a se-
qncia demora um total de quatro chimes e que existem duas operaes de ponto flutuante por resultado, o
nmero de ciclos por FLOP 2 (ignorando-se qualquer overhead de emisso de instrues vetoriais). Observe
que, embora tenhamos permitido a execuo de MULVS.D e de LV no comboio 2, a maioria das mquinas vetoriais
demorar 2 ciclos de clock para iniciar as instrues.

A aproximao de chime razoavelmente precisa para vetores longos. Por exemplo, para vetores de 64 ele-
mentos, o tempo em chimes quatro, e assim a seqncia demoraria cerca de 256 ciclos de clock. O overhead
de emisso do comboio 2 em dois clocks separados seria pequeno.
Outra fonte de overhead muito mais significativa que a limitao de emisso. A fonte mais importante de
overhead ignorada pelo modelo de chime o tempo de inicializao vetorial. O tempo de inicializao vem da la-
tncia de pipelining da operao vetorial e determinado principalmente pela profundidade do pipeline para a
unidade funcional utilizada. O tempo de inicializao aumenta o tempo efetivo para a execuo de um comboio
para mais de um chime. Em virtude de nossa suposio de que os comboios no se sobrepem no tempo, o tem-
po de inicializao retarda a execuo de comboios subseqentes. claro que as instrues em comboios su-
cessivos tm conflitos estruturais para alguma unidade funcional ou so dependentes de dados, e assim a hip-
tese de no-sobreposio razovel. O tempo real para completar um comboio determinado pela soma do
comprimento de vetor com o tempo de inicializao. Se os comprimentos de vetores fossem infinitos, esse
overhead de inicializao seria amortizado, mas comprimentos de vetores finitos o expem, como mostra o
exemplo a seguir.

EXEMPLO Suponha o overhead de inicializao para as unidades funcionais mostrado na Figura G.4.
Mostre o tempo em que cada comboio pode comear e o nmero total de ciclos necessrios. Como comparar
o tempo aproximao de chime para um vetor de comprimento 64?
Resposta A Figura G.5 fornece a resposta em comboios, supondo-se que o comprimento de vetor seja n. Uma questo
complicada ocorre quando supomos que a seqncia vetorial termina; isso determina se o tempo de iniciali-
zao de SV visvel ou no. Consideramos que as instrues seguintes no podem ficar no mesmo comboio,
e j supomos que os comboios no se sobrepem. Desse modo, o tempo total dado pelo tempo at se com-
pletar a ltima instruo vetorial no ltimo comboio. Isso uma aproximao, e o tempo de inicializao da
88 Apndice G Processadores vetoriais

ltima instruo vetorial pode ser visto em algumas seqncias e no em outras. Por simplicidade, sempre o
inclumos.
O tempo por resultado para um vetor de comprimento 64 4 + (42/64) = 4,65 ciclos de clock, enquanto a
aproximao de chime seria 4. O tempo de execuo com overhead de inicializao 1,16 vez mais alto.

Por simplicidade, usaremos a aproximao de chime para o tempo de execuo, incorporando os efeitos do
tempo de inicializao somente quando quisermos um desempenho mais detalhado ou para ilustrar os benef-
cios de algum aperfeioamento. Para vetores longos, uma situao tpica, o efeito do overhead no to grande.
Mais adiante no apndice exploraremos meios para reduzir o overhead de inicializao.
O tempo de inicializao para uma instruo vem da profundidade do pipeline para a unidade funcional que
implementa essa instruo. Se a taxa de iniciao deve ser mantida em 1 ciclo de clock por resultado, ento:

Tempo total de unidade funcional


Profundidade de pipeline =
Tempo de ciclo de clock

Por exemplo, se uma operao demora 10 ciclos de clock, ela deve ter um pipeline de profundidade 10 para
alcanar uma taxa de iniciao de uma unidade por ciclo de clock. Ento, a profundidade do pipeline determi-
nada pela complexidade da operao e pelo tempo do ciclo de clock do processador. As profundidades de pipe-
lines de unidades funcionais variam amplamente um valor de 2 a 20 fases no incomum embora as unida-
des mais intensamente usadas tenham profundidades de pipelines de 4 a 8 ciclos de clock.
Para o VMIPS, usaremos as mesmas profundidades de pipelines do Cray-1, embora as latncias em processa-
dores mais modernos tenham a tendncia de aumentar, em especial no caso de cargas. Todas as unidades funcio-
nais tm pipeline total. Como mostra a Figura G.6, as profundidades de pipelines so de 6 ciclos de clock para
adio de ponto flutuante e de 7 ciclos de clock para multiplicao de ponto flutuante. No VMIPS, como na
maioria dos processadores vetoriais, operaes vetoriais independentes usando unidades funcionais diferentes
podem emitir no mesmo comboio.

Unidade Overhead de inicializao (ciclos)

Unidade de carga e armazenamento 12


Unidade de multiplicao 7
Unidade de adio 6
Figura G.4 Overhead de inicializao.

Comboio Tempo de inicializao Tempo do primeiro resultado Tempo do ltimo resultado

1. LV 0 12 11 + n
2. MULVS.D LV 12 + n 12 + n + 12 23 + 2n
3. ADDV.D 24 + 2n 24 + 2n + 6 29 + 3n
4. SV 30 + 3n 30 + 3n + 12 41 + 4n
Figura G.5 Tempos de inicializao e tempos do primeiro e do ltimo resultado para os comboios de 1 a 4. O compri-
mento de vetor n.

Operao Penalidade de inicializao

Adio vetorial 6
Multiplicao vetorial 7
Diviso vetorial 20
Carga vetorial 12
Figura G.6 Penalidades de inicializao no VMIPS. Essas so as penalidades de inicializao em ciclos de clock para opera-
es vetoriais do VMIPS.
G.2 Arquitetura vetorial bsica 89

Unidades vetoriais de carga-armazenamento e sistemas de memria vetorial


O comportamento da unidade vetorial de carga-armazenamento significativamente mais complicado que o
das unidades funcionais aritmticas. O tempo de inicializao para uma carga o tempo para se obter a primei-
ra palavra da memria em um registrador. Se o restante do vetor puder ser fornecido sem desdobramento, en-
to a taxa de iniciao vetorial ser igual taxa em que novas palavras so buscadas ou armazenadas. Diferente
de unidades funcionais mais simples, a taxa de iniciao talvez no seja necessariamente de 1 ciclo de clock,
porque os desdobramentos de bancos de memria podem reduzir o throughput efetivo.
Em geral, as penalidades para inicializaes em unidades de carga-armazenamento so mais altas que as de
unidades funcionais aritmticas acima de 100 ciclos de clock em alguns processadores. Para o VMIPS, iremos
supor um tempo de inicializao de 12 ciclos de clock, igual ao do Cray-1. A Figura G.6 resume as penalidades
de inicializao para operaes vetoriais do VMIPS.
Para manter uma taxa de iniciao de uma palavra buscada ou armazenada por clock, o sistema de memria
deve ser capaz de produzir ou aceitar essa quantidade de dados. Normalmente, isso feito criando-se vrios
bancos de memria, como descrevemos na Seo 5.8. Conforme veremos na prxima seo, ter nmeros signi-
ficativos de bancos til para se lidar com cargas ou armazenamentos vetoriais que acessam linhas ou colunas
de dados.
A maioria dos processadores vetoriais utiliza bancos de memria em lugar de intercalao simples por trs
razes principais:

1. Muitos computadores vetoriais admitem vrias cargas ou armazenamentos por clock, e o tempo do ciclo de
banco de memria com freqncia vrias vezes maior que o tempo de ciclo da CPU. Para dar suporte a v-
rios acessos simultneos, o sistema de memria precisa ter vrios bancos e ser capaz de controlar indepen-
dentemente os endereos para os bancos.

2. Como veremos na prxima seo, muitos processadores vetoriais admitem a habilidade de carregar ou ar-
mazenar palavras de dados que no so seqenciais. Em tais casos, necessrio o endereamento indepen-
dente de bancos, em vez da intercalao.

3. Muitos computadores vetoriais admitem vrios processadores compartilhando o mesmo sistema de mem-
ria, e assim cada processador estar gerando seu prprio fluxo independente de endereos.

Em combinao, essas caractersticas levam a um grande nmero de bancos de memria independentes,


como mostra o exemplo a seguir.

EXEMPLO O Cray T90 tem um ciclo de clock da CPU de 2,167 ns e, em sua maior configurao (Cray T932), tem 32 pro-
cessadores, cada um capaz de gerar quatro cargas e dois armazenamentos por ciclo de clock da CPU. O ciclo de
clock da CPU de 2,167 ns, enquanto o tempo de ciclo das SRAMs usadas no sistema de memria de 15 ns.
Calcule o nmero mnimo de bancos de memria necessrios para permitir que todas as CPUs funcionem na
largura de banda de memria total.
Resposta O nmero mximo de referncias de memria de cada ciclo 192 (32 CPUs vezes 6 referncias por CPU). Cada
banco de SRAM est ocupado por 15/2,167 = 6,92 ciclos de clock, que arredondamos para 7 ciclos de clock da
CPU. Assim, exigimos um mnimo de 192 7 = 1.344 bancos de memria!
Na realidade, o Cray T932 tem 1.024 bancos de memria, e portanto os primeiros modelos no podiam sus-
tentar a largura de banda total para todas as CPUs simultaneamente. Um upgrade de memria subseqente
substituiu as SRAMs assncronas de 15 ns por SRAMs sncronas com pipeline que reduziram a menos da meta-
de o tempo de ciclo de memria, fornecendo assim largura de banda suficiente.

No Captulo 5, vimos que a taxa de acesso desejada e o tempo de acesso ao banco determinavam quantos
bancos eram necessrios para acessar uma memria sem um desdobramento. O prximo exemplo mostra
como essas sincronizaes funcionam em um processador vetorial.
90 Apndice G Processadores vetoriais

EXEMPLO Vamos supor que queremos buscar um vetor de 64 elementos comeando no endereo de byte 136, e que um
acesso memria demore 6 clocks. Quantos bancos de memria devemos ter para admitir uma busca por ciclo
de clock? Com que endereos os bancos so acessados? Quando os diversos elementos chegaro CPU?
Resposta Seis clocks por acesso exigem pelo menos seis bancos; porm, como queremos que o nmero de bancos seja
uma potncia de dois, optamos por ter oito bancos. A Figura G.7 mostra a sincronizao para os primeiros con-
juntos de acessos relativos a um sistema de oito bancos com uma latncia de acesso de 6 ciclos de clock.

A sincronizao de bancos de memria reais em geral dividida em dois componentes distintos, a latncia
de acesso e o tempo de ciclo de banco (ou tempo ocupado de banco). A latncia de acesso o tempo desde o mo-
mento em que o endereo chega ao banco, at o banco retornar um valor de dados, enquanto o tempo ocupado
o tempo em que o banco fica ocupado com uma solicitao. A latncia de acesso se soma ao custo de iniciali-
zao de buscar um vetor da memria (a latncia total de memria tambm inclui o tempo para percorrer as re-
des de interconexo com pipelines que transferem endereos e dados entre a CPU e bancos de memria). O
tempo ocupado de banco determina a largura de banda efetiva de um sistema de memria, porque um proces-
sador no pode emitir uma segunda solicitao para o mesmo banco at decorrer o tempo ocupado do banco.
Para bancos simples de SRAM sem pipeline como os que foram usados nos exemplos anteriores, a latncia
de acesso e o tempo ocupado so aproximadamente iguais. Porm, no caso de um banco de SRAM com pipeli-
ne, a latncia de acesso maior que o tempo ocupado, porque o acesso a cada elemento s ocupa uma fase no
pipeline do banco de memria. Para um banco de DRAM, a latncia de acesso normalmente mais curta que o
tempo ocupado, porque uma DRAM necessita de tempo extra para restaurar o valor lido aps a operao de lei-
tura destrutiva. Para sistemas de memria que admitem vrios acessos vetoriais simultneos ou que permitem
acessos no-seqenciais em cargas ou armazenamentos vetoriais, o nmero de bancos de memria deve ser
maior que o mnimo; caso contrrio, existiro conflitos de bancos de memria. Exploraremos esse assunto com
mais detalhes na prxima seo.

Banco
o
Ciclo n 0 1 2 3 4 5 6 7

0 136
1 ocupado 144
2 ocupado ocupado 152
3 ocupado ocupado ocupado 160
4 ocupado ocupado ocupado ocupado 168
5 ocupado ocupado ocupado ocupado ocupado 176
6 ocupado ocupado ocupado ocupado ocupado 184
7 192 ocupado ocupado ocupado ocupado ocupado
8 ocupado 200 ocupado ocupado ocupado ocupado
9 ocupado ocupado 208 ocupado ocupado ocupado
10 ocupado ocupado ocupado 216 ocupado ocupado
11 ocupado ocupado ocupado ocupado 224 ocupado
12 ocupado ocupado ocupado ocupado ocupado 232
13 ocupado ocupado ocupado ocupado ocupado 240
14 ocupado ocupado ocupado ocupado ocupado 248
15 256 ocupado ocupado ocupado ocupado ocupado
16 ocupado 264 ocupado ocupado ocupado ocupado
Figura G.7 Endereos de memria (em bytes) por nmero de banco e slot de tempo em que o acesso comea. Cada banco de me-
mria trava o endereo do elemento no incio de um acesso, e ento fica ocupado por 6 ciclos de clock antes de retornar um valor CPU.
Observe que a CPU no pode manter todos os oito bancos ocupados o tempo todo, porque ela limitada a fornecer um novo endereo e a
receber um nico item de dados em cada ciclo.
G.3 Duas questes reais: comprimento de vetor e espaamento 91

G.3 Duas questes reais: comprimento de vetor e espaamento


Esta seo lida com duas questes que surgem em programas reais: o que fazer quando o comprimento de vetor
em um programa no exatamente 64? Como lidar com elementos no-adjacentes em vetores que residem na
memria? Primeiro, vamos considerar a questo do comprimento de vetor.

Controle do comprimento de vetor


Um processador de registrador vetorial tem um comprimento de vetor natural determinado pelo nmero de
elementos em cada registrador vetorial. improvvel que esse comprimento, igual a 64 para o VMIPS, corres-
ponda ao comprimento real de um vetor em um programa. Alm disso, em um programa real o comprimento
de uma operao vetorial especfica freqentemente desconhecido em tempo de compilao. De fato, um ni-
co fragmento de cdigo pode exigir comprimentos de vetores diferentes. Por exemplo, considere este cdigo:

do 10 i = 1,n
10 Y(i) = a * X(i) + Y(i)

O tamanho de todas as operaes vetoriais depende de n, que talvez nem mesmo seja conhecido at o tempo
de execuo! O valor de n tambm pode ser um parmetro para um procedimento contendo o loop anterior e,
portanto, pode estar sujeito a mudar durante a execuo.
A soluo para esses problemas criar um registrador de comprimento de vetor (VLR vector-length regis-
ter). O VLR controla o comprimento de qualquer operao vetorial, inclusive uma carga ou um armazenamen-
to vetorial. Porm, o valor no VLR no pode ser maior que o comprimento dos registradores vetoriais. Isso re-
solve nosso problema, desde que o comprimento real seja menor que ou igual ao comprimento de vetor mximo
(MVL maximum vector length) definido pelo processador.
E se o valor de n no for conhecido em tempo de compilao, e portanto possa ser maior que MVL? Para li-
dar com o segundo problema, em que o vetor mais longo que o comprimento mximo, usada uma tcnica
chamada minerao na superfcie (strip mining). A minerao na superfcie a gerao de cdigo tal que cada
operao vetorial seja feita para um tamanho menor ou igual ao MVL. Poderamos realizar a minerao na su-
perfcie para o loop da mesma maneira que linearizamos loops no Captulo 4: crie um loop que trate qualquer
nmero de iteraes, que seja um mltiplo do MVL, e outro loop que trate quaisquer iteraes restantes, que
tem de ser menor que o MVL. Na prtica, em geral os compiladores criam um nico loop com minerao na su-
perfcie, com parmetros para tratar ambas as pores pela alterao do comprimento. A verso com minerao
na superfcie do loop de DAXPY escrito em FORTRAN, a principal linguagem usada em aplicaes cientficas,
mostrada aqui com comentrios no estilo de C:

low = 1
VL = (n mod MVL) /*encontra o fragmento de tamanho mpar*/
do 1 j = 0,(n / MVL) /*loop exterior*/
do 10 i = low, low + VL - 1 /*execues para o comprimento VL*/
Y(i) = a * X(i) + Y(i) /*operao principal*/
10 continue
low = low + VL /*incio do prximo vetor*/
VL = MVL /*redefine o comprimento com valor mximo*/
1 continue

A expresso n/MVL representa o truncamento da diviso de inteiros (exatamente o que FORTRAN faz) e
usada ao longo desta seo. O efeito desse loop desmembrar o vetor em segmentos que sero ento processa-
dos pelo loop interno. O comprimento do primeiro segmento (n mod MVL) e todos os segmentos subseqentes
tm o comprimento MVL. Isso representado na Figura G.8.
O loop interno do cdigo anterior vetorizvel com comprimento VL, que igual a (n mod MVL) ou MVL. O
registrador VLR deve ser definido duas vezes uma vez em cada lugar em que a varivel VL atribuda no cdi-
go. Com vrias operaes vetoriais sendo executadas em paralelo, o hardware tem de copiar o valor de VLR
para a unidade funcional vetorial quando uma operao vetorial emitida; no caso, VLR alterado para uma
operao vetorial subseqente.
92 Apndice G Processadores vetoriais

Valor de j 0 1 2 3 ... ... n/MVL

Intervalo de i 1..m (m + 1).. (m + (m + 2 * ... ... (n MVL


m + MVL MVL + 1) MVL + 1) + 1).. n
.. m + 2 * .. m + 3 *
MVL MVL
Figura G.8 Um vetor de comprimento arbitrrio processado com minerao na superfcie. Todos os blocos, com exce-
o do primeiro, tm o comprimento MVL, utilizando a potncia total do processador vetorial. Nesta figura, a varivel m usa-
da para a expresso (n mod MVL).

Foram desenvolvidas diversas ISAs vetoriais que permitem que as implementaes tenham comprimentos
mximos de registradores vetoriais diferentes. Por exemplo, a extenso vetorial da IBM para os mainframes da
srie IBM 370 admite um MVL de qualquer valor entre 8 e 512 elementos. Uma instruo carregar contagem e
atualizao de vetor (VLVCU) fornecida para controlar loops com minerao na superfcie. A instruo
VLVCU tem um nico operando de registrador escalar que especifica o comprimento de vetor desejado. O re-
gistrador de comprimento de vetor definido com o mnimo do comprimento desejado e o mximo compri-
mento de vetor disponvel, e esse valor tambm subtrado do registrador escalar, ajustando-se os cdigos de
condio para indicar se o loop deve ser encerrado. Desse modo, o cdigo-objeto pode ser movido sem altera-
es entre duas implementaes diferentes, enquanto faz uso total do comprimento do registrador vetorial dis-
ponvel dentro de cada iterao de loop com minerao na superfcie.
Alm do overhead de inicializao, precisamos levar em conta o overhead de execuo do loop com minera-
o na superfcie. Esse overhead de minerao na superfcie, que surge da necessidade de reiniciar a seqncia
vetorial e definir o VLR, aumenta efetivamente o tempo de inicializao vetorial, supondo-se que um comboio
no se sobreponha a outras instrues. Se esse overhead para um comboio for de 10 ciclos, o overhead efetivo
por 64 aumentar em 10 ciclos ou em 0,15 ciclo por elemento.
H dois fatores fundamentais que contribuem para o tempo de execuo de um loop com minerao na su-
perfcie que consiste em uma seqncia de comboios:
1. O nmero de comboios no loop, que determina o nmero de chimes. Usamos a notao Tchime para o tem-
po de execuo em chimes.
2. O overhead para cada seqncia de comboios com minerao na superfcie. Esse overhead consiste no cus-
to de execuo do cdigo escalar para executar a minerao na superfcie de cada bloco, Tloop, mais o custo
de inicializao vetorial para cada comboio, Tincio.
Tambm pode haver um overhead fixo associado com a configurao da seqncia vetorial pela primeira
vez. Em processadores vetoriais recentes, esse overhead se torna bastante pequeno, e assim vamos ignor-lo.
Os componentes podem ser utilizados para estabelecer o tempo de execuo total de uma seqncia vetorial
operando sobre um vetor de comprimento n, que chamaremos Tn:

n
Tn = ( Tloop + Tincio ) + n Tchime
MVL

Os valores de Tincio, Tloop e Tchime so dependentes do compilador e do processador. A alocao de registra-


dores e a programao de execuo das instrues afetam tanto o que entra em um comboio quanto o overhead
de inicializao de cada comboio.
Por simplicidade, utilizaremos um valor constante para Tloop no VMIPS. Com base em uma variedade de
medies da execuo vetorial do Cray-1, o valor escolhido para Tloop 15. primeira vista, voc poderia
pensar que esse valor muito pequeno. O overhead em cada loop exige a configurao dos endereos de ini-
cializao dos vetores e dos espaamentos, do incremento de contadores e da execuo de um desvio de loop.
Na prtica, essas instrues escalares podem ser total ou parcialmente sobrepostas pelas instrues vetoriais,
minimizando o tempo gasto nessas funes de overhead. claro que o valor de Tloop depende da estrutura do
loop, mas a dependncia leve em comparao com a conexo entre o cdigo vetorial e os valores de Tchime e
Tincio.
G.3 Duas questes reais: comprimento de vetor e espaamento 93

EXEMPLO Qual o tempo de execuo em VMIPS para a operao vetorial A = B s, onde s um escalar e o comprimento
dos vetores A e B 200?
Resposta Suponha que os endereos de A e B estejam inicialmente em Ra e Rb, que s est em Fs, e lembre-se de que, para o
MIPS (e VMIPS) R0 sempre contm 0. Tendo em vista que (200 mod 64) = 8, a primeira iterao do loop com mi-
nerao na superfcie ser executada para um comprimento de vetor de 8 elementos, e as iteraes seguintes sero
executadas para um comprimento de vetor de 64 elementos. Os endereos iniciais de bytes do segmento seguinte
de cada vetor so oito vezes maiores que o comprimento de vetor. Como o comprimento de vetor 8 ou 64, incre-
mentamos os registradores de endereos por 8 8 = 64 aps o primeiro segmento e 8 64 = 512 para segmentos
posteriores. O nmero total de bytes no vetor 8 200 = 1.600 e realizamos o teste de concluso comparando o
endereo do prximo segmento vetorial com o endereo inicial somado a 1.600. Aqui est o cdigo real:

DADDUI R2,R0,#1600 ;total de # bytes em vetor


DADDU R2,R2,Ra ;endereo do fim do vetor A
DADDUI R1,R0,#8 ;carrega comprimento do primeiro segmento
MTC1 VLR,R1 ;carrega comprimento de vetor em VLR
DADDUI R1,R0,#64 ;comprimento em bytes do primeiro segmento
DADDUI R3,R0,#64 ;comprimento de vetor de outros segmentos
Loop: LV V1,Rb ;carrega B
MULVS.D V2,V1,Fs ;vetor * escalar
SV Ra,V2 ;armazena A
DADDU Ra,Ra,R1 ;endereo do prximo segmento de A
DADDU Rb,Rb,R1 ;endereo do prximo segmento de B
DADDUI R1,R0,#512 ;carrega deslocamento de byte de prximo segmento
MTC1 VLR,R3 ;define comprimento como 64 elementos
DSUBU R4,R2,Ra ;no fim de A?
BNEZ R4,Loop ;se no, volta

As trs instrues vetoriais no loop so dependentes e devem entrar em trs comboios; conseqentemente,
Tchime = 3. Vamos usar nossa frmula bsica:
n
Tn = ( Tloop + Tincio ) + n Tchime
MVL
T200 = 4 (15 + Tincio ) + 200 3

T200 = 60 + ( 4 Tincio ) + 600 = 660 + ( 4 Tincio )

O valor de Tincio a soma de:


n Inicializao da carga vetorial de 12 ciclos de clock.
n Uma inicializao de 7 ciclos de clock para a multiplicao.
n Uma inicializao de 12 ciclos de clock para o armazenamento.
Desse modo, o valor de Tincio dado por:

Tincio = 12 + 7 + 12 = 31

Assim, o valor global se torna:

T200 = 660 + 4 31= 784

O tempo de execuo por elemento com todos os custos de inicializao ento 784/200 = 3,9, comparado a
uma aproximao de chime de trs. Na Seo G.4, seremos mais ambiciosos permitindo a sobreposio de
comboios separados.
94 Apndice G Processadores vetoriais

A Figura G.9 mostra o overhead e as taxas efetivas por elemento para o exemplo anterior (A = B s) com v-
rios comprimentos de vetores. Um modelo de contagem de chimes levaria a 3 ciclos de clock por elemento, en-
quanto as duas fontes de overhead somam 0,9 ciclo de clock por elemento no limite.
As prximas sees introduzem aperfeioamentos que reduzem esse tempo. Veremos como reduzir o nme-
ro de comboios e conseqentemente o nmero de chimes, usando uma tcnica chamada encadeamento. O over-
head de loop pode ser reduzido pela sobreposio adicional da execuo de instrues vetoriais e escalares,
permitindo que o overhead do loop escalar em uma iterao seja executado enquanto as instrues vetoriais na
instruo anterior esto se completando. Finalmente, o vetor de inicializao vetorial tambm pode ser elimi-
nado, usando-se uma tcnica que permite a sobreposio de instrues vetoriais em comboios separados.

Espaamento vetorial
O segundo problema que esta seo examina a posio na memria de elementos adjacentes em um vetor, que
pode no ser seqencial. Considere o cdigo direto para multiplicao de matrizes:

do 10 i = 1,100
do 10 j = 1,100
A(i,j) = 0.0
do 10 k = 1,100
10 A(i,j) = A(i,j)+B(i,k) * C(k,j)

Na instruo identificada por 10, poderamos vetorizar a multiplicao de cada linha de B com cada coluna
de C e efetuar a minerao na superfcie do loop interno com k como varivel de ndice.
Para faz-lo, devemos considerar como so endereados elementos adjacentes em B e elementos adjacentes
em C. Como discutimos na Seo 5.5, quando alocada memria para um array, ele linearizado e tem de ser
disposto em ordem principal por linha ou em ordem principal por coluna. Essa linearizao significa que os
elementos na linha ou os elementos na coluna no so adjacentes na memria. Por exemplo, se o loop prece-
dente fosse escrito em FORTRAN, que aloca na ordem principal por coluna, os elementos de B acessados por
iteraes no loop interno estariam separados pelo tamanho da linha vezes 8 (o nmero de bytes por entrada),
dando um total de 800 bytes. No Captulo 5, vimos que a formao de blocos poderia ser usada para melhorar a
localidade em sistemas baseados em caches. No caso de processadores vetoriais sem caches, precisamos de ou-
tra tcnica para buscar elementos de um vetor que no esto adjacentes na memria.
Essa distncia separando elementos que tm de ser buscados em um nico registrador chamada espaa-
mento. No exemplo atual, o uso do layout principal por coluna para as matrizes significa que a matriz C tem o

5
Ciclos
de clock 4 Tempo total
por elemento

1 Overhead
total por
elemento
0
10 30 50 70 90 110 130 150 170 190
Tamanho de vetor

Figura G.9 O tempo de execuo total por elemento e o tempo de overhead total por elemento versus o comprimen-
to de vetor para o exemplo da pgina anterior. Para vetores curtos, o tempo de inicializao total mais de metade do tem-
po total, enquanto para vetores longos, ele se reduz a aproximadamente um tero do tempo total. Os saltos repentinos ocor-
rem quando o comprimento de vetor cruza um mltiplo de 64, forando outra iterao do cdigo de minerao na superfcie e
a execuo de um conjunto de instrues vetoriais. Essa operaes aumentam Tn por Tloop + Tincio.
G.3 Duas questes reais: comprimento de vetor e espaamento 95

espaamento 1, ou uma palavra dupla (8 bytes), separando elementos sucessivos, e a matriz B tem um espaa-
mento igual a 100, ou de 100 palavras duplas (800 bytes).
Uma vez que um vetor carregado em um registrador vetorial, ele atua como se tivesse elementos logica-
mente adjacentes. Desse modo, um processador de registrador vetorial pode manipular espaamentos maiores
que 1, chamados espaamentos no-unitrios, utilizando apenas operaes de carga vetorial e armazenamento
vetorial com capacidade de espaamento. Essa habilidade para acessar posies de memria no-seqenciais e
remodelar essas posies em uma estrutura densa uma das principais vantagens de um processador vetorial
sobre um processador baseado em cache. As caches lidam inerentemente com dados de espaamento unitrios
de forma que, enquanto o tamanho de bloco crescente pode ajudar a reduzir taxas de erros para grandes con-
juntos de dados cientficos com o espaamento unitrio, o aumento do tamanho de bloco pode ter um efeito
negativo para dados acessados com espaamento no-unitrio. Embora as tcnicas de formao de blocos pos-
sam resolver alguns desses problemas (veja a Seo 5.5), a habilidade para acessar de forma eficiente dados que
no so contguos continua a ser uma vantagem dos processadores vetoriais em certos problemas.
No VMIPS, em que a unidade enderevel um byte, o espaamento para nosso exemplo seria 800. O valor
deve ser calculado dinamicamente, pois o tamanho da matriz talvez no seja conhecido em tempo de compila-
o ou exatamente como o comprimento de vetor pode mudar para diferentes execues da mesma instru-
o. O espaamento vetorial, como o endereo inicial vetorial, pode ser inserido em um registrador de uso ge-
ral. Ento, a instruo do VMIPS LVWS (carregar vetor com espaamento) pode ser usada para buscar o vetor em
um registrador vetorial. Da mesma forma, quando um vetor de espaamento no-unitrio est sendo armazena-
do, a instruo SVWS (armazenar vetor com espaamento) pode ser usada. Em alguns processadores vetoriais, as
cargas e armazenamentos sempre tm um valor de espaamento armazenado em um registrador, de modo que
apenas uma nica instruo de carga e uma nica instruo de armazenamento sejam necessrias. Os espaa-
mentos unitrios ocorrem com muito maior freqncia que outros espaamentos e podem se beneficiar do tra-
tamento de caso especial no sistema de memria, e assim so muitas vezes separados de operaes de espaa-
mento no-unitrias, como no VMIPS.
Podem ocorrer complicaes no sistema de memria quando h suporte para espaamentos maiores que 1.
No Captulo 5, vimos que os acessos memria poderiam prosseguir em velocidade mxima se o nmero de
bancos de memria fosse pelo menos to grande quanto o tempo ocupado do banco em ciclos de clock. Porm,
uma vez que so introduzidos espaamentos no-unitrios, torna-se possvel solicitar acessos do mesmo banco
com maior freqncia do que permite o tempo ocupado do banco. Quando vrios acessos disputam um banco,
ocorre um conflito de banco de memria e um acesso tem de ser desdobrado (paralisado). Um conflito de ban-
co e, portanto, um desdobramento, ocorrer se:

Nmero de bancos
< Tempo ocupado do banco
Mnimo mltiplo comum (Espaamento, Nmero de bancos)

EXEMPLO Vamos supor que temos 8 bancos de memria com um tempo ocupado de banco de 6 clocks e uma latncia de
memria total de 12 ciclos. Quanto tempo demorar para completar uma carga de vetor de 64 elementos com
um espaamento igual a 1? E com um espaamento igual a 32?
Resposta Tendo em vista que o nmero de bancos maior que o tempo ocupado de banco, para um espaamento igual a
1, a carga demorar 12 + 64 = 76 ciclos de clock ou 1,2 clock por elemento. O pior espaamento possvel um
valor mltiplo do nmero de bancos de memria, como nesse caso com um espaamento igual a 32 e 8 bancos
de memria. Todo acesso memria (aps o primeiro) colidir com o acesso anterior e ter de esperar pelo
tempo ocupado de banco de 6 ciclos de clock. O tempo total ser 12 + 1 + 6 * 63 = 391 ciclos de clock ou 6,1
clocks por elemento.

No ocorrero conflitos de bancos de memria dentro de uma nica instruo de memria vetorial se o es-
paamento e o nmero de bancos forem primos entre si, e houver bancos suficientes para evitar conflitos no
caso de espaamento unitrio. Quando no existem conflitos de bancos, espaamentos de vrias palavras e es-
paamentos unitrios funcionam nas mesmas velocidades. O aumento do nmero de bancos de memria para
um nmero maior que o mnimo a fim de evitar desdobramentos com um espaamento de comprimento 1 di-
96 Apndice G Processadores vetoriais

minuir a freqncia de desdobramento para alguns outros espaamentos. Por exemplo, com 64 bancos, um
espaamento igual a 32 se desdobrar em acessos alternados, e no em todos os acessos. Se originalmente tivs-
semos um espaamento igual a 8 e 16 bancos, cada acesso alternado se desdobraria; com 64 bancos, um espaa-
mento igual a 8 se desdobrar em cada oitavo acesso. Se tivermos vrios pipelines de memria e/ou vrios pro-
cessadores compartilhando o mesmo sistema de memria, tambm precisaremos de mais bancos para evitar
conflitos. At mesmo mquinas com um nico pipeline de memria podem experimentar conflitos de bancos
de memria em acessos de espaamento unitrio entre os ltimos elementos de uma instruo e os primeiros
elementos da instruo seguinte, e o aumento do nmero de bancos reduzir a probabilidade desses conflitos
entre instrues. Em 2001, a maioria dos supercomputadores vetoriais tinha no mnimo 64 bancos, e alguns ti-
nham at 1.024 na configurao de memria mxima. Pelo fato de ainda poderem ocorrer conflitos de bancos
em casos de espaamento no-unitrio, os programadores preferem acessos de espaamento unitrio sempre
que possvel.
Um supercomputador moderno pode ter dezenas de CPUs, cada uma com vrios pipelines de memria co-
nectados a milhares de bancos de memria. Seria impraticvel fornecer um caminho dedicado entre cada pipe-
line de memria e cada banco de memria, e assim em geral suada uma rede de comutao de vrios estgios
para conectar pipelines de memria a bancos de memria. Pode surgir congestionamento nessa rede de comu-
tao, pois acessos vetoriais diferentes disputam os mesmos caminhos de circuitos, causando desdobramentos
adicionais no sistema de memria.

G.4 Otimizao do desempenho vetorial


Nesta seo, apresentaremos cinco tcnicas para melhorar o desempenho de um processador vetorial. A primei-
ra, o encadeamento, lida com a criao de uma seqncia de operaes vetoriais dependentes que funcionam
com maior rapidez, originrias do Cray-1, mas agora admitidas na maioria dos processadores vetoriais. As duas
seguintes lidam com a expanso da classe de loops que podem ser executados em modo vetorial, combaten-
do-se os efeitos da execuo condicional e de matrizes esparsas com novos tipos de instrues vetoriais. A
quarta tcnica aumenta o desempenho de pico de uma mquina vetorial, adicionando mais unidades paralelas
de execuo, sob a forma de pistas adicionais. A quinta tcnica reduz o overhead de inicializao, por meio do
pipelining e da sobreposio da inicializao de instrues.

Encadeamento o conceito de encaminhamento estendido a registradores vetoriais


Considere a seqncia vetorial simples a seguir:

MULV.D V1,V2,V3
ADDV.D V4,V1,V5

No VMIPS, como ele se encontra no momento, essas duas instrues devem ser inseridas em dois comboios
separados, pois as instrues so dependentes. Por outro lado, se o registrador vetorial, V1 nesse caso, for trata-
do no como uma nica entidade, mas como um grupo de registradores individuais, ento as idias de encami-
nhamento podero ser estendidas conceitualmente para atuarem sobre elementos individuais de um vetor.
Essa idia, que permitir a ADDV.D se iniciar mais cedo nesse exemplo, chamada encadeamento. O encadeamen-
to permite que uma operao vetorial comece to logo os elementos individuais de seu operando vetorial de
origem se tornem disponveis: os resultados da primeira unidade funcional na cadeia so encaminhados para
a segunda unidade funcional. Na prtica, o encadeamento implementado com freqncia permitindo-se ao
processador ler e gravar um registrador especfico ao mesmo tempo, embora para diferentes elementos. Imple-
mentaes anteriores do encadeamento funcionavam como o encaminhamento, mas isso restringia a sincroni-
zao das instrues de origem e destino na cadeia. Implementaes recentes utilizam o encadeamento flexvel,
que permite a uma instruo vetorial se encadear a essencialmente qualquer outra instruo vetorial ativa, su-
pondo-se que no seja gerado nenhum risco estrutural. O encadeamento flexvel exige acesso simultneo ao
mesmo registrador vetorial por diferentes instrues vetoriais, o que pode ser implementado adicionando-se
mais portas de leitura e gravao ou organizando-se o armazenamento do arquivo de registradores vetoriais em
bancos intercalados, de maneira semelhante ao sistema de memria. Supomos esse tipo de encadeamento em
todo o restante deste apndice.
G.4 Otimizao do desempenho vetorial 97

Embora um par de operaes dependa de outro, o encadeamento permite que as operaes prossigam
em paralelo em elementos separados do vetor. Isso permite que as operaes sejam programadas no mes-
mo comboio e reduz o nmero de chimes necessrios. Na seqncia anterior, pode ser alcanada uma taxa
sustentada (ignorando-se a inicializao) de duas operaes de ponto flutuante por ciclo de clock, ou um
chime, ainda que as operaes sejam dependentes! O tempo total de execuo para a seqncia anterior
torna-se:

Comprimento de vetor + Tempo de inicializaoADDV + Tempo de inicializaoMULV

A Figura G.10 mostra a sincronizao de uma verso encadeada e de uma verso no-encadeada do par ante-
rior de instrues vetoriais, com um comprimento de vetor igual a 64. Esse comboio exige um chime; porm,
pelo fato de utilizar encadeamento, o overhead de inicializao ser visto na sincronizao real do comboio. Na
Figura G.10, o tempo total para operao encadeada 77 ciclos de clock ou 1,2 ciclo por resultado. Com 128
operaes de ponto flutuante realizadas nesse tempo, obtido 1,7 FLOP por ciclo de clock. No caso da verso
no-encadeada, h 141 ciclos de clock ou 0,9 FLOP por ciclo de clock.
Embora o encadeamento nos permita reduzir o componente de chime do tempo de execuo inserindo duas
instrues dependentes no mesmo comboio, ele no elimina o overhead de inicializao. Se quisermos obter
uma estimativa precisa do tempo de execuo, teremos de contar o tempo de inicializao, tanto dentro de
comboios quanto entre eles. Com o encadeamento, o nmero de chimes para uma seqncia determinado
pelo nmero de unidades funcionais vetoriais diferentes disponveis no processador e pelo nmero exigido
pela aplicao. Em particular, nenhum comboio pode conter um risco estrutural. Por exemplo, isso significa
que uma seqncia contendo duas instrues de memria vetoriais dever ocupar pelo menos dois comboios e,
conseqentemente, dois chimes, em um processador como o VMIPS com apenas uma unidade vetorial de car-
ga-armazenamento.
Veremos na Seo G.6 que o encadeamento desempenha um papel importante na otimizao do desempe-
nho vetorial. De fato, o encadeamento to importante que todo processador vetorial moderno admite o enca-
deamento flexvel.

Instrues executadas condicionalmente


A partir da Lei de Amdahl, sabemos que a acelerao em programas com nveis baixos a moderados de vetoriza-
o ser muito limitada. H duas razes pelas quais no se obtm nveis mais altos de vetorizao: a presena de
condicionais (instrues if) dentro de loops e o uso de matrizes esparsas. Programas que contm instrues if
em loops no podem ser executados em modo vetorial usando-se as tcnicas que discutimos at agora, porque
as instrues if introduzem dependncias de controle em um loop. Da mesma forma, matrizes esparsas no po-
dem ser implementadas de forma eficiente com a utilizao de qualquer dos recursos que vimos at agora. Dis-
cutiremos aqui estratgias para lidar com a execuo condicional, deixando a discusso de matrizes esparsas
para a subseo seguinte.
Considere o loop a seguir:

do 100 i = 1, 64
if (A(i).ne. 0) then
A(i) B(i)
endif
100 continue

7 64 6 64
No-encadeadas Total = 141
MULV ADDV
7 64

Encadeadas MULV
6 64
Totais = 77
ADDV
Figura G.10 Sincronizaes para uma seqncia de operaes vetoriais dependentes ADDV e MULV, tanto no-enca-
deadas quanto encadeadas. Os retardos de 6 e 7 ciclos de clock so a latncia do somador e do multiplicador.
98 Apndice G Processadores vetoriais

Esse loop no pode ser vetorizado normalmente devido execuo condicional do corpo; no entanto, se o
loop interno pudesse ser executado nas iteraes para as quais A(i) 0, a subtrao poderia ser vetorizada. No
Captulo 4, vimos que as instrues executadas condicionalmente poderiam transformar tais dependncias de
controle em dependncias de dados, aumentando a habilidade para tornar o loop paralelo. Os processadores
vetoriais podem se beneficiar de uma capacidade equivalente no caso de vetores.
A extenso comumente usada para essa capacidade o controle de mscara de vetor. O controle de mscara
de vetor utiliza um vetor booleano de comprimento MVL para controlar a execuo de uma instruo vetorial,
da mesma maneira que instrues executadas condicionalmente utilizam uma condio booleana para deter-
minar se uma instruo executada. Quando o registrador de mscara de vetor est ativo, quaisquer instrues
vetoriais executadas s operam sobre os elementos vetoriais cujas entradas correspondentes no registrador de
mscara de vetor so iguais a 1. As entradas no registrador vetorial de destino que correspondem a um valor 0
no registrador de mscara no so afetadas pela operao vetorial. Se o registrador de mscara de vetor for defi-
nido pelo resultado de uma condio, apenas os elementos que satisfizerem condio sero afetados. Limpar
o registrador de mscara de vetor define todos os seus elementos como 1, fazendo instrues vetoriais subse-
qentes operarem sobre todos os elementos do vetor. O cdigo a seguir pode agora ser usado para o loop an-
terior, supondo-se que os endereos iniciais de A e B estejam em Ra e Rb, respectivamente:

LV V1,Ra ;carrega vetor A em V1


LV V2,Rb ;carrega vetor B
L.D F0,#0 ;carrega zero de FP em F0
SNEVS.D V1,F0 ;define VM(i) como 1 se V1(i)!=F0
SUBV.D V1,V1,V2 ;subtrai sob mscara de vetor
CVM ;define mscara de vetor somente com valores 1
SV Ra,V1 ;armazena resultado em A

Os processadores vetoriais mais recentes fornecem controle de mscara de vetor. A capacidade de mscara
de vetor descrita aqui est disponvel em alguns processadores, mas outros permitem o uso da mscara de vetor
somente com um subconjunto das instrues vetoriais.
No entanto, o uso de um registrador de mscara de vetor tem desvantagens. Quando examinamos instrues
executadas condicionalmente, vimos que tais instrues ainda exigem tempo de execuo quando a condio
no satisfeita. Todavia, a eliminao de um desvio e das dependncias de controle associadas pode tornar uma
instruo condicional mais rpida, ainda que s vezes ela realize trabalho intil. De modo semelhante, instru-
es vetoriais executadas com uma mscara de vetor ainda ocupam tempo de execuo, mesmo para os ele-
mentos em que a mscara 0. Da mesma forma, mesmo com um nmero significativo de valores 0 na mscara,
a utilizao do controle de mscara de vetor ainda pode ser significativamente mais rpida que empregar o
modo escalar. De fato, a grande diferena de desempenho potencial entre o modo vetorial e o modo escalar tor-
na crtica a incluso de instrues de mscara de vetor.
Em segundo lugar, em alguns processadores vetoriais, a mscara de vetor serve apenas para desativar o ar-
mazenamento do resultado no registrador de destino, e a operao real ainda ocorre. Desse modo, se a operao
no exemplo anterior fosse uma diviso em vez de uma subtrao e o teste fosse sobre B em vez de A, poderiam
resultar falsas excees de ponto flutuante, pois ocorreria uma diviso por 0. Processadores que mascaram a
operao, bem como o armazenamento do resultado, evitam esse problema.

Matrizes esparsas
Existem tcnicas para permitir que programas com matrizes esparsas sejam executados em modo vetorial. Em
uma matriz esparsa, os elementos de um vetor normalmente so armazenados em alguma forma compactada, e
ento so acessados indiretamente. Supondo uma estrutura esparsa simplificada, poderamos encontrar cdigo
semelhante a este:

do 100 i = 1,n
100 A(K(_i)) = A(K(_i)) + C(M(_i))

Esse cdigo implementa uma soma vetorial esparsa sobre os arrays A e C, usando vetores de ndice K e M para
designar os elementos no-nulos de A e C. (A e C devem ter o mesmo nmero de elementos no-nulos n deles.)
G.4 Otimizao do desempenho vetorial 99

Outra representao comum para matrizes esparsas utiliza um vetor de bits para informar quais elementos
existem e um vetor denso para os elementos no-nulos. Freqentemente, ambas as representaes existem no
mesmo programa. As matrizes esparsas so encontradas em muitos cdigos e existem muitas maneiras de im-
plement-las, dependendo da estrutura de dados utilizada no programa.
Um importante mecanismo para dar suporte a matrizes esparsas o emprego de operaes de disper-
so-acumulao com a utilizao de vetores de ndice. O objetivo de tais operaes fornecer suporte para a
movimentao entre uma representao densa (isto , zeros no-includos) e a representao normal (isto , os
zeros esto includos) de uma matriz esparsa. Uma operao de acumulao toma um vetor de ndice e busca o
vetor cujos elementos esto nos endereos dados pela adio de um endereo-base aos deslocamentos forneci-
dos no vetor de ndice. O resultado um vetor no-esparso em um registrador vetorial. Aps a operao sobre
esses elementos em forma densa, o vetor esparso pode ser armazenado em forma expandida por um armazena-
mento de disperso, usando-se o mesmo vetor de ndice. O suporte de hardware para tais operaes chamado
disperso-acumulao e est presente em quase todos os processadores vetoriais modernos. As instrues LVI
(carregar vetor indexado) e SVI (armazenar vetor indexado) fornecem essas operaes no VMIPS. Por exemplo,
supondo-se que Ra, Rc, Rk e Rm contenham os endereos iniciais dos vetores na seqncia anterior, o loop inter-
no da seqncia pode ser codificado com instrues vetoriais como:

LV Vk,Rk ;carregar K
LVI Va,(Ra+Vk) ;carregar A(K(_I))
LV Vm,Rm ;carregar M
LVI Vc,(Rc+Vm) ;carregar C(M(_I))
ADDV.D Va,Va,Vc ;som-los
SVI (Ra+Vk,Va) ;armazenar A(K(_I))

Essa tcnica permite que um cdigo com matrizes esparsas seja executado em modo vetorial. Um compila-
dor de vetorizao simples no poderia vetorizar automaticamente o cdigo-fonte anterior, porque o compilador
no saberia que os elementos de K so valores distintos e, portanto, que no existe nenhuma dependncia. Em
vez disso, uma diretiva do programador informaria ao compilador que ele poderia executar o loop em modo ve-
torial.
Compiladores de vetorizao mais sofisticados podem vetorizar o loop automaticamente sem anotaes
do programador, inserindo verificaes de tempo de execuo para dependncias de dados. Essas verifica-
es de tempo de execuo so implementadas com uma verso de software vetorizada do hardware de ta-
bela de endereo de carga avanada (ALAT advanced load address table) descrita no Captulo 4 para o
processador Itanium. O hardware ALAT associativo substitudo por uma tabela de hash de software que
detecta se dois acessos a elementos dentro da mesma iterao de minerao na superfcie so acessos ao
mesmo endereo. Se nenhuma dependncia for detectada, a iterao de minerao na superfcie poder se
completar usando o comprimento de vetor mximo. Se for detectada uma dependncia, o comprimento de
vetor ser redefinido com um valor menor que evite todas as violaes de dependncias, deixando que os
elementos restantes sejam tratados na prxima iterao do loop de minerao na superfcie. Embora esse
esquema acrescente um overhead de software considervel ao loop, o overhead ser vetorizado principal-
mente para o caso comum em que no h nenhuma dependncia e, como resultado, o loop ainda funciona-
r de forma bem mais rpida que o cdigo escalar (embora seja muito mais lento do que seria se fosse forne-
cida uma diretiva do programador).
Um recurso de disperso-acumulao includo em muitos supercomputadores recentes. Essas operaes
freqentemente funcionam de forma mais lenta que acessos espaados, porque sua implementao mais com-
plexa e elas so mais suscetveis a conflitos de bancos; porm, elas ainda so muito mais rpidas que a alternati-
va, que pode ser um loop escalar. Se as propriedades de disperso de uma matriz se alterarem, um novo vetor de
ndice ter de ser calculado. Muitos processadores fornecem suporte para o clculo rpido do vetor de ndice. A
instruo CVI (criar vetor de ndice) no VMIPS cria um vetor de ndice dado um espaamento (m), onde os va-
lores no vetor de ndice so 0, m, 2 m, ..., 63 m. Alguns processadores oferecem uma instruo para criar um
vetor de ndice compactado cujas entradas correspondem s posies com um valor 1 no registrador de msca-
ra. Outras arquiteturas vetoriais fornecem um mtodo para compactar um vetor. No VMIPS, definimos a ins-
truo CVI para sempre criar um vetor de ndice compactado usando a mscara de vetor. Quando a mscara de
vetor for toda formada por valores 1, ser criado um vetor de ndice padro.
100 Apndice G Processadores vetoriais

As instrues de carga-armazenamento indexado e a instruo CVI oferecem um mtodo alternativo para dar
suporte execuo vetorial condicional. Aqui est uma seqncia vetorial que implementa o loop que vimos na
pgina 97:

LV V1,Ra ;carrega vetor A em V1


L.D F0,#0 ;carrega zero de FP em F0
SNEVS.D V1,F0 ;define o VM como 1 se V1(i)!=F0
CVI V2,#8 ;gera ndices em V2
POP R1,VM ;encontra o nmero de valores 1 em VM
MTC1 VLR,R1 ;carrega registrador de comprimento de vetor
CVM ;limpa a mscara
LVI V3,(Ra+V2) ;carrega os elementos no-nulos de A
LVI V4,(Rb+V2) ;carrega os elementos correspondentes de B
SUBV.D V3,V3,V4 ;efetua a subtrao
SVI (Ra+V2,V3) ;armazena A de volta

Decidir se melhor usar a implementao com disperso-acumulao ou a verso executada condicional-


mente depende da freqncia com que a condio vlida e do custo das operaes. Ignorando-se o encadea-
mento, o tempo de execuo da primeira verso (na pgina 97) 5n + c1. O tempo de execuo da segunda ver-
so, usando cargas e armazenamentos indexados com um tempo de execuo de um elemento por clock, 4n +
4fn + c2, onde f a frao de elementos para os quais a condio verdadeira (isto , A(i) 0). Se considerarmos
que os valores de c1 e c2 so comparveis ou ento que eles so muito menores que n, poderemos descobrir
quando essa segunda tcnica melhor.

Tempo1 = 5(n)

Tempo2 = 4n + 4fn

Queremos que Tempo1 Tempo2; assim,

5n 4 n + 4 fn

1
f
4

Isto , o segundo mtodo mais rpido se menos de um quarto dos elementos so diferentes de zero. Em
muitos casos, a freqncia de execuo muito mais baixa. Se o vetor de ndice puder ser reutilizado ou se o
nmero de instrues vetoriais dentro da instruo if crescer, a vantagem do enfoque de disperso-acumulao
aumentar nitidamente.

Vrias pistas
Umas das maiores vantagens de um conjunto de instrues vetoriais o fato de permitir que o software repasse
uma grande proporo de trabalho paralelo para o hardware, utilizando apenas uma nica instruo curta.
Uma nica instruo vetorial pode incluir desde dezenas at centenas de operaes independentes, ainda que
esteja codificada no mesmo nmero de bits de uma instruo escalar convencional. A semntica paralela de
uma instruo vetorial permite que uma implementao execute essas operaes elementares usando uma uni-
dade funcional com pipeline profundo, como na implementao de VMIPS que estudamos at agora ou usando
um array de unidades funcionais paralelas ou ainda uma combinao de unidades funcionais paralelas e com
pipeline. A Figura G.11 ilustra como o desempenho vetorial pode ser melhorado com o uso de pipelines parale-
los para executar uma instruo de adio vetorial.
O conjunto de instrues do VMIPS foi projetado com a propriedade de que todas as instrues vetoriais
aritmticas s permitem que o elemento N de um registrador vetorial tome parte em operaes com o elemento
N de outros registradores vetoriais. Isso simplifica drasticamente a construo de uma unidade vetorial alta-
mente paralela, que pode ser estruturada como vrias pistas paralelas. Como em uma auto-estrada com trfego
intenso, podemos aumentar o throughput de pico de uma unidade vetorial acrescentando mais pistas. A estru-
tura de uma unidade vetorial de quatro pistas mostrada na Figura G.12.
G.4 Otimizao do desempenho vetorial 101

Cada pista contm uma poro do arquivo de registrador vetorial e um pipeline de execuo de cada unida-
de funcional vetorial. Cada unidade funcional vetorial executa instrues vetoriais na velocidade de um grupo
de elementos por ciclo, usando vrios pipelines, um por pista. A primeira pista contm o primeiro elemento
(elemento 0) para todos os registradores vetoriais, e assim o primeiro elemento em qualquer instruo vetorial
ter seus operandos de origem e destino localizados na primeira pista. Isso permite ao pipeline aritmtico local
pista completar a operao sem se comunicar com outras pistas. A conexo entre pistas s necessria para
acessar a memria principal. Essa falta de comunicao entre pistas reduz o custo da conexo e as portas de ar-
quivos de registradores necessrias para construir uma unidade de execuo altamente paralela, e ajuda a expli-

A[9] B[9]

A[8] B[8]

A[7] B[7]

A[6] B[6]

A[5] B[5]

A[4] B[4]

A[3] B[3]

A[2] B[2] A[8] B[8] A[9] B[9]

A[1] B[1] A[4] B[4] A[5] B[5] A[6] B[6] A[7] B[7]

C[0] C[0] C[1] C[2] C[3]

Grupo de elementos
(a) (b)

Figura G.11 O uso de vrias unidades funcionais para melhorar o desempenho de uma nica instruo de adio ve-
torial, C = A + B. A mquina mostrada em (a) tem um nico pipeline de adio e pode completar uma adio por ciclo. A m-
quina mostrada em (b) tem quatro pipelines de adio e pode completar quatro adies por ciclo. Os elementos dentro de uma
nica instruo de adio vetorial so intercalados entre os quatro pipelines. O conjunto de elementos que se movimentam pe-
los pipelines juntos chamado grupo de elementos. (Reproduzida com permisso de Asanovic [1998]).

Pista 0 Pista 1 Pista 2 Pista 3

Adio Adio Adio Adio


de FP de FP de FP de FP
tubo 0 tubo 1 tubo 2 tubo 3

Registradores Registradores Registradores Registradores


vetoriais: vetoriais: vetoriais: vetoriais:
elementos elementos elementos elementos
0,4,8, . . . 1,5,9, . . . 2,6,10, . . . 3,7,11, . . .

Mul. Mul. Mul. Mul.


de FP de FP de FP de FP
tubo 0 tubo 1 tubo 2 tubo 3

Unidade de carga-armazenamento vetorial

Figura G.12 Estrutura de uma unidade vetorial contendo quatro pistas. O espao de armazenamento de registradores
vetoriais dividido entre as pistas, com cada pista contendo cada quarto elemento de cada registrador vetorial. Esto represen-
tadas trs unidades funcionais vetoriais, uma adio de FP, uma multiplicao de FP e uma unidade de carga-armazenamento.
Cada uma das unidades vetoriais aritmticas contm quatro pipelines de execuo, um por pista, que atuam em concerto para
completar uma nica instruo vetorial. Observe que cada seo do arquivo de registrador vetorial s precisa fornecer portas
suficientes para pipelines locais sua pista; isso reduz drasticamente o custo de fornecer vrias portas para os registradores ve-
toriais. O caminho para fornecer o operando escalar correspondente a instrues vetoriais-escalares no mostrado nesta figu-
ra, mas o valor escalar deve ser transmitido para todas as pistas.
102 Apndice G Processadores vetoriais

car por que os supercomputadores vetoriais de hoje podem completar at 64 operaes por ciclo (2 unidades
aritmticas e 2 unidades de carga-armazenamento distribudas por 16 pistas).
A adio de vrias pistas uma tcnica popular para melhorar o desempenho vetorial, pois exige pouco au-
mento na complexidade de controle e no requer mudanas no cdigo de mquina existente. Diversos super-
computadores vetoriais so comercializados como uma srie de modelos que variam no nmero de pistas insta-
ladas, permitindo aos usurios negociar o preo em funo do desempenho vetorial de pico. O Cray SV1 permi-
te que quatro CPUs de duas pistas sejam reunidas com o uso de software do sistema operacional para formar
uma nica CPU maior com oito pistas.

Inicializao de instruo com pipeline


A adio de vrias pistas aumenta o desempenho de pico, mas no altera a latncia de inicializao, e assim se
torna crtico reduzir o overhead de inicializao, permitindo que o incio de uma instruo vetorial seja sobre-
posto concluso de instrues vetoriais precedentes. O caso mais simples a considerar quando duas instru-
es vetoriais acessam um conjunto diferente de registradores vetoriais. Por exemplo, na seqncia de cdigo:

ADDV.D V1,V2,V3
ADDV.D V4,V5,V6

uma implementao pode permitir que o primeiro elemento da segunda instruo vetorial siga imediatamente
o ltimo elemento da primeira instruo vetorial abaixo no pipeline do somador de FP. Para reduzir a comple-
xidade da lgica de controle, algumas mquinas vetoriais exigem algum tempo de recuperao ou tempo morto
entre duas instrues vetoriais despachadas para a mesma unidade vetorial. A Figura G.13 o diagrama de um
pipeline que mostra a latncia de inicializao e tambm o tempo morto para um nico pipeline vetorial.
O exemplo a seguir ilustra o impacto desse tempo morto sobre o desempenho vetorial que pode ser alcanado.

EXEMPLO O Cray C90 tem duas pistas, mas exige 4 ciclos de clock de tempo morto entre duas instrues vetoriais quais-
quer para a mesma unidade funcional, ainda que elas no tenham dependncias de dados. Para o comprimento
de vetor mximo de 128 elementos, qual a reduo no desempenho de pico alcanvel causada pelo tempo
morto? Qual seria a reduo se o nmero de pistas fosse aumentado para 16?
Resposta Um vetor de comprimento mximo de 128 elementos dividido sobre as duas pistas e ocupa uma unidade fun-
cional vetorial durante 64 ciclos de clock. O tempo morto adiciona outros 4 ciclos de ocupao, reduzindo o
desempenho de pico para 64/(64 + 4) = 94,1% do valor sem tempo morto. Se o nmero de pistas for aumentado
para 16, as instrues vetoriais de comprimento mximo ocuparo uma unidade funcional por apenas 128/16 =
8 ciclos, e o tempo morto reduzir o desempenho de pico para 8/(8 + 4) = 66,6% do valor sem tempo morto.
Nesse segundo caso, as unidades vetoriais nunca podem estar mais de 2/3 ocupadas!

Latncia de
inicializao

R X1 X2 X3 W
Primeira instruo
R X1 X2 X3 W vetorial
Elemento 63 R X1 X2 X3 W
Ciclo morto R X1 X2 X3 W
Ciclo morto R X1 X2 X3 W
Tempo morto
Ciclo morto R X1 X2 X3 W
Ciclo morto R X1 X2 X3 W
Elemento 0 R X1 X2 X3 W
Segunda instruo
Elemento 1 R X1 X2 X3 W
vetorial
R X1 X2 X3 W

Figura G.13 Latncia de inicializao e tempo morto para um nico pipeline vetorial. Cada elemento tem uma latncia
de 5 ciclos: 1 ciclo para ler o arquivo de registrador vetorial, 3 ciclos em execuo, e depois 1 ciclo para gravar o arquivo de regis-
trador vetorial. Elementos da mesma instruo vetorial podem seguir uns aos outros no pipeline, mas essa mquina insere 4 ci-
clos de tempo morto entre duas instrues vetoriais diferentes. O tempo morto pode ser eliminado com lgica de controle mais
complexa. (Reproduzida com permisso de Asanovic [1998].)
G.5 Eficcia dos compiladores de vetorizao 103

A inicializao da instruo de pipelining se torna mais complicada quando vrias instrues podem estar
lendo e gravando o mesmo registrador vetorial, e quando algumas instrues podem se desdobrar imprevisivel-
mente como, por exemplo, uma carga vetorial que encontra conflitos de bancos de memria. Porm, medida
que crescem tanto o nmero de pistas quanto a latncia de pipeline, torna-se cada vez mais importante permitir
a inicializao de instrues com pipeline total.

G.5 Eficcia dos compiladores de vetorizao


Dois fatores afetam o sucesso com que um programa pode ser executado em modo vetorial. O primeiro fator a
estrutura do prprio programa: os loops tm dependncias de dados verdadeiras ou podem ser reestruturados
para no terem tais dependncias? Esse fator influenciado pelos algoritmos escolhidos e, at certo ponto, pelo
modo como eles so codificados. O segundo fator a capacidade do compilador. Embora nenhum compilador
possa vetorizar um loop onde no existir nenhum paralelismo entre as iteraes do loop, h uma enorme varia-
o na habilidade dos compiladores para determinar se um loop pode ser vetorizado. As tcnicas usadas para
vetorizar programas so as mesmas que foram discutidas no Captulo 4 para descobrir o ILP; aqui, simplesmen-
te vamos rever como essas tcnicas funcionam.
Como uma indicao do nvel de vetorizao que pode ser alcanado em programas cientficos, vamos exa-
minar os nveis de vetorizao observados para os benchmarks Perfect Club. Esses benchmarks so grandes
aplicaes cientficas reais. A Figura G.14 mostra a porcentagem de operaes executadas em modo vetorial
para duas verses do cdigo em execuo no Cray Y-MP. A primeira verso a obtida apenas com a otimizao
do compilador no cdigo original, enquanto a segunda verso foi extensivamente otimizada mo por uma
equipe de programadores da Cray Research. A grande variao no nvel de vetorizao do compilador foi obser-
vada por diversos estudos do desempenho de aplicaes em processadores vetoriais.
As verses otimizadas mo geralmente mostram ganhos significativos em nvel de vetorizao para cdi-
gos que o compilador no poderia vetorizar bem sozinho, agora com todos os cdigos acima de 50% de vetori-
zao. interessante notar que, para MG3D, FLO52 e DYFESM, o cdigo mais rpido produzido pelos progra-
madores da Cray tinha nveis de vetorizao mais baixos. O nvel de vetorizao no suficiente para determi-
nar sozinho o desempenho. Tcnicas alternativas de vetorizao poderiam executar um nmero menor de ins-
trues ou manter mais valores em registradores vetoriais, ou ainda permitir maior encadeamento e sobreposi-
o entre operaes vetoriais, melhorando assim o desempenho mesmo se o nvel de vetorizao permanecer
igual ou se reduzir. Por exemplo, o BDNA tem quase o mesmo nvel de vetorizao nas duas verses, mas o c-
digo otimizado manualmente mais de 50% mais rpido.

Operaes executadas Operaes executadas


em modo vetorial, otimizadas em modo vetorial, Acelerao da
Nome do benchmark pelo compilador otimizadas mo otimizao manual

BDNA 96,1% 97,2% 1,52


MG3D 95,1% 94,5% 1,00
FLO52 91,5% 88,7% N/A
ARC3D 91,1% 92,0% 1,01
SPEC77 90,3% 90,4% 1,07
MDG 87,7% 94,2% 1,49
TRFD 69,8% 73,7% 1,67
DYFESM 68,8% 65,6% N/A
ADM 42,9% 59,6% 3,60
OCEAN 42,8% 91,2% 3,92
TRACK 14,4% 54,6% 2,52
SPICE 11,5% 79,9% 4,06
QCD 4,2% 75,1% 2,15
Figura G.14 Nvel de vetorizao entre os benchmarks Perfect Club quando executados no Cray Y-MP [Vajapeyam 1991]. A pri-
meira coluna mostra o nvel de vetorizao obtido com o compilador, enquanto a segunda coluna mostra os resultados depois de os cdi-
gos terem sido aperfeioados mo por uma equipe de programadores da Cray Research. Os nmeros de acelerao no esto disponveis
para FLO52 e DYFESM, pois as verses otimizadas mo usaram conjuntos de dados maiores que as verses otimizadas pelo compilador.
104 Apndice G Processadores vetoriais

Completamente
Processador Compilador vetorizado Parcialmente vetorizado No-vetorizado

CDC CYBER 205 VAST-2 V2.21 62 5 33


Convex srie C FC5.0 69 5 26
Cray X-MP CFT77 V3.0 69 3 28
Cray X-MP CFT V1.15 50 1 49
Cray-2 CFT2 V3.1a 27 1 72
ETA-10 FTN 77 V1.0 62 7 31
Hitachi S810/820 FORT77/HAP V20-2B 67 4 29
IBM 3090/VF VS FORTRAN V2.4 52 4 44
NEC SX/2 FORTRAN77 / SX V.040 66 5 29
Figura G.15 Resultado da aplicao de compiladores de vetorizao aos 100 ncleos de teste de FORTRAN. Para cada processador,
indicamos quantos loops foram completamente vetorizados, parcialmente vetorizados e no-vetorizados. Esses loops foram coletados por
Callahan, Dongarra e Levine [1988]. Dois compiladores diferentes para o Cray X-MP mostram a grande dependncia da tecnologia de com-
piladores.

Tambm existe uma enorme variao na forma como diferentes compiladores atuam em programas de veto-
rizao. Como um resumo do estado dos compiladores de vetorizao, considere os dados da Figura G.15, que
mostra a extenso de vetorizao para diferentes processadores, usando um conjunto de teste de 100 ncleos
FORTRAN escritos mo. Os ncleos foram projetados para testar a capacidade de vetorizao e podem ser to-
dos vetorizados mo; veremos diversos exemplos desses loops nos exerccios.

G.6 Juntando tudo: desempenho de processadores vetoriais


Nesta seo, vamos observar diferentes medidas de desempenho para processadores vetoriais e o que elas nos
dizem sobre o processador. Para determinar o desempenho de um processador em um problema vetorial, deve-
mos examinar o custo de inicializao e a taxa sustentada. A maneira mais simples e melhor para informar o de-
sempenho de um processador vetorial em um loop dar o tempo de execuo do loop vetorial. No caso de lo-
ops vetoriais, as pessoas freqentemente fornecem a classificao em MFLOPS (milhes de operaes de ponto
flutuante por segundo) em lugar do tempo de execuo. Utilizaremos a notao Rn para a avaliao de MFLOPS
em um vetor de comprimento n. O uso das medidas Tn (tempo) ou Rn (taxa) equivalente se o nmero de
FLOPS for estabelecido em comum acordo (consulte o Captulo 1 para ver uma descrio mais longa do
MFLOPS). Em todo caso, uma ou outra medida deve incluir o overhead.
Examinaremos nesta seo o desempenho do VMIPS em nosso loop de DAXPY, observando o desempenho a
partir de diferentes pontos de vista. Continuaremos a calcular o tempo de execuo de um loop vetorial usando
a equao desenvolvida na Seo G.3. Ao mesmo tempo, estudaremos diferentes maneiras de medir o desempe-
nho empregando o tempo calculado. Os valores constantes para Tloop usados nesta seo introduzem uma pe-
quena proporo de erro, o que ser ignorado.

Medidas de desempenho vetorial


Considerando-se a importncia do comprimento do vetor para se estabelecer o desempenho de um processador,
freqentemente so aplicadas medidas relacionadas ao comprimento, alm do tempo e de MFLOPS. Essas medi-
das relacionadas ao comprimento tendem a variar de forma drstica em diferentes processadores e interessante
compar-las. (Lembre-se, entretanto, de que o tempo sempre a medida de interesse quando se compara a veloci-
dade relativa de dois processadores.) Trs das mais importantes medidas relacionadas ao comprimento so:
n R4 A taxa de MFLOPS em um vetor de comprimento infinito. Embora essa medida possa ser de interesse
quando se avalia o desempenho de pico, problemas reais no tm comprimentos de vetores ilimitados, e as
penalidades de overhead encontradas em problemas reais sero maiores.
n N1/2 O comprimento de vetor necessrio para alcanar metade de R4. Essa uma boa medida do impacto do
overhead.
G.6 Juntando tudo: desempenho de processadores vetoriais 105

n Nv O comprimento de vetor necessrio para tornar o modo vetorial mais rpido que o modo escalar. Esse
valor mede tanto o overhead quanto a velocidade de escalares em relao a vetores.
Vamos observar essas medidas para nosso problema de DAXPY funcionando no VMIPS. Quando encadea-
do, o loop interno do cdigo de DAXPY em comboios semelhante ao da Figura G.16 (supondo-se que Rx e Ry
contm endereos iniciais).
Lembre-se de que nossa equao de desempenho para o tempo de execuo de um loop vetorial com n ele-
mentos, Tn, :

n
Tn = ( Tloop + Tincio ) + n Tchime
MVL

O encadeamento permite a execuo do loop em trs chimes (e no menos, pois existe um nico pipeline de
memria); desse modo, Tchime = 3. Se Tchime fosse uma indicao completa do desempenho, o loop funcionaria
em uma taxa de MFLOPS igual a 2/3 clock-rate (pois h 2 FLOPS por iterao). Assim, com base apenas na
contagem de chime, um VMIPS de 500 MHz executaria esse loop em 333 MFLOPS, supondo-se nenhuma mi-
nerao na superfcie ou nenhum overhead de inicializao. Existem vrias maneiras de melhorar o desempe-
nho: acrescentar unidades vetoriais de carga-armazenamento adicionais, permitir que os comboios se sobrepo-
nham para reduzir o impacto do overhead de inicializao e diminuir o nmero de cargas exigidas por alocao
de registrador vetorial. Examinaremos as duas primeiras extenses nesta seo. A ltima otimizao realmen-
te usada no Cray-1, primo do VMIPS, para impulsionar o desempenho em 50%. A reduo do nmero de cargas
exige uma otimizao entre procedimentos; examinaremos essa transformao no Exerccio G.6. Antes de exa-
minarmos as duas primeiras extenses, vejamos qual o desempenho real, incluindo o overhead.

O desempenho de pico do VMIPS sobre DAXPY


Primeiro, devemos determinar qual realmente o desempenho de pico, R4, pois sabemos que ele tem de diferir
da velocidade ideal de 333 MFLOPS. Por enquanto, continuamos a usar a hiptese simplificadora de que um
comboio no pode se iniciar at todas as instrues de um comboio anterior terem se completado; mais tarde,
removeremos essa restrio. Usando essa simplificao, o overhead de inicializao para a seqncia vetorial
simplesmente a soma dos tempos de inicializao das instrues:

Tincio = 12 + 7 + 12 + 6 + 12 = 49

Usando-se MVL = 64, Tloop = 15, Tincio = 49 e Tchime = 3 na equao de desempenho, e supondo que n no
um mltiplo exato de 64, o tempo para uma operao de n elementos :

n
Tn = (15 + 49) + 3n
64

( n + 64 ) + 3n

= 4 n + 64

A taxa sustentada na realidade maior que 4 ciclos de clock por iterao, em vez da taxa terica de 3 chimes,
que ignora o overhead. A parte importante da diferena o custo do overhead de inicializao para cada bloco
de 64 elementos (49 ciclos versus 15 para o overhead do loop).

LV V1,Rx MULVS.D V2,V1,F0 Comboio 1: carga e multiplicao encadeadas


LV V3,Ry ADDV.D V4,V2,V3 Comboio 2: segunda carga e adio encadeadas
SV Ry,V4 Comboio 3: armazena o resultado
Figura G.16 O loop interno do cdigo de DAXPY em comboios encadeados.
106 Apndice G Processadores vetoriais

Agora, podemos calcular R4 para um clock de 500 MHz como:

Operaes por iterao Clock-rate


R = lim
n Ciclos de clock por iterao

O numerador independente de n, conseqentemente:



Operaes por iterao Clock-rate
R =
lim (Ciclos de clock por iterao)
n

T 4 n + 64
lim (Ciclos de clock por iterao) = lim n = lim =4
n n n n n

2 500 MHz
R = = 250 MFLOPS
4

O desempenho sem o overhead de inicializao, que o desempenho de pico dada a estrutura da unidade
funcional vetorial, agora 1,33 vez mais alto. Na realidade, o abismo entre o desempenho de pico e o desempe-
nho sustentado para esse benchmark ainda maior!

Desempenho sustentado do VMIPS no benchmark Linpack


O benchmark Linpack uma eliminao gaussiana sobre uma matriz 100 100. Desse modo, os comprimentos
de elementos de vetores diminuem de 99 at 1. Um vetor de comprimento k usado k vezes. Portanto, o com-
primento do vetor mdio dado por:
99
i2
i =1
99
= 66,3
i
i =1

Agora, podemos obter uma estimativa precisa do desempenho de DAXPY, usando um comprimento de ve-
tor igual a 66.

T66 = 2 (15 + 49) 66 3 = 128 + 198 = 326

2 66 500
R66 = MFLOPS = 202 MFLOPS
326
O nmero de pico, ignorando-se o overhead de inicializao, 1,64 vez mais alto que essa estimativa de de-
sempenho sustentado sobre os comprimentos de vetores reais. Na prtica, o benchmark Linpack contm uma
frao no-trivial de cdigo que no pode ser vetorizada. Embora corresponda a menos de 20% do tempo antes
da vetorizao, esse cdigo responsvel por menos de um dcimo do desempenho quando contado como
FLOPS. Desse modo, a Lei de Amdahl informa que o desempenho global ser significativamente mais baixo
que o desempenho estimado a partir da anlise do loop interno.
Tendo em vista que o comprimento de vetor tem um impacto significativo sobre o desempenho, as medidas
N1/2 e Nv so usadas com freqncia na comparao entre mquinas vetoriais.

EXEMPLO Qual o valor de N1/2 apenas para o loop interno de DAXPY no VMIPS com um clock de 500 MHz?
Resposta Usando R4 como a taxa de pico, queremos conhecer o comprimento de vetor que alcanar cerca de 125
MFLOPS. Comeamos com a frmula para MFLOPS, supondo que a medio seja realizada para N1/2 elementos:

FLOPS executados em N1 2 iteraes Ciclos de clock


MFLOPS = 10 -6
Ciclos de clock para executar N1 2 iteraes Segundo
G.6 Juntando tudo: desempenho de processadores vetoriais 107
2 N1 2
125 = 500
TN1 2

Simplificando essa equao e depois supondo N1/2 64, de forma que Tn 64 = 1 64 + 3 n, obtemos:

TN1 2 = 8 N1 2

1 64 + 3 N1 2 = 8 N1 2

5 N1 2 = 64

N1 2 =12, 8

Ento, N1/2 = 13; isto , um vetor de comprimento 13 oferece aproximadamente metade do desempenho de
pico para o loop de DAXPY no VMIPS.

EXEMPLO Qual o comprimento de vetor, Nv, tal que a operao vetorial executada com maior rapidez que a escalar?
Resposta Novamente, sabemos que Nv < 64. O tempo para realizar uma iterao em modo escalar pode ser estimado
como 10 + 12 + 12 + 7 + 6 +12 = 59 clocks, onde 10 a estimativa do overhead de loop, que sabemos ser um
pouco menor que o overhead de loop de minerao na superfcie. No problema anterior, mostramos que esse
loop vetorial executado em modo vetorial no tempo Tn 64 = 64 + 3 n ciclos de clock. Ento:

64 + 3N v = 59N v

64
Nv =
56
Nv = 2

Para o loop de DAXPY, o modo vetorial mais rpido que o escalar, desde que o vetor tenha pelo menos dois
elementos. Esse nmero surpreendentemente pequeno, como veremos na prxima seo (Falcias e armadi-
lhas).

Desempenho de DAXPY em um VMIPS otimizado


DAXPY, como muitos problemas vetoriais, tem limitao de memria. Conseqentemente, o desempenho po-
deria ser melhorado acrescentando-se mais pipelines de acesso memria. Essa a principal diferena arquite-
tnica entre o Cray X-MP (e processadores posteriores) e o Cray-1. O Cray X-MP tem trs pipelines de mem-
ria, em comparao com o nico pipeline de memria do Cray-1, e o X-MP tem um encadeamento mais flex-
vel. De que maneira isso afeta o desempenho?

EXEMPLO Qual seria o valor de T66 para DAXPY no VMIPS, se acrescentssemos mais dois pipelines de memria?
Resposta Com trs pipelines de memria, todas as instrues cabem em um nico comboio e demoram um chime. Os
overheads de inicializao so os mesmos; assim,

64
T66 = ( Tloop + Tincio ) + 66 Tchime
64
T66 = 2 (15 + 49) + 66 1 = 194
108 Apndice G Processadores vetoriais

Com trs pipelines de memria, reduzimos a contagem de ciclos de clock para desempenho sustentado de
326 para 194, uma reduo de 1,7 vez. Observe o efeito da Lei de Amdahl: melhoramos a taxa de pico terica,
medida pelo nmero de chimes por um fator 3, mas s conseguimos uma melhoria global dada por um fator 1,7
no desempenho sustentado.

Outra melhoria poderia vir da permisso para que diferentes comboios se sobreponham e tambm para que
o overhead do loop escalar se sobreponha com as instrues vetoriais. Isso exige que uma operao vetorial
possa comear usando uma unidade funcional antes de outra operao ter se completado, o que complica a l-
gica de emisso de instrues. Permitir essa sobreposio elimina o overhead de inicializao separado para
cada comboio com exceo do primeiro, e tambm oculta o overhead de loop.
Para alcanar a mxima ocultao do overhead de minerao na superfcie, precisamos ter a possibilidade de
sobrepor instncias do loop com minerao na superfcie, permitindo que duas instncias de um comboio,
como tambm duas instncias do cdigo escalar, estejam em execuo ao mesmo tempo. Isso exige as mesmas
tcnicas que examinamos no Captulo 4 para evitar riscos WAR, embora a cpia possa ser evitada, pois no
possvel a sobreposio de leituras e gravaes de um nico elemento vetorial. Essa tcnica, chamada tailgating,
foi usada no Cray-2. Como outra alternativa, poderamos desenvolver o loop exterior para criar vrias instncias
da seqncia vetorial, empregando diferentes conjuntos de registradores (supondo-se registradores em quanti-
dade suficiente), da mesma maneira que fizemos no Captulo 4. Permitindo a mxima sobreposio dos com-
boios e o overhead de loop escalar, os overheads de inicializao e de loop s sero vistos uma vez por seqncia
vetorial, independente do nmero de comboios e das instrues em cada comboio. Desse modo, um processa-
dor com registradores vetoriais pode ter ao mesmo tempo baixo overhead de inicializao para vetores curtos e
desempenho de pico elevado para vetores muito longos.

EXEMPLO Quais seriam os valores de R4 e T66 para DAXPY no VMIPS, se acrescentssemos mais dois pipelines de mem-
ria e permitssemos que os overheads de minerao na superfcie e de inicializao ficassem completamente so-
brepostos?

Operaes por iterao Clock-rate


Resposta R = lim
n Ciclos de clock por iterao

T
lim (Ciclos de clock por iterao) = lim n
n n n

Considerando-se que o overhead s visto uma vez, Tn = n + 49 + 15 = n + 64. Desse modo:

T n + 64
lim n = lim =1
n n n n

2 500 MHz
R = = 1.000 MFLOPS
1
A incluso dos pipelines de memria extras e de uma lgica de emisso mais flexvel resulta em uma melho-
ria no desempenho de pico de 4 vezes. Porm, T66 = 130; assim, para vetores mais curtos, a melhoria de desem-
penho sustentado aproximadamente 326/130 = 2,5 vezes.

Em resumo, examinamos vrias medidas de desempenho vetorial. O desempenho de pico terico pode ser
calculado unicamente com base no valor de Tchime, como:

Nmero de FLOPS por iterao Clock-rate


Tchime
G.7 Falcias e armadilhas 109

Incluindo o overhead de loop, podemos calcular valores para desempenho de pico referente a um vetor de compri-
mento infinito (R4) e tambm para desempenho sustentado, Rn para um vetor de comprimento n, calculado como:
Nmero de FLOPS por iterao n Clock-rate
Rn =
Tn
Usando essas medidas, tambm podemos encontrar N1/2 e Nv, o que nos proporciona outro modo de ver o
overhead de inicializao para vetores e a relao entre a velocidade vetorial e a velocidade escalar. Diversas
medidas de desempenho de processadores vetoriais so teis para se entender o intervalo de desempenho que
as aplicaes podem ver em um processador vetorial.

G.7 Falcias e armadilhas


Armadilha Concentrar-se no desempenho de pico e ignorar o overhead de inicializao.
Os primeiros processadores vetoriais de memria-memria como o TI ASC e o CDC STAR-100 tinham lon-
gos tempos de inicializao. Por alguns problemas vetoriais, Nv podia ser maior que 100! No CYBER 205, deri-
vado do STAR-100, o overhead de inicializao para DAXPY 158 ciclos de clock, aumentando substancial-
mente o ponto de equilbrio. Com uma nica unidade vetorial, contendo dois pipelines de memria, o CYBER
205 pode sustentar uma taxa de 2 clocks por iterao. O tempo para DAXPY correspondente a um vetor de
comprimento n ento aproximadamente igual a 158 + 2n. Se as velocidades do clock do Cray-1 e do CYBER
205 fossem idnticas, o Cray-1 seria mais rpido at n > 64. Como o clock do Cray-1 tambm mais rpido
(embora o 205 seja mais recente), o ponto de crossover est acima de 100. Comparando-se um CYBER 205 com
quatro pistas (o processador de tamanho mximo) com o Cray X-MP que foi lanado pouco depois do 205, o
205 tem uma taxa de pico de dois resultados por ciclo de clock o dobro da velocidade do X-MP. Entretanto, os
vetores devem ter um comprimento maior que aproximadamente 200 para o CYBER 205 ser mais rpido. O
problema do overhead de inicializao uma dificuldade importante para as arquiteturas vetoriais de mem-
ria-memria, da sua falta de popularidade.

Armadilha Aumentar o desempenho vetorial sem aumentos comparveis no desempenho escalar.


Esse era um problema em muitos processadores vetoriais antigos, e foi o lugar em que Seymour Cray rees-
creveu as regras. Muitos dos primeiros processadores vetoriais tinham unidades escalares comparativamente
lentas (como tambm grandes overheads de inicializao). Mesmo hoje, processadores com desempenho veto-
rial de pico mais alto podem ser superados por um processador com desempenho vetorial mais baixo, mas com
melhor desempenho escalar. O bom desempenho escalar mantm baixos dos custos de overhead (por exemplo,
a minerao na superfcie) e reduz o impacto da Lei de Amdahl. Um bom exemplo desse fato vem da compara-
o de um processador escalar rpido e um processador vetorial com desempenho escalar mais baixo. Os n-
cleos FORTRAN do Livermore formam uma coleo de 24 ncleos cientficos com graus variados de vetoriza-
o. A Figura G.17 mostra o desempenho de dois processadores diferentes nesse benchmark. Apesar do desem-
penho de pico mais alto do processador vetorial, seu baixo desempenho escalar o torna mais lento que um pro-
cessador escalar rpido, medido pela mdia harmnica. A prxima falcia est intimamente relacionada a esta.

Falcia possvel obter desempenho vetorial sem oferecer largura de banda de memria.

Como vimos com o loop de DAXPY, a largura de banda de memria bastante importante. O DAXPY exige
1,5 referncia de memria por operao de ponto flutuante, e essa relao tpica de muitos cdigos cientfi-
cos. Ainda que as operaes de ponto flutuante no demorassem tempo algum, um Cray-1 no poderia aumen-
tar o desempenho da seqncia vetorial usada, pois ele limitado pela memria. O desempenho do Cray-1 no
Linpack teve um salto quando o compilador utilizou transformaes inteligentes para alterar a computao de
forma que os valores pudessem ser mantidos nos registradores vetoriais. Isso diminuiu o nmero de referncias
de memria por FLOP e melhorou o desempenho por um fator quase igual a 2! Desse modo, a largura de banda de
memria no Cray-1 se tornou suficiente para um loop que inicialmente exigia mais largura de banda. Essa habi-
lidade para reutilizar valores de registradores vetoriais outra vantagem das arquiteturas de registrador veto-
rial, em comparao com as arquiteturas vetoriais de memria-memria, que tm de buscar todos os operandos
vetoriais na memria, exigindo uma largura de banda de memria ainda maior.
110 Apndice G Processadores vetoriais

Taxa mnima para Taxa mxima para Mdia harmnica de todos


Processador qualquer loop (MFLOPS) qualquer loop (MFLOPS) os 24 loops (MFLOPS)

MIPS M/120-5 0,80 3,89 1,85


Stardent-1500 0,41 10,08 1,72
Figura G.17 Medidas de desempenho para os ncleos de FORTRAN do Livermore em dois processadores diferentes.
Tanto o MIPS M/120-5 quanto o Stardent-1500 (antigamente denominado Ardent Titan-1) utilizam um chip MIPS R2000 de
16,7 MHz como CPU principal. O Stardent-1500 usa sua unidade vetorial para FP escalar e tem cerca de metade do desempenho
escalar (medido pela taxa mnima) do MIPS M/120, que utiliza o chip de FP MIPS R2010. O processador vetorial tem velocidade
mais de 2,5 vezes maior para um loop altamente vetorizvel (taxa mxima). Porm, o desempenho escalar mais baixo do Star-
dent-1500 nega o desempenho vetorial mais alto quando o desempenho total medido pela mdia harmnica em todos os 24
loops.

G.8 Comentrios finais


Durante as dcadas de 1980 e 1990, rpidos aumentos de desempenho em processadores escalares com pipeli-
ne levaram a uma drstica reduo do abismo entre os supercomputadores vetoriais tradicionais e os rpidos
microprocessadores VLSI superescalares com pipelines. Em 2002, era possvel comprar um sistema completo
de computador de desktop por menos de mil dlares, com um clock-rate da CPU mais alta que qualquer super-
computador vetorial disponvel, mesmo aqueles que custam dezenas de milhes de dlares. Embora os super-
computadores vetoriais tenham velocidades do clock mais baixas, eles admitem maior paralelismo atravs do
uso de vrias pistas (at 16, nos projetos japoneses) em comparao com a emisso mltipla limitada dos mi-
croprocessadores superescalares. No obstante, o desempenho de pico de ponto flutuante dos microprocessa-
dores de baixo custo est dentro da faixa de 4 vezes o das CPUs de supercomputadores vetoriais mais importan-
tes. claro que altas velocidades do clock e desempenho de pico elevado no se traduzem necessariamente em
desempenho sustentado de aplicao. A largura de banda de memria principal a caracterstica-chave para
distinguir entre supercomputadores vetoriais e sistemas de microprocessadores superescalares. Os micropro-
cessadores mais rpidos em 2002 podem sustentar cerca de 1 GB/s de largura de banda de memria principal,
enquanto os supercomputadores vetoriais mais rpidos podem sustentar aproximadamente 50 GB/s por CPU.
Para acessos espaados no-unitrios, a discrepncia de largura de banda ainda maior. Para certas aplicaes
cientficas e de engenharia, o desempenho se correlaciona de modo diferente com a unitria largura de banda
da memria principal espaada no-unitria, e essas so as aplicaes para as quais os supercomputadores ve-
toriais continuam a ser populares.
Fornecer essa grande largura de banda de memria espaada no-unitria um dos principais custos em um
supercomputador vetorial e, tradicionalmente, a SRAM foi usada como memria principal para reduzir o n-
mero de bancos de memria necessrios e para diminuir as penalidades de inicializao vetorial. Embora a
SRAM tenha um tempo de acesso vrias vezes menor que o da DRAM, ela custa aproximadamente 10 vezes
mais por bit! Para reduzir os custos de memria principal e permitir capacidades maiores, todos os supercom-
putadores vetoriais modernos utilizam agora a DRAM como memria principal, tirando proveito de novas in-
terfaces de DRAM com largura de banda mais alta, como a DRAM sncrona.
Essa adoo da DRAM como memria principal (iniciada por Seymour Cray no Cray-2) um exemplo de
como supercomputadores vetoriais esto adaptando a tecnologia de mercado para melhorar sua relao pre-
o-desempenho. Outro exemplo que os supercomputadores vetoriais agora esto incluindo caches de dados
vetoriais. Porm, as caches no so eficazes para todos os cdigos vetoriais, e assim essas caches vetoriais so
projetadas para permitir alta largura de banda de memria principal, at mesmo na presena de muitos erros de
cache. Por exemplo, o cache no Cray SV1 pode aceitar 384 erros de cache pendentes por CPU, enquanto para
microprocessadores, de 8 a 16 erros pendentes um nmero mximo mais caracterstico.
Outro exemplo o fim do ECL bipolar ou do arseneto de glio como tecnologias preferidas para lgica da
CPU de supercomputadores. Devido ao enorme investimento na tecnologia de CMOS que se tornou possvel
graas ao sucesso do computador de desktop, agora o CMOS oferece desempenho de transistores competitivo
com maior densidade de transistores e dissipao de potncia muito reduzida, em comparao com essas tec-
nologias mais exticas. Como resultado, todos os supercomputadores vetoriais importantes agora so constru-
dos com a mesma tecnologia de CMOS dos microprocessadores superescalares. A principal razo para que os
supercomputadores vetoriais de hoje tenham velocidades do clock mais baixas que os microprocessadores co-
G.9 Perspectiva histrica e referncias 111

merciais o fato de eles serem desenvolvidos com o uso de tcnicas ASIC de clula padro, em vez de projeto de
circuitos personalizados completos para reduzir o custo do projeto de engenharia. Enquanto um projeto de mi-
croprocessador pode vender dezenas de milhes de cpias e amortizar o custo do projeto nesse grande nmero
de unidades, um supercomputador vetorial considerado um sucesso se so vendidas mais de cem unidades!
Reciprocamente, os projetos de microprocessadores superescalares comearam a absorver algumas das tc-
nicas que se tornaram populares em sistemas de computadores vetoriais mais antigos. Muitas aplicaes de
multimdia contm cdigo que pode ser vetorizado e, como vimos no Captulo 2, a maioria dos ISAs de micro-
processadores comerciais tem extenses de multimdia que se assemelham a instrues vetoriais curtas. Uma
tcnica comum permitir que um registrador de 64 bits largo seja dividido em subpalavras menores operadas
em paralelo. Essa idia foi usada nas antigas mquinas vetoriais TI ASC e CDC STAR-100, em que uma pista de
64 bits podia ser dividida em duas pistas de 32 bits para fornecer desempenho mais alto sobre dados de preciso
mais baixa. Embora as extenses de multimdia de microprocessadores iniciais tivessem escopo muito limita-
do, extenses mais novas como a AltiVec para o IBM/Motorola PowerPC e SSE2 para os processadores Intel x86
aumentaram o comprimento de vetor para 128 bits (ainda pequeno comparado com os 4.096 bits em um regis-
trador vetorial do VMIPS) e acrescentaram melhor suporte para compiladores vetoriais. As instrues vetoriais
so particularmente atraentes no caso de processadores embutidos, porque admitem graus elevados de parale-
lismo a baixo custo e com baixa dissipao de potncia, e foram usadas em vrias mquinas de jogos como o
Nintendo-64 e o Sony PlayStation 2 para impulsionar o desempenho de grficos. Esperamos que os micropro-
cessadores continuem a estender seu suporte para operaes vetoriais, pois isso representa uma abordagem
muito mais simples para impulsionar o desempenho no caso de uma classe importante de aplicaes, em com-
parao com a complexidade de hardware de se aumentar a largura de emisso de instrues escalares ou com a
complexidade de software de administrar vrios processadores paralelos.

G.9 Perspectiva histrica e referncias


Os primeiros processadores vetoriais foram o CDC STAR-100 (veja Hintz e Tate [1972]) e o TI ASC (veja Wat-
son [1972]), ambos anunciados em 1972. Os dois tinham processadores vetoriais de memria-memria. Eles
apresentavam unidades escalares relativamente lentas o STAR usava as mesmas unidades para escalares e ve-
tores tornando o pipeline escalar extremamente profundo. Ambos os processadores tinham overhead de ini-
cializao elevado e funcionavam sobre vetores de vrias centenas a vrios milhares de elementos. O crossover
entre escalar e vetorial podia estar acima de 50 elementos. Aparentemente, no foi dada ateno suficiente ao
papel da Lei de Amdahl nesses dois processadores.
Cray, que trabalhou no 6600 e no 7600 na CDC, fundou a Cray Research e apresentou o Cray-1 em 1976
(veja Russell [1978]). O Cray-1 utilizava uma arquitetura de registrador vetorial para diminuir significativa-
mente o overhead de inicializao e reduzir requisitos de largura de banda de memria. Ele tambm tinha su-
porte eficiente para espaamento no-unitrio e criou o encadeamento. Mais importante ainda, o Cray-1 era o
processador escalar mais rpido do mundo naquela poca. Essa comparao de bom desempenho escalar e ve-
torial talvez tenha sido o fator mais significativo para fazer do Cray-1 um sucesso. Alguns clientes adquiriram o
processador principalmente por seu excelente desempenho escalar. Muitos processadores vetoriais subseqen-
tes se basearam na arquitetura desse primeiro processador vetorial bem-sucedido comercialmente. Baskett e
Keller [1977] fornecem uma boa avaliao do Cray-1.
Em 1981, a CDC comeou a comercializar o CYBER 205 (veja Lincoln [1982]). O 205 tinha a mesma arqui-
tetura bsica do STAR, mas oferecia melhor desempenho geral, como tambm maior expansibilidade da unida-
de vetorial com at quatro pistas, cada uma com vrias unidades funcionais e um largo tubo de car-
ga-armazenamento, que forneciam vrias palavras por clock. O desempenho de pico do CYBER 205 excedeu
em muito o desempenho do Cray-1. Porm, em programas reais, a diferena de desempenho era muito menor.
O processador STAR da CDC e seu descendente, o CYBER 205, eram processadores vetoriais de mem-
ria-memria. Para manter o hardware simples e oferecer suporte para os requisitos elevados de largura de ban-
da (at trs referncias de memria por operao de ponto flutuante), esses processadores no tratavam de for-
ma eficiente o espaamento no-unitrio. Enquanto a maioria dos loops tinha espaamento unitrio, um loop
com espaamento no-unitrio apresentava fraco desempenho nesses processadores, porque a movimentao
de dados de memria para memria era necessria para reunir (e transmitir de volta) os elementos no-adja-
centes de vetores; essas operaes utilizavam instrues especiais de disperso-acumulao. Alm disso, havia
112 Apndice G Processadores vetoriais

suporte especial para vetores esparsos, que empregavam um vetor de bits para representar os zeros e valores di-
ferentes de zero, e ainda um vetor denso de valores no-nulos. Essas operaes vetoriais mais complexas eram
lentas em virtude da longa latncia de memria, e freqentemente era mais rpido utilizar o modo escalar em
operaes esparsas ou com espaamento no-unitrio. Schneck [1987] descreveu vrios dos primeiros proces-
sadores com pipelines (por exemplo, o Stretch), passando pelos primeiros processadores vetoriais, inclusive o
205 e o Cray-1. Dongarra [1986] fez outra boa pesquisa, concentrando-se em processadores mais recentes.
Em 1983, a Cray Research comercializou o primeiro Cray X-MP (veja Chen [1983]). Com um clock-rate
otimizado (9,5 ns versus 12,5 ns no Cray-1), melhor suporte para encadeamento e vrios pipelines de memria,
esse processador manteve a Cray Research na liderana em supercomputadores. O Cray-2, um projeto comple-
tamente novo configurvel com at quatro processadores, foi introduzido mais tarde. Uma caracterstica im-
portante do Cray-2 era o uso de DRAM, o que tornava possvel ter memrias muito extensas. O primeiro
Cray-2 com sua memria de 256M palavras (palavras de 64 bits) continha mais memria que a totalidade das
mquinas Cray comercializadas at aquele momento! O Cray-2 tinha um clock muito mais rpido que o do
X-MP, mas tambm pipelines muito mais profundos; porm, ele no apresentava encadeamento, tinha uma
enorme latncia de memria e apenas um tubo de memria por processador. Em geral, o Cray-2 s mais rpi-
do que o Cray X-MP em problemas que exigem sua extensa memria principal.
A dcada de 1980 tambm viu a chegada de processadores vetoriais de menor escala, chamados supermini-
computadores. Avaliados em aproximadamente um dcimo do custo de um supercomputador (de 0,5 a 1 mi-
lho de dlares em comparao com 5 a 10 milhes de dlares), esses processadores dominaram o mercado ra-
pidamente. Embora muitas empresas tenham chegado ao mercado, as duas empresas mais bem-sucedidas fo-
ram a Convex e a Alliant. A Convex comeou com o processador vetorial de monoprocessador C-1 e depois
ofereceu uma srie de pequenos multiprocessadores, terminando com o C-4, anunciado em 1994. As chaves
para o sucesso da Convex durante desse perodo foram sua nfase na capacidade de software Cray, na eficincia
de seu compilador (veja a Figura G.15) e na qualidade de sua implementao do SO UNIX. O C-4 foi a ltima
mquina vetorial vendida pela Convex; a empresa passou a criar multiprocessadores de grande escala usando
microprocessadores RISC da Hewlett Packard e foi comprada pela HP em 1995. A Alliant [1987] se concentrou
mais nos aspectos de multiprocessador; a empresa construiu um computador de oito processadores, com cada
processador oferecendo capacidade vetorial. A Alliant encerrou suas operaes no incio da dcada de 1990.
No incio da dcada de 1980, a CDC reuniu um grupo, chamado ETA, para construir um novo supercompu-
tador, o ETA-10, capaz de 10 GFLOPS. O processador ETA foi lanado no final da dcada de 1980 (veja Fazio
[1987]) e usava CMOS de baixa temperatura em uma configurao com at 10 processadores. Cada processa-
dor preservava a arquitetura de memria-memria baseada no CYBER 205. Embora o ETA-10 alcanasse enor-
me desempenho de pico, sua velocidade escalar no era comparvel. Em 1989, a CDC, o primeiro fornecedor
de supercomputadores, fechou a ETA e abandonou os negcios de projeto de supercomputadores.
Em 1986, a IBM introduziu a arquitetura vetorial System/370 (veja Moore et al. [1987]) e sua primeira im-
plementao no 3090 Vector Facility. Essa arquitetura estende a arquitetura System/370 com 171 instrues
vetoriais. O 3090/VF integrado na CPU 3090. Diferente da maioria dos outros processadores vetoriais, o
3090/VF efetua o roteamento dos seus vetores atravs da cache.
Em 1983, os fornecedores de processadores japoneses entraram no mercado de supercomputadores, come-
ando com os Fujitsu VP100 e VP200 (veja Miura e Uchida [1983]) e mais tarde se expandiram para incluir o
Hitachi S810 e o NEC SX/2 (veja Watanabe [1987]). Esses processadores provaram estar prximos do Cray
X-MP em desempenho. Em geral, esses trs processadores tm desempenho de pico muito mais alto que o
Cray X-MP. Porm, devido ao grande overhead de inicializao, seu desempenho tpico freqentemente mais
baixo que o do Cray X-MP (veja a Figura 1.32 no Captulo 1). O Cray X-MP favorecia uma abordagem de vrios
processadores, oferecendo primeiro uma verso de dois processadores e mais tarde uma de quatro processado-
res. Em contraste, os trs processadores japoneses tinham recursos vetoriais expansveis.
Em 1988, a Cray Research introduziu o Cray Y-MP uma verso maior e mais rpida do X-MP. O Y-MP per-
mite at oito processadores e reduz o tempo do ciclo para 6 ns. Com um total de oito processadores, o Y-MP ge-
ralmente era o supercomputador mais rpido, embora os supercomputadores japoneses de processador nico
possam ser mais rpidos que um Y-MP de um processador. No final de 1989, a Cray Research se desmembrou
em duas empresas, ambas destinadas a criar processadores de ponta, disponveis no incio da dcada de 1990.
Seymour Cray encabeou a subsidiria, Cray Computer Corporation, at seu fim em 1995. O processador inicial
da empresa, o Cray-3, deveria ser implementado em arseneto de glio, mas no foi possvel desenvolver uma
G.9 Perspectiva histrica e referncias 113

tecnologia de implementao confivel e de baixo custo. Um nico prottipo do Cray-3 foi entregue ao Natio-
nal Center for Atmospheric Research (NCAR) para fins de avaliao em 1993, mas no foram encontrados cli-
entes para financiar o projeto. O prottipo do Cray-4, que deveria ser o primeiro processador a funcionar em 1
GHz, estava prximo da concluso quando a empresa foi falncia. Pouco antes de sua morte trgica em um
acidente de automvel em 1996, Seymour Cray iniciou outra empresa, a SRC Computers, para desenvolver sis-
temas de alto desempenho, mas dessa vez usando componentes comerciais. Em 2000, a SRC anunciou o siste-
ma SRC-6, que combina 512 microprocessadores intel, 5 bilhes de portas de lgica reconfigurvel e um siste-
ma de memria de alto desempenho no estilo vetorial.
A Cray Research se concentrou no C90, um novo processador de alta tecnologia com at 16 processadores e
um clock-rate de 240 MHz. Esse processador foi lanado em 1991. As configuraes tpicas custam cerca de 15
milhes de dlares. Em 1993, a Cray Research apresentou seu primeiro processador altamente paralelo, o T3D,
empregando at 2.048 microprocessadores Digital Alpha 21064. Em 1995, a empresa anunciou a disponibili-
dade de uma nova mquina vetorial de nvel de entrada, o J90, e de uma mquina de ponta, o T90. O T90 mui-
to semelhante ao C90, mas oferece um clock duas vezes mais rpido (460 MHz), usando invlucro tridimensio-
nal e distribuio de clock ptico. Como o C90, o T90 custa dezenas de milhes de dlares, embora uma nica
CPU esteja disponvel por 2,5 milhes de dlares. O T90 foi a primeira mquina vetorial ECL bipolar constru-
da pela Cray. O J90 um mquina vetorial baseada em CMOS que utiliza memria DRAM, com preo inicial de
250.000 dlares, mas com configuraes tpicas custando aproximadamente 1 milho de dlares. Na metade
de 1995, a Cray Research foi adquirida pela Silicon Graphics e, em 1998, lanou o sistema SV1, que incluiu pro-
cessadores CMOS consideravelmente mais rpidos no sistema de memria do J90, e tambm acrescentou uma
cache de dados para vetores a cada CPU, a fim de ajudar a atender maior demanda de largura de banda de me-
mria. A Silicon Graphics vendeu a Cray Research Tera Computer em 2000, e o grupo passou a se chamar
Cray Inc. A Cray Inc. planejava lanar o SV2 em 2002; esse produto se baseia em uma ISA vetorial completa-
mente nova.
Os fabricantes de supercomputador japoneses continuaram a desenvolver seus projetos e em geral deram
maior nfase ao aumento do nmero de pistas em suas unidades vetoriais. Em 2001, o NEC SX/5 era geralmen-
te considerado o supercomputador vetorial mais rpido disponvel, com 16 pistas sincronizadas em 312 MHz e
com at 16 processadores compartilhando a mesma memria. O Fujitsu VPP5000 foi anunciado em 2001 e
tambm tinha 16 pistas e um clock de 300 MHz, mas conectava at 128 processadores em um cluster de mem-
ria distribuda. Em 2001, a Cray Inc. anunciou que passaria a comercializar a mquina NEC SX/5 nos Estados
Unidos, aps muitos anos sem que os supercomputadores japoneses fossem vendidos para os clientes dos Esta-
dos Unidos, depois que o U.S. Commerce Department acusou a NEC e a Fujitsu de praticar preos abaixo do
custo em um contrato do supercomputador NCAR de 1996 e imps pesadas taxas de importao aos produtos
dessas empresas.
A base para a moderna tecnologia de compiladores de vetorizao e a noo de dependncia de dados foi de-
senvolvida por Kuck e seu colegas [1974] na University of Illinois. Banerjee [1979] desenvolveu o teste que levou
seu nome. Padua e Wolfe [1986] apresentam uma boa avaliao da tecnologia de compiladores de vetorizao.
Estudos de benchmark de diversos supercomputadores, incluindo tentativas de compreender as diferenas
de desempenho, foram empreendidas por Lubeck, Moore e Mendez [1985], Bucher [1983] e Jordan [1987].
No Captulo 1, discutimos vrios conjuntos de benchmarks para uso cientfico e empregados com freqncia
para o benchmark de supercomputadores, incluindo o Linpack e os ncleos FORTRAN da Lawrence Livermo-
re Laboratories. A University of Illinois coordenou a reunio de um conjunto de benchmarks para supercom-
putadores, chamado Perfect Club. Em 1993, o Perfect Club foi integrado SPEC, que lanou um conjunto de
benchmarks, o SPEChpc96, destinado ao processamento cientfico de ponta, em 1996. Os benchmarks parale-
los NAS, desenvolvidos no Ames Research Center da NASA [Bailey et al. 1991] se transformaram em um con-
junto popular de ncleos e aplicaes, usado na avaliao de supercomputadores.
Em menos de 30 anos, os processadores vetoriais passaram da condio de novas arquiteturas no-testadas
para desempenhar um papel significativo no objetivo de fornecer a engenheiros e cientistas quantidades ainda
maiores de capacidade de computao. Entretanto, as enormes vantagens de preo-desempenho da tecnologia
de microprocessadores esto levando essa era ao fim. Microprocessadores superescalares avanados esto se
aproximando do desempenho de pico dos processadores vetoriais mais rpidos e, em 2001, a maioria das m-
quinas de desempenho mais elevado do mundo eram multiprocessadores em grande escala baseados nesses mi-
croprocessadores. Os supercomputadores vetoriais permanecem populares para certas aplicaes, inclusive si-
114 Apndice G Processadores vetoriais

mulao de desastres de automveis e previso do tempo, que se baseiam intensamente no desempenho de dis-
perso-acumulao sobre grandes conjuntos de dados, e para as quais ainda tm de ser escritos programas ma-
ciamente paralelos eficientes. Com o passar do tempo, esperamos que os microprocessadores admitam siste-
mas de memria com largura de banda mais alta, e que mais aplicaes sejam colocadas em paralelo e/ou ajus-
tadas para sistemas de multiprocessadores com caches. medida que o conjunto de aplicaes mais apropria-
das para supercomputadores vetoriais se reduzir, eles se tornaro menos viveis como produtos comerciais e
eventualmente desaparecero. Porm, as tcnicas de processamento vetorial talvez sobrevivam como uma par-
te integral de futuras arquiteturas de microprocessadores, com as extenses de multimdia SIMD, populares
atualmente, representando o primeiro passo nessa direo.

Referncias
Alliant Computer Systems Corp. [1987]. Alliant FX/Series: Product Summary (junho), Acton, Mass.
Asanovic, K. [1998]. Vector microprocessors, tese de doutorado, Computer Science Division, Univ. of California
at Berkeley (maio).
Bailey, D. H., E. Barszcz, J. T. Barton, D. S. Browning, R. L. Carter, L. Dagum, R. A. Fatoohi, P. O. Frederickson, T. A.
Lasinski, R. S. Schreiber, H. D. Simon, V. Ven-katakrishnan e S. K. Weeratunga [1991]. The NAS parallel ben-
chmarks, Intl. J. Supercomputing Applications 5, 6373.
Banerjee, U. [1979]. Speedup of ordinary programs, tese de doutorado, Dept. of Computer Science, Univ. of Illino-
is at Urbana-Champaign (outubro).
Baskett, F. e T. W. Keller [1977]. An Evaluation of the Cray-1 Processor, em High Speed Computer and Algorithm
Organization, D. J. Kuck, D. H. Lawrie e A. H. Sameh, editores, Academic Press, San Diego, 7184.
Brandt, M., J. Brooks, M. Cahir, T. Hewitt, E. Lopez-Pineda e D. Sandness [2000]. The Benchmarkers Guide for Cray
SV1 Systems. Cray Inc., Seattle, Wash.
Bucher, I. Y. [1983]. The computational speed of supercomputers, Proc. SIGMETRICS Conf. on Measuring and Mo-
deling of Computer Systems, ACM (agosto), 151165.
Callahan, D., J. Dongarra e D. Levine [1988]. Vectorizing compilers: A test suite and results, Supercomputing '88,
ACM/IEEE (novembro), Orlando, Fla., 98105.
Chen, S. [1983]. Large-scale and high-speed multiprocessor system for scientific applications, Proc. NATO Advan-
ced Research Work on High Speed Computing (junho); tambm em K. Hwang, editor, Superprocessors: Design and
applications, IEEE (agosto), 1984.
Dongarra, J. J. [1986]. A survey of high performance processors, COMPCON, IEEE (maro), 811.
Fazio, D. [1987]. Its really much more fun building a supercomputer than it is simply inventing one, COMPCON,
IEEE (fevereiro), 102105.
Flynn, M. J. [1966]. Very high-speed computing systems, Proc. IEEE 54:12 (dezembro), 19011909.
Hintz, R. G. e D. P. Tate [1972]. Control data STAR-100 processor design, COMP-CON, IEEE (setembro), 14.
Jordan, K. E. [1987]. Performance comparison of large-scale scientific processors: Scalar mainframes, mainframes
with vector facilities, and supercomputers, Computer 20:3 (maro), 1023.
Kuck, D., P. P. Budnik, S.-C. Chen, D. H. Lawrie, R. A. Towle, R. E. Strebendt, E. W. Davis, Jr., J. Han, P. W. Kraska e
Y. Muraoka [1974]. Measurements of parallelism in ordinary FORTRAN programs, Computer 7:1 (janeiro),
3746.
Lincoln, N. R. [1982]. Technology and design trade offs in the creation of a modern supercomputer, IEEE Trans.
on Computers C-31:5 (maio), 363376.
Lubeck, O., J. Moore e R. Mendez [1985]. A benchmark comparison of three super-computers: Fujitsu VP-200, Hi-
tachi S810/20, and Cray X-MP/2, Computer 18:1 (janeiro), 1029.
Miranker, G. S., J. Rubenstein e J. Sanguinetti [1988]. Squeezing a Cray-class supercomputer into a single-user pac-
kage, COMPCON, IEEE (maro), 452456.
Miura, K. e K. Uchida [1983]. FACOM vector processing system: VP100/200, Proc. NATO Advanced Research Work
on High Speed Computing (junho); tambm em K. Hwang, editor, Superprocessors: Design and applications,
IEEE (agosto de 1984), 5973.
Moore, B., A. Padegs, R. Smith e W. Bucholz [1987]. Concepts of the System/370 vector architecture, Proc. 14th
Symposium on Computer Architecture (junho), ACM/IEEE, Pittsburgh, 282292.
Padua, D. e M. Wolfe [1986]. Advanced compiler optimizations for supercomputers, Comm. ACM 29:12 (dezem-
bro), 11841201.
Exerccios 115

Russell, R. M. [1978]. The Cray-1 processor system, Comm. of the ACM 21:1 (janeiro), 6372.
Schneck, P. B. [1987]. Superprocessor Architecture, Kluwer Academic Publishers, Norwell, Mass.
Smith, B. J. [1981]. Architecture and applications of the HEP multiprocessor system, Real-Time Signal Processing
IV 298 (agosto), 241248.
Sporer, M., F. H. Moss e C. J. Mathais [1988]. An introduction to the architecture of the Stellar Graphics supercom-
puter, COMPCON, IEEE (maro), 464.
Vajapeyam, S. [1991]. Instruction-level characterization of the Cray Y-MP processor, tese de doutorado, Compu-
ter Sciences Department, University of Wisconsin-Madison.
Watanabe, T. [1987]. Architecture and performance of the NEC supercomputer SX system, Parallel Computing 5,
247255.
Watson, W. J. [1972]. The TI ASC a highly modular and flexible super processor architecture, Proc. AFIPS Fall
Joint Computer Conf., 221228.

Exerccios
Nestes exerccios, suponha que o VMIPS tenha um clock-rate de 500 MHz e que Tloop = 15. Use os tempos de iniciali-
zao da Figura G.4 e suponha que a latncia de armazenamento esteja sempre includa no tempo de execuo.
G.1 [10] <G.1, G.2> Escreva uma seqncia vetorial do VMIPS que alcance o desempenho de pico de MFLOPS do proces-
sador (utilize a descrio de unidade funcional e de instrues da Seo G.2). Supondo um clock-rate de 500 MHz,
qual o MFLOPS de pico?
G.2 [20/15/15] <G.1G.6> Considere o cdigo vetorial a seguir, executado em uma verso de 500 MHz do VMIPS para
um comprimento de vetor fixo igual a 64:

LV V1,Ra
MULV.D V2,V1,V3
ADDV.D V4,V1,V3
SV Rb,V2
SV Rc,V4

Ignore todo o overhead de minerao na superfcie, mas suponha que a latncia de armazenamento tenha de ser
includa no tempo de execuo do loop. A seqncia inteira produz 64 resultados.
a. [20] <G.1G.4> Supondo nenhum encadeamento e um nico pipeline de memria, quantos chimes so necess-
rios? Quantos ciclos de clock por resultado (incluindo ambos os armazenamentos como um nico resultado) essa
seqncia vetorial exige, incluindo o overhead de inicializao?
b. [15] <G.1G.4> Se a seqncia vetorial for encadeada, quantos ciclos de clock por resultado essa seqncia exigi-
r, incluindo o overhead?
c. [15] <G.1G.6> Suponha que o VMIPS tivesse trs pipelines de memria e encadeamento. Se no houvesse ne-
nhum conflito de bancos nos acessos para o loop anterior, quantos ciclos de clock sero necessrios por resultado
para essa seqncia?
G.3 [20/20/15/15/20/20/20] <G.2G.6> Considere o seguinte cdigo FORTRAN:

do 10 i=1,n
A(i) + B(i)
B(i) = x * B(i)
10 continue

Utilize as tcnicas da Seo G.6 para avaliar o desempenho em todo este exerccio, supondo uma verso de 500
MHz do VMIPS.
a. [20] <G.2G.6> Escreva o melhor cdigo vetorial do VMIPS para a poro interna do loop. Suponha que x esteja
em F0 e que os endereos de A e B estejam em Ra e Rb, respectivamente.
b. [20] <G.2G.6> Encontre o tempo total para esse loop em VMIPS (T100). Qual a classificao de MFLOPS para o
loop (R100)?
c. [15] <G.2G.6> Encontre R4 para esse loop.
116 Apndice G Processadores vetoriais

d. [15] <G.2G.6> Encontre N1/2 para esse loop.


E. [20] <G.2G.6> Encontre Nv para esse loop. Suponha que o cdigo escalar tenha programado a execuo com pi-
peline de tal forma que cada referncia de memria demore seis ciclos e cada operao de FP ocupe trs ciclos. Su-
ponha que o overhead escalar tambm seja Tloop.
f. [20] <G.2G.6> Suponha que o VMIPS tenha dois pipelines de memria. Escreva cdigo vetorial que tire proveito
do segundo pipeline de memria. Mostre o layout em comboios.
g. [20] <G.2G.6> Calcule T100 e R100 para o VMIPS com dois pipelines de memria.
G.4 [20/10] <G.3> Suponha que temos uma verso de VMIPS com oito bancos de memria (cada um com a largura de
uma palavra dupla) e um tempo de acesso memria de oito ciclos.
a. [20] <G.3> Se um vetor de carga de comprimento 64 for executado com um espaamento igual 20 palavras du-
plas, quantos ciclos a carga levar para se completar?
b. [10] <G.3> Que porcentagem da largura de banda de memria voc conseguir em uma carga de 64 elementos em
espaamento 20 em comparao com o espaamento 1?
G.5 [12/12] <G.5G.6> Considere o loop a seguir:

C = 0.0
do 10 i=1,64
A(i) + B(i)
C = C + A(i)
10 continue

a. [12] <G.5G.6> Divida o loop em dois loops: um sem dependncia e um com uma dependncia. Escreva esses
loops em FORTRAN como uma transformao de origem para origem. Essa otimizao chamada fisso de loop.
b. [12] <G.5G.6> Escreva o cdigo vetorial do VMIPS para o loop sem uma dependncia.
G.6 [20/15/20/20] <G.5G.6> O desempenho de Linpack compilado do Cray-1 (projetado em 1976) foi quase duplicado
por um compilador melhor em 1989. Vamos examinar um exemplo simples de como isso poderia ocorrer. Considere
o loop semelhante ao de DAXPY (onde k um parmetro para o procedimento que contm o loop):

do 10 i=1,64
do 10 j=1,64
Y(k,j) = a*X(i,j) + Y(k,j)
10 continue

a. [20] <G.5G.6> Escreva a seqncia de cdigo direta apenas para o loop interno em instrues vetoriais do
VMIPS.
b. [15] <G.5G.6> Usando as tcnicas da Seo G.6, avalie o desempenho desse cdigo no VMIPS, encontrando T64
em ciclos de clock. Voc pode supor que h um overhead Tloop relativo a cada iterao do loop exterior. O que li-
mita o desempenho?
c. [20] <G.5G.6> Reescreva o cdigo VMIPS para reduzir a limitao de desempenho; mostre o loop interno resul-
tante em instrues vetoriais de VMIPS. (Sugesto: Imagine o que estabelece Tchime; voc pode afet-lo?) Descubra
o tempo total para a seqncia resultante.
d. [20] <G.5G.6> Avalie o desempenho de sua nova verso, usando as tcnicas da Seo G.6 e encontrando T64.
G.7 [15/15/25] <G.4> Considere o cdigo a seguir.

do 10 i=1,64
if (B(i) .ne. 0) then
A(i) / B(i)
10 continue

Suponha que os endereos de A e B estejam em Ra e Rb, respectivamente, e que F0 contm 0.


a. [15] <G.4> Escreva o cdigo VMIPS para esse loop, usando o recurso de mscara de vetor.
b. [15] <G.4> Escreva o cdigo VMIPS para esse loop, utilizando disperso-acumulao.
Exerccios 117

c. [25] <G.4> Avalie o desempenho (T100 em ciclos de clock) desses dois loops vetoriais, supondo uma latncia de
diviso de 20 ciclos. Suponha que todas as instrues vetoriais gerem um nico resultado por clock, independen-
te da configurao do registrador de mscara de vetor. Suponha que 50% das entradas de B sejam iguais a 0. Con-
siderando os custos de hardware, o que voc construiria se o loop anterior fosse tpico?
G.8 [15/20/15/15] <G.1G.6> Na seo intitulada Falcias e Armadilhas do Captulo 1, vimos que a diferena entre de-
sempenho de pico e desempenho sustentado podia ser grande: em um problema, um Hitachi S810 tinha uma veloci-
dade de pico duas vezes maior que a do Cray X-MP, enquanto para outro problema mais realista, o Cray X-MP tinha o
dobro da velocidade do processador Hitachi. Vamos examinar por que isso poderia ocorrer, utilizando duas verses
do VMIPS e as seqncias de cdigo a seguir:

C Seqncia de cdigo 1
do 10 i=1,10000
A(i) = x * A(i) + y * A(i)
10 continue
C Seqncia de cdigo 2
do 10 i=1,100
A(i) = x * A(i)
10 continue

Suponha que exista uma verso de VMIPS (chamada VMIPS-II) que tenha duas cpias de toda unidade funcional
de ponto flutuante com encadeamento completo entre elas. Suponha que tanto o VMIPS quanto o VMIPS-II tenham
duas unidades de carga-armazenamento. Devido s unidades funcionais extras e ao aumento da complexidade de
operaes de atribuio a unidades, todos os overheads (Tloop e Tincio) so duplicados.
a. [15] <G.1G.6> Descubra o nmero de ciclos de clock correspondente seqncia de cdigo 1 no VMIPS.
b. [20] <G.1G.6> Descubra o nmero de ciclos de clock sobre a seqncia de cdigo 1 para o VMIPS-II. Como isso
se compara ao VMIPS?
c. [15] <G.1G.6> Descubra o nmero de ciclos de clock sobre a seqncia de cdigo 2 para o VMIPS.
d. [15] <G.1G.6> Descubra o nmero de ciclos de clock sobre a seqncia de cdigo 2 para o VMIPS-II. Como isso
se compara ao VMIPS?
G.9 [20] <G.5> Aqui est um fragmento de cdigo complicado, com arrays bidimensionais. Esse loop tem dependncias?
Esses loops podem ser escritos de forma a serem paralelos? Nesse caso, como? Se possvel, reescreva o cdigo-fonte de
forma que fique claro que o loop pode ser vetorizado.

do 290 j = 2,n
do 290 i = 2,j
aa(i,j)= aa(i-1,j)*aa(i-1,j)+bb(i,j)
290 continue

G.10 [12/15] <G.5> Considere o loop a seguir:

do 10 i = 2,n
A(i) = B
10 C(i) = A(i-1)

a. [12] <G.5> Mostre que existe uma dependncia transportada por loop nesse fragmento de cdigo.
b. [15] <G.5> Reescreva o cdigo em FORTRAN de tal forma que ele possa ser vetorizado como duas seqncias ve-
toriais separadas.
G.11 [15/25/25] <G.5> Como vimos na Seo G.5, algumas estruturas de loops no so facilmente vetorizadas. Uma estru-
tura comum uma reduo um loop que reduz um array a um nico valor pela aplicao repetida de uma operao.
Esse um caso especial de uma recorrncia. Um exemplo comum ocorre no produto de ponto:

dot = 0.0
do 10 i=1,64
10 dot = dot + A(i) * B(i)
118 Apndice G Processadores vetoriais

Esse loop tem uma bvia dependncia transportada por loop (em dot) e no pode ser vetorizado de modo direto.
O primeiro passo para um bom compilador de vetorizao seria fazer a diviso do loop, a fim de separar a poro ve-
torizvel e a recorrncia, e talvez reescrever o loop como:

do 10 i=1,64
10 dot(i) = A(i) * B(i)
do 20 i=2,64
20 dot(1) = dot(1) + dot(i)

A varivel dot foi expandida em um vetor; essa transformao chamada expanso escalar. Podemos tentar vetori-
zar o segundo loop, seja confiando estritamente no compilador (parte (a)) ou com a incluso de suporte de hardware
(parte (b)). Existe uma importante advertncia sobre o uso de tcnicas vetoriais com a finalidade de efetuar a redu-
o. Para fazer a reduo funcionar, dependemos da associatividade do operador empregado para a reduo. Porm,
devido ao arredondamento e ao intervalo finito, a aritmtica de ponto flutuante no estritamente associativa. Por
essa razo, a maioria dos compiladores exige que o programador indique se a associatividade pode ser utilizada para
compilar redues de maneira mais eficiente.
a. [15] <G.5> Um esquema simples para compilar o loop com a recorrncia adicionar seqncias de vetores pro-
gressivamente menores dois vetores de 32 elementos, depois dois vetores de 16 elementos e assim por diante.
Essa tcnica foi chamada duplicao recursiva. Ela mais rpida do que efetuar todas as operaes em modo esca-
lar. Mostre como seria o cdigo FORTRAN para execuo do segundo loop no fragmento de cdigo precedente,
usando a duplicao recursiva.
b. [25] <G.5> Em alguns processadores vetoriais, os registradores vetoriais so endereveis, e os operandos para
uma operao vetorial podem ser duas partes diferentes do mesmo registrador vetorial. Isso permite outra solu-
o para a reduo, chamada somas parciais. A idia-chave nas somas parciais reduzir o vetor a m somas, onde m
a latncia total na unidade funcional vetorial, incluindo os tempos de leitura e gravao de operandos. Suponha
que os registradores vetoriais do VMIPS sejam endereveis (por exemplo, voc pode iniciar uma operao veto-
rial com o operando V1(16), indicando que o operando de entrada comeou com o elemento 16). Alm disso, su-
ponha que a latncia total para adies, incluindo leitura e gravao de operandos, seja de oito ciclos. Escreva
uma seqncia de cdigo VMIPS que reduza o contedo de V1 a oito somas parciais. Isso pode ser feito com uma
nica operao vetorial.
c. Discuta como a incluso da extenso da parte (b) afetaria uma mquina que tivesse vrias pistas.
G.12 [40] <G.2G.4> Estenda o simulador MIPS para transform-lo em um simulador VMIPS, incluindo a habilidade para
contar ciclos de clock. Escreva alguns programas curtos de benchmark em linguagem assembly do MIPS e do VMIPS.
Faa a medio da acelerao no VMIPS, da porcentagem de vetorizao e da utilizao das unidades funcionais.
G.13 [50] <G.5> Modifique o compilador MIPS para incluir um verificador de dependncias. Execute algum cdigo cient-
fico e loops atravs dele e faa a medio da porcentagem das instrues que poderia ser vetorizada.
G.14 [Discusso] Alguns proponentes de processadores vetoriais podem argumentar que os processadores vetoriais forne-
ceram o melhor caminho para quantidades cada vez maiores de potncia do processador, concentrando sua ateno
no reforo do desempenho vetorial de pico. Outros argumentariam que a nfase no desempenho de pico equivoca-
da, porque uma porcentagem crescente dos programas dominada pelo desempenho no-vetorial. (Voc se lembra
da Lei de Amdahl?) Os proponentes responderiam que os programadores devem trabalhar para tornar seus progra-
mas vetorizveis. O que voc pensa desse argumento?
G.15 [Discusso] Considere os pontos levantados na seo intitulada Comentrios finais (Seo G.8). Esse tpico as
vantagens relativas dos processadores escalares com pipeline em comparao com os processadores vetoriais de FP
foi a origem de muitos debates na dcada de 1990. Que vantagens voc v em cada enfoque? O que voc faria nessa si-
tuao?
H
Aritmtica
de computadores
Escrito por David Goldberg
Xerox Palo Alto Research Center

O Rpido expulsa o Lento, ainda que o Rpido esteja errado.


W. Kahan

H.1 Introduo
H.2 Tcnicas bsicas de aritmtica de inteiros
H.3 Ponto flutuante
H.4 Multiplicao de ponto flutuante
H.5 Adio de ponto flutuante
H.6 Diviso e resto
H.7 Mais informaes sobre aritmtica de ponto flutuante
H.8 Como acelerar a adio de inteiros
H.9 Como acelerar a multiplicao e a diviso de inteiros
H.10 Juntando tudo
H.11 Falcias e armadilhas
H.12 Perspectiva histrica e referncias
Exerccios

2003, Elsevier Science (EUA).


2003, Editora Campus Ltda. uma empresa Elsevier. Todos os direitos reservados.
120 Apndice H Aritmtica de computadores

H.1 Introduo
Embora a aritmtica de computadores s vezes seja vista como uma parte especializada do projeto de CPUs,
uma parte muito importante. Essa idia foi trazida para a Intel em 1994, quando se descobriu que seu chip Pen-
tium tinha um bug no algoritmo de diviso. Essa falha de ponto flutuante resultou em uma enorme agitao de pu-
blicidade negativa para a Intel e tambm custou muito dinheiro. A Intel precisou levantar 300 milhes de dla-
res para cobrir o custo da substituio dos chips defeituosos.
Neste apndice, estudaremos alguns algoritmos bsicos de ponto flutuante, inclusive o algoritmo de diviso
utilizado no Pentium. Embora tenha sido proposta uma imensa variedade de algoritmos para uso em acelerado-
res de ponto flutuante, em geral as implementaes reais se baseiam em refinamentos e variaes dos poucos
algoritmos bsicos apresentados aqui. Alm de escolher algoritmos para adio, subtrao, multiplicao e di-
viso, o arquiteto de computadores deve fazer outras escolhas. Que nveis de preciso devem ser implementa-
dos? Como devem ser tratadas as excees? Este apndice lhe dar a base para tomar essas e outras decises.
Nossa discusso sobre o ponto flutuante se concentrar quase exclusivamente no padro de ponto flutuante
do IEEE (IEEE 754), devido sua aceitao cada vez mais rpida. Embora a aritmtica de ponto flutuante en-
volva a manipulao de expoentes e o deslocamento de fraes, a maior parte do tamanho das operaes de
ponto flutuante gasta na realizao de operaes sobre fraes com o uso de algoritmos de inteiros (mas no
necessariamente compartilhando o hardware que implementa instrues de inteiros). Desse modo, aps nossa
discusso sobre o ponto flutuante, faremos um exame mais detalhado dos algoritmos de inteiros.
Algumas boas referncias sobre aritmtica de computadores, em ordem da menos para a mais detalhada, so
o Captulo 4 de Patterson e Hennessy [1994]; o Captulo 7 de Hamacher, Vranesic e Zaky [1984]; Gosling
[1980]; e Scott [1985].

H.2 Tcnicas bsicas de aritmtica de inteiros


Os leitores que estudaram aritmtica de computadores antes iro considerar a maior parte desta seo uma re-
viso.

Adio ripple-carry
Em geral, os somadores so implementados pela combinao de vrias cpias de componentes simples. Os
componentes naturais para a adio so meios somadores e somadores completos. O meio somador toma dois bits
a e b como entrada e produz um bit soma s e um bit de transporte csada como sada. Matematicamente, s = (a + b)
mod 2 e csada = (a + b)/2, onde a funo piso. Como equaes lgica, s = ab + ab e csada = ab, onde ab signi-
fica a b e a + b significa a b. O meio somador tambm chamado somador (2,2), pois ele recebe duas entra-
das e produz duas sadas. O somador completo um somador (3,2) e definido por s = (a + b + c) mod 2, csada =
(a + b)/2, ou pelas equaes lgicas:

H.2.1 s = abc + abc + abc + abc

H.2.2 csada = ab + ac + bc

O principal problema na construo de um somador para nmeros de n bits a partir de fragmentos menores
propagar os bits de carry de um fragmento para o seguinte. O caminho mais bvio para resolver esse problema
um somador ripple-carry (ou somador de transporte por ondulao), que consiste em n somadores completos,
como ilustra a Figura H.1. (Nas figuras deste apndice, o bit menos significativo est sempre direita.) As en-
tradas para o somador so an1an2 ... a0 e bn1bn2 ... b0, onde an1an2 ... a0 representa o nmero an1 2n1 + an2
2n2 + ... + a0. A sada ci+1 do i-simo somador inserida na entrada ci+1 do prximo somador (o (i + 1)-simo so-
mador) com o transporte de mais baixa ordem c0 definido como 0. Tendo em vista que o carry de baixa ordem
est conectado a 0, o somador de baixa ordem poderia ser um meio somador. Contudo, veremos mais tarde que
a configurao do bit de carry de baixa ordem como 1 til para efetuar a subtrao.
Em geral, o tempo que um circuito leva para produzir uma sada proporcional ao nmero mximo de nveis
lgicos atravs dos quais um sinal trafega. Todavia, a determinao do relacionamento exato entre nveis lgi-
cos e sincronizao altamente dependente da tecnologia. Assim, quando compararmos somadores, simples-
H.2 Tcnicas bsicas de aritmtica de inteiros 121

a b a b a b a b
n1 n1 n2 n2 1 1 0 0
0

Somador Somador Somador Somador


completo completo completo completo

c s c s c s c s
n n1 n1 n2 2 1 1 0

Figura H.1 Somador ripple-carry, consistindo em n somadores completos. O carry de sada de um somador completo
est conectado ao carry de entrada do somador correspondente ao prximo bit mais significativo. Os bits de carry se propagam
por ondulao (ripple) do bit menos significativo ( direita) para o bit mais significativo ( esquerda).

mente iremos comparar o nmero de nveis lgicos em cada um. Quantos nveis existem para um somador rip-
ple-carry? Ele ocupa dois nveis para calcular c1 a partir de a0 e b0. Em seguida, ocupa mais dois nveis para cal-
cular c2 a partir de c1, a1, b1 e assim por diante, at cn. Assim, h um total de 2n nveis. Os valores tpicos de n so
32 para aritmtica de inteiros e 53 para ponto flutuante de preciso dupla. O somador ripple-carry o somador
mais lento, mas tambm o mais econmico. Ele pode ser construdo com apenas n clulas simples, conectadas
de forma simples e regular.
Pelo fato de o somador ripple-carry ser relativamente lento em comparao com os projetos descritos na Se-
o H.8, voc deve estar imaginando por que ele utilizado. Em tecnologias como CMOS, embora os somado-
res ripple demorem o tempo O(n), o fator constante muito pequeno. Em tais casos, os somadores ripple fre-
qentemente so usados como blocos de construo em somadores maiores.

Multiplicao e diviso de base 2


O multiplicador mais simples calcula o produto de dois nmeros sem sinal, um bit de cada vez, como ilustra a
Figura H.2(a). Os nmeros a serem multiplicados so an1an2 ... a0 e bn1bn2 ... b0, e so inseridos nos registra-
dores A e B, respectivamente. O registrador P inicialmente 0. Cada etapa de multiplicao tem duas partes.

Deslocamento
Carry-sada

P A

1 n n

(a) n

Deslocamento

P A

n+1 n

0 B

(b) 1 n

Figura H.2 Diagrama de blocos de (a) multiplicador e (b) divisor para inteiros sem sinal de n bits. Cada etapa de multi-
plicao consiste na soma do contedo de P a B ou 0 (dependendo do bit de baixa ordem de A), na substituio de P pela soma,
e depois no deslocamento de P e A um bit para a direita. Cada etapa de diviso envolve primeiro deslocar P e A um bit para a es-
querda, subtrair B de P e, se a diferena for no-negativa, inseri-la em P. Se a diferena for no-negativa, o bit de baixa ordem de
A ser definido como 1.
122 Apndice H Aritmtica de computadores

Etapa de multiplicao (i) Se o bit menos significativo de A 1, ento o registrador B, que contm bn1bn2 ... b0, soma-
do a P; caso contrrio, 00 ... 00 somado a P. A soma colocada de volta em P.

(ii) Os registradores P e A so deslocados direita, com o carry de sada da soma sendo movido
para o bit de alta ordem de P, o bit de baixa ordem de P sendo movido para o registrador A, e o
bit mais direita de A, que no usado no restante do algoritmo, sendo deslocado para fora.

Aps n etapas, o produto aparece nos registradores P e A, com A contendo os bits de mais baixa ordem.
O divisor mais simples tambm opera sobre nmeros sem sinal e produz os bits de quociente, um de cada
vez. Um divisor de hardware mostrado na Figura H.2(b). Para calcular a/b, coloque a no registrador A, b no
registrador B, 0 no registrador P, e depois efetue n etapas de diviso. Cada etapa de diviso consiste em quatro
partes:

Etapa de diviso (i) Deslocar o par de registradores (P,A) um bit para a esquerda.
(ii) Subtrair o contedo do registrador B (que bn1bn2 ... b0) do registrador P, colocando o resultado
de volta em P.
(iii) Se o resultado da etapa 2 for negativo, definir o bit de baixa ordem de A como 0; caso contrrio,
como 1.
(iv) Se o resultado da etapa 2 for negativo, restaurar o valor antigo de P, somando o contedo do regis-
trador B de volta em P.

Depois de repetir esse processo n vezes, o registrador A conter o quociente, e o registrador P conter o res-
to. Esse algoritmo a verso binria do mtodo de lpis e papel; um exemplo numrico est ilustrado na Figura
H.3(a).
Note que os dois diagramas de blocos da Figura H.2 so muito semelhantes. A principal diferena que o par
de registradores (P,A) se desloca para a direita na multiplicao e para a esquerda na diviso. Permitindo-se que
esses registradores se desloquem de modo bidirecional, o mesmo hardware pode ser compartilhado entre mul-
tiplicao e diviso.
O algoritmo de diviso ilustrado na Figura H.3(a) chamado restaurao porque, se a subtrao por b gerar
um resultado negativo, o registrador P ser restaurado somando-se b de volta. O algoritmo de restaurao tem
uma variante que ignora a etapa de restaurao e, em vez disso, funciona com os nmeros negativos resultan-
tes. Cada etapa desse algoritmo sem restaurao tem trs partes:

Etapa de diviso sem restaurao Se P negativo,


Etapa de diviso sem restaurao (i-a) Deslocar o par de registradores (P,A) um bit para a esquerda.
Etapa de diviso sem restaurao (ii-a) Somar o contedo do registrador B a P.
Etapa de diviso sem restaurao Seno,
Etapa de diviso sem restaurao (i-b) Deslocar o par de registradores (P,A) um bit para a esquerda.
Etapa de diviso sem restaurao (ii-b) Subtrair o contedo do registrador B de P.
Etapa de diviso sem restaurao (iii) Se P negativo, definir o bit de baixa ordem de A como 0; caso contrrio, defini-lo
como 1.

Depois de repetir essas etapas n vezes, o quociente est em A. Se P for no-negativo, ele ser o resto. Caso
contrrio, precisar ser restaurado (isto , somado a b), e depois ele ser o resto. Um exemplo numrico dado
na Figura H.3(b). Tendo em vista que (i-a) e (i-b) so iguais, voc poderia ser tentado a efetuar essa etapa co-
mum primeiro, e depois testar o sinal de P. Isso no funciona, pois o bit de sinal pode ser perdido ao ser feito o
deslocamento.
Assim explicamos por que o algoritmo sem restaurao funciona. Seja rk o contedo do par de registradores
(P,A) na etapa k, ignorando-se os bits de quociente (que esto simplesmente compartilhando os bits no utili-
zados do registrador A). Na Figura H.3(a), A inicialmente contm 14, e assim r0 = 14. No fim da primeira etapa,
r1 = 28 e assim por diante. No algoritmo de restaurao, a parte (i) calcula 2rk, e depois a (ii) calcula 2rk 2nb
(2nb, pois b subtrado da metade esquerda). Se 2rk 2nb 0, ambos os algoritmos terminam a etapa com valo-
H.2 Tcnicas bsicas de aritmtica de inteiros 123

P A
00000 1110 Dividir 14 = 1110 por 3 = 11 . B sempre contm 0011 .
2 2 2
00001 110 etapa 1(i): deslocar.
00011 etapa 1(ii): subtrair.
00010 1100 etapa 1(iii): resultado negativo, definir bit de quociente como 0.
00001 1100 etapa 1(iv): restaurar.
00011 100 etapa 2(i): deslocar.
00011 etapa 2(ii): subtrair.
00000 1001 etapa 2(iii): resultado no-negativo, definir bit de quociente como 1.
00001 001 etapa 3(i): deslocar.
00011 etapa 3(ii): subtrair.
00010 0010 etapa 3(iii): resultado negativo, definir bit de quociente como 0.
00001 0010 etapa 3(iv): restaurar.
00010 010 etapa 4(i): deslocar.
00011 etapa 4(ii): subtrair.
00001 0100 etapa 4(iii): resultado negativo, definir bit de quociente como 0.
00010 0100 etapa 4(iv): restaurar. O quociente 0100 e o resto 00010 .
2 2
(a)

00000 1110 Dividir 14 = 1110 por 3 = 11 . B sempre contm 0011 .


2 2 2
00001 110 etapa 1(i-b): deslocar.
+11101 etapa 1(ii-b): subtrair b (somar complemento de dois).
11110 1100 etapa 1(iii): P negativo, ento definir bit de quociente 0.
11101 100 etapa 2(i-a): deslocar.
+00011 etapa 2(ii-a): somar b.
00000 1001 etapa 2(iii): P no-negativo, ento definir bit de quociente como 1.
00001 001 etapa 3(i-b): deslocar.
+11101 etapa 3(ii-b): subtrair b.
11110 0010 etapa 3(iii): P negativo, ento definir bit de quociente como 0.
11100 010 etapa 4(i-a): deslocar.
+00011 etapa 4(ii-a): somar b.
11111 0100 etapa 4(iii): P negativo, ento definir bit de quociente como 0.
+00011 O resto negativo, ento realizar etapa final de restaurao.
00010 O quociente 0100 e o resto 00010 .
2 2
(b)

Figura H.3 Exemplo numrico de (a) diviso de restaurao e (b) diviso sem restaurao.

res idnticos em (P,A). Se 2rk 2nb < 0, ento o algoritmo de restaurao restaura esse valor para 2rk, e a prxi-
ma etapa comea pelo clculo de rres = 2(2rk) 2nb. No algoritmo sem restaurao, 2rk - 2nb mantido como um
nmero negativo e, na etapa seguinte, rsemres = 2(2rk 2nb) + 2nb = 4rk 2nb = rres. Desse modo, (P,A) tem os
mesmos bits em ambos os algoritmos.
Se a e b so nmeros de n bits sem sinal, conseqentemente no intervalo 0 a.b 2n 1, ento o multiplica-
dor na Figura H.2 funcionar se o registrador P tiver n bits de comprimento. Porm, para a diviso, P deve ser
estendido para n + 1 bits, a fim de detectar o sinal de P. Desse modo, o somador tambm deve ter n + 1 bits.
Por que algum implementaria a diviso com restaurao, que utiliza o mesmo hardware que a diviso sem
restaurao (o controle um pouco diferente), mas envolve uma adio extra? De fato, a implementao habi-
tual para diviso com restaurao no efetua realmente uma adio na etapa (iv). Em vez disso, o sinal resultan-
te da subtrao testado na sada do somador, e somente se a soma no-negativa carregada de volta para o
registrador P.
Como um ltimo detalhe, antes de comear a dividir, o hardware deve verificar se o divisor 0.

Nmeros com sinal


H quatro mtodos comumente usados para representar nmeros de n bits com sinal: magnitude de sinal, com-
plemento de dois, complemento de um e com desvio. No sistema de magnitude de sinal, o bit de alta ordem o bit
de sinal, e os n 1 bits de baixa ordem representam a magnitude do nmero. No sistema de complemento de
dois, um nmero e seu negativo somam 2n. No complemento de 1, o negativo de um nmero obtido pela com-
124 Apndice H Aritmtica de computadores

plementao de cada bit (ou, de forma alternativa, o nmero e seu negativo somam 2n 1). Em cada um desses
trs sistemas, nmeros no-negativos so representados da maneira habitual. Em um sistema com desvio, n-
meros no-negativos no tm sua representao habitual. Em vez disso, todos os nmeros so representados
somando-se primeiro esses nmeros ao desvio, e depois codificando essa soma como um nmero comum sem
sinal. Desse modo, um nmero negativo k pode ser codificado desde que k + desvio 0. Um valor tpico para o
desvio 2n1.

EXEMPLO Usando-se nmeros de 4 bits (n = 4), se k = 3 (ou, em binrios, k = 00112 ), como se expressa k em cada um
desses formatos?
Resposta Em magnitude com sinal, o bit mais esquerda em k = 00112 o bit de sinal, e assim ele invertido para 1: k
representado por 10112. Em complemento de dois, k + 11012 = 2n = 16. Assim, k representado por 11012. Em
complemento de um, os bits de k = 00112 so invertidos, e assim k representado por 11002. No caso de um
sistema com desvio, supondo-se um desvio igual a 2n1 = 8, k representado por k + desvio = 10112 , e k por
k + desvio = 01012.

O sistema mais amplamente utilizado para representar inteiros, complemento de dois, o sistema que usare-
mos aqui. Uma razo para a popularidade do complemento de dois que ele torna fcil a adio com sinal: basta
descartar o transporte do bit de alta ordem. Por exemplo, para somar 5 + 2, some 01012 e 11102 para obter
00112, resultando no valor correto 3. Uma frmula til para o valor de um nmero em complemento de dois
an1an2 ... a1a0

H.2.3 an1 2n1 + an2 2n2 + ... + a1 21 + a0

Como uma ilustrao dessa frmula, o valor de 11012 como um nmero em complemento de dois de 4 bits
133 + 123 + 021 + 120 = 8 + 4 + 1 = 3, confirmando o resultado do exemplo anterior.
O estouro ocorre quando o resultado da operao no cabe na representao que est sendo utilizada. Por
exemplo, se nmeros sem sinal esto sendo representados com o uso de 4 bits, ento 6 = 01102 e 11 = 10112. Sua
soma (17) provoca um estouro, porque seu equivalente binrio (100012) no cabe em 4 bits. No caso de nmeros
sem sinal, fcil detectar o estouro; ele ocorre exatamente quando existe um carry-sada do bit mais significativo.
Para o complemento de dois, tudo mais complicado: o estouro ocorre exatamente quando o carry de entrada no
bit de alta ordem diferente do carry de sada (a ser descartado) do bit de alto ordem. No exemplo anterior de 5 +
2, o valor 1 transportado para dentro e para fora do bit mais esquerda, evitando o estouro.
A negao de um nmero em complemento de dois envolve complementar cada bit e depois somar 1. Por
exemplo, para negar 00112, complemente-o para obter 11002 e depois some 1 para obter 11012. Desse modo,
para implementar a b usando um somador, simplesmente alimente a e b (onde b o nmero obtido comple-
mentando-se cada bit de b) no somador e defina o bit de carry de baixa ordem como 1. Isso explica por que o so-
mador mais direita na Figura H.1 um somador completo.
Multiplicar nmeros em complemento de dois no to simples quanto som-los. A abordagem bvia con-
verter ambos os operandos para no-negativos, efetuar uma multiplicao sem sinal e depois (se os operandos
originais tinham sinais opostos) negar o resultado. Embora isso seja conceitualmente simples, exige tempo e
hardware extra. Aqui est uma abordagem melhor: suponha que estamos multiplicando a vezes b usando o hard-
ware mostrado na Figura H.2(a). O registrador A carregado com o nmero a; B carregado com b. Como o
contedo do registrador B sempre b, usaremos B e b de modo intercambivel. Se B for potencialmente negati-
vo mas A for no-negativo, a nica mudana necessria para converter o algoritmo de multiplicao sem sinal
em um algoritmo de complemento de dois assegurar que, quando P for deslocado, o deslocamento ser arit-
mtico; isto , o bit deslocado para o bit de alta ordem de P deve ser o bit de sinal de P (em vez do carry da adi-
o). Observe que nosso somador com largura de n bits ir somar agora dois nmeros de n bits em complemen-
to de dois entre 2n1 e 2n1 1.
Em seguida, suponha que a seja negativo. O mtodo para tratar esse caso chamado recodificao de Booth.
A recodificao de Booth uma tcnica muito bsica em aritmtica de computadores e desempenhar uma fun-
o fundamental na Seo H.9. O algoritmo da pgina H-4 calcula a b examinando os bits de a do menos signi-
H.2 Tcnicas bsicas de aritmtica de inteiros 125

ficativo para o mais significativo. Por exemplo, se a = 7 = 01112, ento a etapa (i) ir sucessivamente somar B,
somar B, somar B e somar 0. A recodificao de Booth recodifica o nmero 7 como 8 1 = 10002 00012 =
1001, onde 1 representa 1. Isso oferece um caminho alternativo para se calcular a b, ou seja, sucessivamente
subtrair B, somar 0, somar 0 e somar B. Isso mais complicado que o algoritmo sem sinal da pgina 121, pois
utiliza tanto adio quanto subtrao. A vantagem surge para valores negativos de a. Com a recodificao apro-
priada, podemos tratar a como se ele fosse sem sinal. Por exemplo, considere a = 4 = 11002. Pense em 11002
como o nmero sem sinal 12 e o recodifique como 12 = 16 4 = 100002 01002 = 10100. Se o algoritmo de mul-
tiplicao s iteragir n vezes (n = 4, nesse caso), o dgito de alta ordem ser ignorado, e acabaremos subtraindo
01002 = 4 vezes o multiplicador exatamente a resposta correta. Isso sugere que a multiplicao com o uso de
uma forma recodificada de a funcionar igualmente bem para nmeros positivos e negativos. E, de fato, para li-
dar com valores negativos de a, basta subtrair s vezes b de P, em vez de adicionar b ou 0 a P. Aqui esto as re-
gras precisas: se o contedo inicial de A for an1...a0, ento, na i-sima etapa de multiplicao, o bit de baixa or-
dem do registrador A ser ai, e etapa (i) no algoritmo de multiplicao se tornar:

I. Se ai = 0 e ai1 = 0, ento somar 0 a P.


II. Se ai = 0 e ai1 = 1, ento somar B a P.
III. Se ai = 1 e ai1 = 0, ento subtrair B de P.
IV. Se ai = 1 e ai1 = 1, ento somar 0 a P.

Para a primeira etapa, quando i = 0, considere ai1 igual a 0.

EXEMPLO Quando multiplicamos 6 vezes 5, qual a seqncia de valores no par de registradores (P,A)?
Resposta Veja a Figura H.4.

Os quatro casos anteriores podem ser novamente enunciados como a afirmao de que, na i-sima etapa,
voc deve somar (ai1 ai)B a P. Com essa observao, fcil verificar que essas regras funcionam, porque o re-
sultado de todas as adies :
n 1
b( a i 1 a i )2 i = b( -a n 1 2 n 1 + a n 2 2 n 2 + ... + a1 2 + a 0 ) + ba 1
i =0

Usando a Equao H.2.3 juntamente com a-1 = 0, vemos que o lado direito o valor de b a como um nme-
ro em complemento de dois.
O caminho mais simples para implementar as regras da recodificao de Booth estender o registrador A um
bit direita, de forma que esse novo bit conter ai1. Diferente do mtodo ingnuo de inverter quaisquer ope-

P A
0000 1010 Colocar 6 = 1010 em A, 5 = 1011 em B.
2 2
0000 1010 etapa 1(i): a = a = 0; assim, somar 0 pela regra 1.
0 1
0000 0101 etapa 1(ii): deslocar.
+ 0101 etapa 2(i): a = 1, a = 0. A regra III manda subtrair b (ou somar b = 1011 = 0101 ).
1 0 2 2
0101 0101
0010 1010 etapa 2(ii): deslocar.
+ 1011 etapa 3(i): a = 0, a = 1. A regra II manda somar b (1011).
2 1
1101 1010
1110 1101 etapa 3(ii): deslocar. (Deslocamento aritmtico carregar 1 no bit mais esquerda.)
+ 0101 etapa 4(i): a = 1, a = 0. A regra III manda subtrair b.
3 2
0011 1101
0001 1110 etapa 4(ii): deslocar. O resultado final 00011110 = 30.
2

Figura H.4 Exemplo numrico de recodificao de Booth. A multiplicao de a = 6 por b = 5 para obter 30.
126 Apndice H Aritmtica de computadores

randos negativos, essa tcnica no exige etapas extras ou qualquer cobertura especial para operandos negati-
vos. Ela s tem um pouco mais de lgica de controle. Se o multiplicador estiver sendo compartilhado com um
divisor, j haver o recurso de subtrair b, em vez de som-lo. Para resumir, um mtodo simples para tratar a
multiplicao em complemento de dois prestar ateno ao sinal de P ao desloc-lo para a direita, e de salvar o
bit de A deslocado mais recentemente para uso ao decidir se deve somar ou subtrair b de P.
A recodificao de Booth normalmente o melhor mtodo para criar hardware de multiplicao que opera
sobre nmeros com sinal. Porm, no caso de hardware que no a implementa diretamente, a execuo da reco-
dificao de Booth em software ou microcdigo em geral lenta demais, devido aos testes e desvios condicio-
nais. Se o hardware admitir deslocamentos aritmticos (para que b negativo seja tratado corretamente), ento
poder ser usado o mtodo a seguir. Trate o multiplicador a como se ele fosse um nmero sem sinal e execute as
primeiras n 1 etapas de multiplicao usando o algoritmo da pgina 121. Se a < 0 (em cujo caso haver um va-
lor 1 no bit de baixa ordem do registrador A nesse ponto), subtraia b de P; caso contrrio (a 0), no some nem
subtraia. Em um ou outro caso, efetue um deslocamento final (dando um total de n deslocamentos). Isso funcio-
na, porque equivale a multiplicar b por an1 2n1 + ... + a12 + a0, que o valor de an1 ... a0 como um nmero em
complemento de dois pela Equao H.2.3. Se o hardware no admitir deslocamento aritmtico, ento converter
os operandos para no-negativos provavelmente ser a melhor abordagem.
Dois comentrios finais: uma boa maneira de testar uma rotina de multiplicao com sinal experimentar
2 2n1, pois esse o nico caso que produz um resultado de 2n 1 bits. Diferente da multiplicao, a divi-
n1

so normalmente executada em hardware, convertendo-se os operandos para no-negativos, e depois efetu-


ando-se uma diviso sem sinal. Como a diviso substancialmente mais lenta (e menos freqente) que a multi-
plicao, o tempo extra usado para manipular os sinais tem menor impacto do que na multiplicao.

Questes de sistemas
Quando se projeta um conjunto de instrues, diversas questes relacionadas aritmtica de inteiros precisam
ser resolvidas. Vrias delas sero discutidas aqui.
Primeiro, o que deve ser feito em relao ao estouro de inteiros? Essa situao complicada pelo fato de que
a deteco do estouro diferente, dependendo do fato de os operandos serem inteiros com sinal ou sem sinal.
Considere primeiro a aritmtica com sinal. H trs abordagens: definir um bit ao ocorrer o estouro, capturar o
estouro ou no fazer nada em resposta ao estouro. Nesse ltimo caso, o software tem de verificar se ocorreu ou
no um estouro. A soluo mais conveniente para o programador ter um bit de ativao. Se esse bit estiver ati-
vo, o estouro provocar uma trap. Se ele estiver inativo, o estouro definir um bit (ou, como alternativa, ter
duas instrues de adio diferentes). A vantagem desse enfoque que as operaes com captura e sem captura
exigiro apenas uma instruo. Alm disso, como veremos na Seo H.7, isso anlogo forma como o padro
de ponto flutuante do IEEE trata o estouro de ponto flutuante. A Figura H.5 mostra como algumas mquinas
comuns tratam o estouro.
E no caso da adio sem sinal? Observe que nenhuma das arquiteturas da Figura H.5 realiza a captura ao
ocorrer o estouro sem sinal. A razo para isso que o principal uso da aritmtica sem sinal a manipulao de
endereos. conveniente ter a capacidade de subtrair um valor de um endereo sem sinal efetuando a soma.

Trap em estouro Trap em estouro Definir bit em estouro Definir bit em estouro
Mquina com sinal? sem sinal? com sinal? sem sinal?

VAX Se enable estiver ativo No Sim. Add define bit V. Sim. Add define bit C.
IBM 370 Se enable estiver ativo No Sim. Add define cdigo de Sim. Add lgico define
condio. cdigo de condio.
Intel 8086 No No Sim. Add define bit V. Sim. Add define bit C.
MIPS R3000 Duas instrues add: uma No No. O software deve deduzi-lo a partir do sinal dos
sempre captura, a outra operandos e do resultado.
nunca o faz.
SPARC No No Addcc define o bit V. Add Addcc define o bit C. Add
no o faz. no o faz.
Figura H.5 Resumo de como diversas mquinas tratam o estouro de inteiros. Tanto o 8086 quanto o SPARC tm uma instruo que
captura se o bit V estiver ativo, e assim o custo da trap no estouro uma instruo extra.
H.2 Tcnicas bsicas de aritmtica de inteiros 127

Por exemplo, quando n = 4, podemos subtrair 2 do endereo sem sinal 10 = 10102 somando 14 = 11102. Isso
gera um estouro, mas no gostaramos que fosse gerada uma trap.
Uma segunda questo diz respeito multiplicao. Caso o resultado da multiplicao de dois nmeros de n
bits seja um valor de 2n bits ou caso a multiplicao simplesmente retorne os n bits de baixa ordem, devemos
assinalar o estouro se o resultado no couber em n bits? Um argumento em favor de um resultado de n bits
que, em quase todas as linguagens de alto nvel, a multiplicao uma operao em que os argumentos so va-
riveis inteiras e o resultado uma varivel inteira do mesmo tipo. Assim, os compiladores no iro gerar cdi-
go que utilize um resultado de preciso dupla. Um argumento em favor de um resultado de 2n bits que ele
pode ser usado por uma rotina de linguagem assembly para acelerar substancialmente a multiplicao de intei-
ros de preciso mltipla (cerca de 3 vezes).
Uma terceira questo diz respeito s mquinas que desejam executar uma instruo em cada ciclo. Raramen-
te prtico executar uma multiplicao ou uma diviso no mesmo perodo de tempo ocupado por uma adio
ou uma movimentao de registrador para registrador. H trs abordagens possveis para esse problema. A pri-
meira ter uma instruo de etapa de multiplicao de um nico ciclo. Essa instruo poderia realizar uma eta-
pa do algoritmo de Booth. A segunda abordagem fazer a multiplicao de inteiros na unidade de ponto flutu-
ante e tom-la como parte do conjunto de instrues de ponto flutuante. ( isso que o DLX faz.) A terceira
abordagem fazer uma unidade autnoma na CPU efetuar a multiplicao. Nesse caso, o resultado pode ter a
garantia de ser entregue em um nmero fixo de ciclos e o compilador ficar encarregado de esperar o perodo
de tempo apropriado ou pode haver um bloqueio. Os mesmos comentrios tambm se aplicam diviso.
Como exemplos, o SPARC original tinha uma instruo de etapa de multiplicao, mas no uma instruo de
etapa de diviso, enquanto o MIPS R3000 tem uma unidade autnoma que efetua a multiplicao e a diviso
(verses mais novas da arquitetura SPARC acrescentaram uma instruo de multiplicao de inteiros). Os pro-
jetistas da HP Precision Architecture realizaram um trabalho especialmente completo de anlise da freqncia
dos operandos para a multiplicao e a diviso, e basearam suas etapas de multiplicao e diviso de acordo
com essa anlise. (Consulte Magenheimer et al. [1988] para conhecer detalhes.)
A ltima questo envolve o clculo da diviso de inteiros e do resto para nmeros negativos. Por exemplo,
qual o valor de 5 DIV 3 e 5 MOD 3? Quando se calcula x DIV y e x MOD y, valores negativos de x ocorrem
com freqncia suficiente para valer a pena alguma considerao adicional. (Por outro lado, valores negativos
de y so bastante raros.) Se houver instrues de hardware embutidas para essas operaes, elas devem corres-
ponder ao que as linguagens de alto nvel especificam. Infelizmente, no h nenhum acordo entre as linguagens
de programao existentes. Veja a Figura H.6.
Uma definio para essas expresses distingue-se como claramente superior; isto , x DIV y = x/y, de forma
que 5 DIV 3 = 1, 5 DIV 3 = 2. Alm disso, MOD deve satisfazer a x = (x DIV y) y + x MOD y, de forma que x
MOD y 0. Desse modo, 5 MOD 3 = 2 e 5 MOD 3 = 1. Aqui esto algumas das muitas vantagens dessa definio:
1. Um clculo para computar um ndice em uma tabela de hash de tamanho N pode usar MOD N e ter a garan-
tia de produzir um ndice vlido no intervalo de 0 a N 1.
2. Em elementos grficos, quando se faz a converso de um sistema de coordenadas para outro, no existe ne-
nhum glitch prximo a 0. Por exemplo, para converter de um valor x expresso em um sistema que utiliza
100 pontos por polegada para um valor y em um vdeo de mapa de bits com 70 pontos por polegada, a fr-
mula y = (70 x) DIV 100 faz o mapeamento de uma ou duas coordenadas x em cada coordenada y. Porm,
se DIV fosse definida como em Pascal para ser x/y arredondada para 0, ento 0 teria trs pontos diferentes
(1, 0, 1) mapeados nele.

Linguagem Diviso Resto

FORTRAN 5/3 = 1 MOD(5, 3) = 2


Pascal 5 DIV 3 = 1 5 MOD 3 = 1
Ada 5/3 = 1 5 MOD 3 = 1
5 REM 3 = 2
C 5/3 indefinido 5 % 3 indefinido
Modula-3 5 DIV 3 = 2 5 MOD 3 = 1
Figura H.6 Exemplos de diviso de inteiros e resto de inteiros em vrias linguagens de programao.
128 Apndice H Aritmtica de computadores

3. x MOD 2k o mesmo que executar um AND bit a bit com uma mscara de k bits, e x DIV 2k o mesmo que
fazer um deslocamento aritmtico de k bits para a direita.
Finalmente, uma trap potencial que vale a pena mencionar diz respeito adio de preciso mltipla. Mui-
tos conjuntos de instrues oferecem uma variante da instruo add que soma trs operandos: dois nmeros de
n bits a um terceiro nmero de um nico bit. Esse terceiro nmero o transporte da adio anterior. Tendo em
vista que o nmero de preciso mltipla normalmente ficar armazenado em um array, importante ser capaz
de incrementar o ponteiro do array sem destruir o bit de carry.

H.3 Ponto flutuante


Muitas aplicaes exigem nmeros que no so inteiros. H vrias maneiras de representar nmeros no-intei-
ros. Uma delas usar o ponto fixo; isto , usar a aritmtica de inteiros e simplesmente imaginar o ponto binrio
em algum outro lugar que no direita do dgito menos significativo. A soma de dois desses nmeros pode ser
feita com uma adio de inteiros, enquanto a multiplicao exige algum deslocamento extra. Outras represen-
taes propostas envolvem armazenar o logaritmo de um nmero e efetuar a multiplicao somando os logarit-
mos, ou usar um par de inteiros (a,b) para representar a frao a/b. Porm, somente uma representao de no-
inteiros obteve ampla utilizao, a representao de ponto flutuante. Nesse sistema, uma palavra de computador
dividida em duas partes, um expoente e um significando. Como um exemplo, o expoente 3 e o significando
1,5 poderiam representar o nmero 1,5 23 = 0,1875. As vantagens de padronizar uma representao especfi-
ca so bvias. Os analistas numricos podem construir bibliotecas de software de alta qualidade, os projetistas
de computadores podem desenvolver tcnicas para implementar hardware de alto desempenho e os fornecedo-
res de hardware podem construir aceleradores padro. Dada a predominncia da representao de ponto flutu-
ante, parece improvvel que qualquer outra representao seja amplamente adotada.
A semntica de instrues de ponto flutuante no to clara quanto a semntica do restante do conjunto de
instrues e, no passado, o comportamento de operaes de ponto flutuante variava consideravelmente de uma
famlia de computadores para outra. As variaes envolviam itens como o nmero de bits alocados ao expoente e
ao significando, o intervalo de expoentes, o modo como o arredondamento foi executado e as aes empreendi-
das em condies excepcionais como underflow e overflow (estouro). Os livros de arquitetura de computadores
costumavam oferecer conselhos sobre o modo de lidar com todos esses detalhes, mas felizmente isso no mais
necessrio, porque a indstria de informtica est convergindo rapidamente para o formato especificado pelo pa-
dro IEEE 754-1985 (tambm um padro internacional, o IEC 559). As vantagens de se usar uma variante de pa-
dro de ponto flutuante so semelhantes s de usar o ponto flutuante sobre outras representaes de no-inteiros.
A aritmtica IEEE difere de muitas aritmticas anteriores, nos seguintes aspectos principais:
1. Quando se arredonda um resultado intermedirio at o nmero de ponto flutuante mais prximo, ela es-
colhe o nmero par.
2. Ela inclui os valores especiais NaN, e .

3. Ela utiliza nmeros no-normalizados para representar o resultado de clculos cujo valor menor que
1,0 2 E min.
4. Ela arredondada para o mais prximo por padro, mas tambm tem trs outros modos de arredondamento.

5. Ela tem recursos sofisticados para tratamento de excees.


Para desenvolver (1) note que, ao se operar sobre dois nmeros de ponto flutuante, em geral o resultado
um nmero que no pode ser representado exatamente como outro nmero de ponto flutuante. Por exemplo,
em um sistema de ponto flutuante que utiliza a base 10 e dois dgitos significativos, 6,1 0,5 = 3,05. Esse valor
precisa ser arredondado para dois dgitos. Ele deve ser arredondado para 3,0 ou para 3,1? No padro IEEE, tais
casos intermedirios so arredondados para o nmero cujo dgito de baixa ordem par. Isto , 3,05 arredon-
dado para 3,0, e no para 3,1. Na realidade, o padro tem quatro modos de arredondamento. O padro arredon-
dar at o mais prximo, que arredonda at um nmero par, como acabamos de explicar. Os outros modos so o
arredondamento para 0, o arredondamento para + e o arredondamento para .
Desenvolveremos as outras diferenas nas prximas sees. Para leitura adicional, consulte o IEEE [1985],
Cody et al. [1984] e Goldberg [1991].
H.3 Ponto flutuante 129

Valores especiais e no-normalizados


Talvez a caracterstica mais notvel do padro seja que, por padro, uma computao continua diante de condi-
es excepcionais, como a diviso por 0 ou quando se toma a raiz quadrada de um nmero negativo. Por exem-
plo, o resultado de se tomar a raiz quadrada de um nmero negativo NaN (Not a Number), um padro de bits
que no representa um nmero comum. Para ver um exemplo de como os NaNs poderiam ser teis, considere
o cdigo correspondente a um localizador de zero que toma uma funo F como argumento e avalia F em vrios
pontos, a fim de determinar um zero para ela. Se o localizador de zero fizer a sondagem acidental fora dos valo-
res vlidos para F, a funo F poder causar uma exceo. Escrever um localizador de zero que lide com esse
caso uma ao altamente dependente da linguagem e do sistema operacional, porque se baseia no modo como
o sistema operacional reage a excees e como essa reao mapeada de volta na linguagem de programao.
Na aritmtica IEEE, fcil escrever um localizador de zero que trate essa situao e funcione em muitos siste-
mas diferentes. Aps cada avaliao de F, ele simplesmente verifica se F retornou um NaN; nesse caso, ele sabe
que fez a sondagem fora do domnio de F.
Na aritmtica IEEE, se a entrada para uma operao NaN, a sada NaN (por exemplo, 3 + NaN = NaN).
Devido a essa regra, a escrita de sub-rotinas de ponto flutuante que possam aceitar NaN como argumento rara-
mente exige qualquer verificao de caso especial. Por exemplo, suponha que arccos seja calculado em termos
de arctan, usando-se a frmula x = 2 ( (1 x ) / (1 + x )). Se arctan tratar um argumento de NaN de forma apro-
priada, arccos tambm o far automaticamente. Isso ocorre porque, se x um NaN, 1 + x, 1 x, (1 + x)/(1 x) e
(1 x ) / (1 + x ) tambm sero NaNs. No necessria nenhuma verificao de NaN.
Embora o resultado de 1 seja um NaN, o resultado de 1/0 no um NaN, mas sim +, que outro valor
especial. O padro define a aritmtica sobre infinitos (existem + e ) usando regras como 1/ = 0. A frmula
( (1 x ) / (1 + x )) ilustra como a aritmtica de infinitos pode ser usada. Tendo em vista que arctan x se aproxi-
ma assintoticamente de /2 medida que x se aproxima de , natural definir arctan() = /2, em cujo caso
arccos(1) ser calculado automaticamente de forma correta como 2 arctan() = .
O ltimo tipo de valores especiais no padro o dos nmeros no-normalizados. Em muitos sistemas de ponto
flutuante, se Emin o menor expoente, um nmero menor que1,0 2 E min no poder ser representado, e uma ope-
rao de ponto flutuante que resulte em um nmero menor que esse ser simplesmente esvaziada at 0. Por outro
lado, no padro IEEE, nmeros menores que1,0 2 E min so representados com a utilizao de significandos menores
que 1. Isso chamado underflow gradual. Desse modo, medida que os nmeros diminuem em magnitude abaixo de
2 E min , eles perdem gradualmente seu significado e s so representados por 0 quando todo seu significado deslo-
cado para fora. Por exemplo, na base 10 com quatro dgitos significativos, seja1, 234 10 E min . Ento x/10 ser arre-
dondado para 0123 , 10 E min , com a perda de um dgito de preciso. De modo semelhante, x/100 arredondado
para 0,012 0,012 10 E min , e x/1000 para 0,001 10 E min ; por fim, x/10000 pequeno o suficiente para ser arre-
dondado at 0. Os no-normalizados tornam mais previsvel lidar com nmeros pequenos, mantendo-se proprieda-
des familiares como x = y x y. Por exemplo, em um sistema de esvaziamento at 0 (novamente na base 10 com
quatro dgitos significativos), se x = 1, 256 10 E min e y = 1, 234 10 E min , ento x y = 0,022 10 E min , que esva-
ziado at zero. Embora x y, o valor calculado de x y = 0. Isso nunca acontece com o underflow gradual. Nesse
exemplo, x y = 0,022 10 E min um nmero no-normalizado, e assim o clculo de x y exato.

Representao de nmeros em ponto flutuante


Vamos considerar como representar nmeros de preciso simples em aritmtica IEEE. Os nmeros de preciso
simples so armazenados em 32 bits: 1 para o sinal, 8 para o expoente e 23 para a frao. O expoente um n-
mero com sinal representado com o emprego do mtodo de desvio (veja a subseo Nmeros com sinal, pgi-
na 123) com um desvio igual a 127. A expresso expoente polarizado se refere ao nmero sem sinal contido nos
bits de 1 a 8, e expoente no-polarizado (ou simplesmente expoente) significa a potncia real qual o nmero 2
deve ser elevado. A frao representa um nmero menor que 1, mas o significando do nmero de ponto flutuan-
te 1 mais a parte fracionria. Em outras palavras, se e o expoente polarizado (valor do campo de expoente) e
f o valor do campo da frao, o nmero que est sendo representado 1, f 2e127.

EXEMPLO Que nmero de preciso simples representado pela palavra de 32 bits a seguir?

1 10000001 01000000000000000000000
130 Apndice H Aritmtica de computadores

Resposta Considerado um nmero sem sinal, o campo de expoente 129, tornando o valor do expoente 129 127 = 2. A
parte fracionria 0,012 = 0,25, o que torna o significando 1,25. Desse modo, esse padro de bits representa o
nmero 1,25 22 = 5.

A parte fracionria de um nmero de ponto flutuante (0,25 no exemplo anterior) no deve ser confundida
com o significando, que 1 mais a parte fracionria. O 1 inicial no significando 1,f no aparece na representa-
o; isto , o bit inicial est implcito. Quando se executa aritmtica sobre nmeros no formato do IEEE, a parte
fracionria normalmente descompactada, o que significa que o valor 1 implcito se torna explcito.
A Figura H.7 resume os parmetros para preciso simples (e outras precises). Ela mostra os expoentes para
que a preciso simples varie de 126 a 127; conseqentemente, os expoentes parciais variam de 1 a 254. Os ex-
poentes parciais 0 e 255 so usados para representar valores especiais. Isso resumido na Figura H.8. Quando o
expoente polarizado 255, um campo de frao igual a zero representa infinito, e um campo de frao diferente
de zero representa um NaN. Desse modo, existe uma famlia inteira de NaNs. Quando o expoente polarizado e
o campo de frao so iguais a 0, o nmero representado 0. Devido ao 1 inicial implcito, nmeros comuns
sempre tm um significando maior que ou igual a 1. Assim, necessria uma conveno especial como essa
para representar 0. Nmeros no-normalizados so implementados fazendo-se uma palavra com um campo de
expoente zero representar o nmero 0, f 2 E min .
A principal razo pela qual o padro IEEE, como a maioria dos outros formatos de ponto flutuante, utiliza
expoentes parciais que ele significa que nmeros no-negativos esto ordenados do mesmo modo que intei-
ros. Isto , a magnitude dos nmeros de ponto flutuante pode ser comparada utilizando-se um comparador de
inteiros. Outra vantagem (relacionada) que 0 representado por uma palavra formada apenas por valores 0. A
desvantagem dos expoentes parciais que som-los um pouco incmodo, porque exige que o desvio seja sub-
trado da soma dos valores.

H.4 Multiplicao de ponto flutuante


A operao de ponto flutuante mais simples a multiplicao, e assim vamos discuti-la primeiro. Um nmero
de ponto flutuante binrio x representado como um significando e um expoente, x = s 2e. A frmula

( s1 2 el ) ( s 2 2 e 2 ) = ( s1 s 2 ) 2 el + e 2

Simples Simples estendida Dupla Dupla estendida

p (bits de preciso) 24 32 53 64
Emax 127 1023 1023 16383
Emin 126 1022 1022 16382
Desvio de expoente 127 1023
Figura H.7 Parmetros de formato para o padro de ponto flutuante IEEE 754. A primeira linha fornece o nmero de bits
no significando. Os valores em branco so parmetros no-especificados.

Expoente Frao Representa

e = Emin 1 f=0 0
e = Emin 1 f0 0,f 2Emin
Emin e Emax 1,f 2e
e = Emax + 1 f=0
e = Emax + 1 f0 NaN
Figura H.8 Representao de valores especiais. Quando o expoente de um nmero fica fora do intervalo Emin e Emax, en-
to esse nmero tem uma interpretao especial, como indica a tabela.
H.4 Multiplicao de ponto flutuante 131

mostra que um algoritmo de multiplicao de ponto flutuante tem diversas partes. A primeira parte multiplica
os significandos, usando a multiplicao de inteiros comum. Como os nmeros de ponto flutuante esto arma-
zenados em forma de magnitude de sinal, o multiplicador s precisa lidar com nmeros sem sinal (embora te-
nhamos visto que a recodificao de Booth trata sem dificuldades de nmeros em complemento de dois com si-
nal). A segunda parte arredonda o resultado. Se os significandos forem nmeros de p bits sem sinal (por exem-
plo, p = 24 para preciso simples), ento o produto pode ter at 2p bits e deve ser arredondado para um nmero
de p bits. A terceira parte calcula o novo expoente. Tendo em vista que os expoentes ficam armazenados com
um desvio, isso envolve subtrair o desvio da soma dos expoentes parciais.

EXEMPLO Como a multiplicao dos nmeros de preciso simples

1 10000010 000. . . = 1 23

0 10000011 000. . . = 1 24

executada em binrio?
Resposta Quando descompactados, os significandos so ambos 1,0, seu produto 1,0, e assim o resultado tem a forma

1 ???????? 000. . .

Para calcular o expoente, utilize a frmula

exp polarizado (e 1 + e 2 ) = exp polarizado (e 1 ) + exp polarizado (e 2 ) desvio

A partir da Figura H.7, o desvio 127 = 011111112; assim, em complemento de dois, 127 100000012.
Desse modo, o expoente polarizado do produto

10000010
10000011
+ 10000001
10000110

Tendo em vista que esse valor 134 decimal, ele representa um expoente igual a 134 desvio = 134 127 =
7, como espervamos.

A parte interessante da multiplicao de ponto flutuante o arredondamento. Alguns casos diferentes que
podem ocorrer esto ilustrados na Figura H.9. Considerando-se que os casos so semelhantes em todas as ba-
ses, a figura utiliza a base 10, amistosa para o ser humano, em lugar da base 2.
Na figura, p = 3, e assim o resultado final tem de ser arredondado para trs dgitos significativos. Os trs dgi-
tos mais significativos esto em negrito. O quarto dgito mais significativo (assinalado com uma seta) o dgito
de arredondamento, denotado por r.
Se o dgito de arredondamento menor que 5, ento os dgitos em negrito representam o resultado arredon-
dado. Se o dgito de arredondamento maior que 5 (como em (a)), ento deve-se adicionar 1 ao dgito em ne-
grito menos significativo. Se o dgito de arredondamento exatamente 5 (como em (b)), ento devem ser exa-
minados dgitos adicionais para se decidir entre efetuar o truncamento ou incrementar em uma unidade. S
necessrio saber se algum dgito alm de 5 no-nulo. No algoritmo a seguir, isso ser registrado em um bit de
aderncia. A comparao entre (a) e (b) na figura mostra que existem duas posies possveis para o dgito de
arredondamento (relativas ao dgito menos significativo do produto). O caso (c) ilustra que, quando se adicio-
na 1 ao dgito em negrito menos significativo, pode haver um carry de sada. Quando isso ocorre, o significando
final deve ser 10,0.
132 Apndice H Aritmtica de computadores

a) 1,23
6,78 r = 9 > 5; ento, arredondar para cima
8,3394 arredonda para 8,34

b) 2,83
4,47 r = 5 e um dgito seguinte = 0; arredondar para cima
1
12,6501 arredonda para 1,27 10

c) 1,28
7,81 r = 6 > 5 ; ento, arredondar para cima
1
09,9968 arredonda para 1,00 10

Figura H.9 Exemplos de arredondamento em uma multiplicao. Usando-se a base 10 e p = 3, as partes (a) e (b) ilustram
que o resultado de uma multiplicao pode ter 2p 1 ou 2p dgitos e, conseqentemente, a posio em que o valor 1 adicio-
nado ao se arredondar para cima (imediatamente esquerda da seta) pode variar. A parte (c) mostra que o arredondamento
para cima pode usar um carry de sada.

Existe um mtodo direto para tratar o arredondamento, usando-se o multiplicador da Figura H.2 junta-
mente com um bit de aderncia extra. Se p o nmero de bits no significando, ento os registradores A, B e P
devem ter p bits de largura. Multiplique os dois significandos para obter um produto de 2p bits nos registra-
dores (P,A) (veja a Figura H.10). Durante a multiplicao, as primeiras p 2 vezes que um bit deslocado
para o registrador A, efetua-se o OR desse bit para o bit de aderncia. Isso ser usado nos casos intermedirios.
Seja s a representao do bit de aderncia, g o bit mais significativo de A e r o segundo bit mais significativo de
A. H dois casos:
1. O bit de alta ordem de P 0. Desloque P 1 bit esquerda, deslocando o bit g de A. O deslocamento do res-
tante de A no necessrio.
2. O bit de alta ordem de P 1. Defina s: = s r e r : = g, e some 1 ao expoente.

Agora, se r = 0, P o produto corretamente arredondado. Se r = 1 e s = 1, ento P + 1 o produto (onde P + 1


significa somar 1 ao bit menos significativo de P). Se r = 1 e s = 0, estamos em um caso intermedirio, e arre-
dondamos para cima de acordo com o bit menos significativo de P. Como um exemplo, aplique a verso de-
cimal dessas regras Figura H.9(b). Aps a multiplicao, P = 126 e A = 501, com g = 5, r = 0, s = 1. Tendo
em vista que o dgito de alta ordem de P no-nulo, o caso (2) se aplica e r:= g, de forma que r = 5, como in-
dica a seta na Figura H.9. Como r = 5, poderamos estar em um caso intermedirio, mas s = 1 indica que o
resultado est de fato ligeiramente acima de ; portanto, some 1 a P para obter o produto corretamente ar-
redondado.
As regras precisas para o arredondamento dependem do modo de arredondamento e so dadas na Figura
H.11. Observe que P no-negativo, isto , contm a magnitude do resultado. Uma boa discusso sobre
maneiras mais eficientes de implementar o arredondamento encontra-se em Santoro, Bewick e Horowitz
[1989].

P A

Produto x0 x1 . x2 x3 x4 x5 g r s s s s

Caso (1): x = 0 rnd aderncia


0
Deslocamento necessrio
x1 . x2 x3 x4 x5 g

Caso (2): x = 1 rnd aderncia


0 x0 . x1 x2 x3 x4 x5
Incrementar expoente

Ajustar ponto binrio,


somar 1 ao expoente para compensar

Figura H.10 Os dois casos do algoritmo de multiplicao de ponto flutuante. A linha superior mostra o contedo dos re-
gistradores P e A aps a multiplicao de significandos, com p = 6. No caso (1), o bit inicial 0, e assim o registrador P deve ser
deslocado. No caso (2), o bit inicial 1, nenhum deslocamento necessrio, mas tanto o expoente quanto os bits de arredonda-
mento e de aderncia devem ser ajustados. O bit de aderncia o OR lgico dos bits marcados com s.
H.4 Multiplicao de ponto flutuante 133

EXEMPLO Em binrio com p = 4, mostre como o algoritmo de multiplicao calcula o produto 5 10 em cada um dos
quatro modos de arredondamento.
Resposta Em binrio, 5 1.0102 22 e 10 = 1.0102 23. A aplicao do algoritmo de multiplicao de inteiros aos signi-
ficandos fornece 011001002, e assim P = 01102, A = 01002, g = 0, r = 1 e s = 0. O bit de alta ordem de P 0, e as-
sim se aplica o caso (1). Desse modo, P se torna 11002 e, como o resultado negativo, a Figura H.11 d:

arredondar para 11012 somar 1, pois r s =1 / 0 = TRUE


arredondar para + 11002
arredondar para 0 11002
arredondar para o mais prximo 11002 no somar, pois r P0 = 1 0 = FALSE e
r s = 1 0 = FALSE

O expoente 2 + 3 = 5, ento o resultado 1.1002 25 = 48, exceto quando se arredonda para , quando
ele 1.1012 25 = 52.

O estouro ocorre quando o resultado arredondado grande demais para ser representado. Em preciso sim-
ples, isso ocorre quando o resultado tem o expoente 128 ou mais alto. Se e1 e e2 so dois expoentes parciais, en-
to1 e i 254, e o clculo do expoente e1 + e2 127 fornece nmeros entre 1 + 1 127 e 254 + 254 127 ou
entre 125 e 381. Esse intervalo de nmeros pode ser representado usando-se 9 bits. Assim, um modo de detec-
tar o estouro executar os clculos de expoentes em um somador de 9 bits (veja o Exerccio H.12). Lembre-se
de que voc deve verificar o estouro aps o arredondamento o exemplo da Figura H.9(c) mostra que isso pode
fazer diferena.

No-normalizados
A verificao do underflow um tanto mais complexa, devido aos no-normalizados. Em preciso simples, se o
resultado tem um expoente menor que 126, isso no indica necessariamente underflow, porque o resultado
pode ser um nmero no-normalizado. Por exemplo, o produto de (1 264) com (1 265) 1 2129, e 129
est abaixo do limite de expoentes vlidos. Porm, esse resultado um nmero no-normalizado vlido, ou
seja, 0,125 2126. Em geral, quando o expoente no-polarizado de um produto cai abaixo de 126, o produto
resultante tem de ser deslocado para a direita e o expoente incrementado, at o expoente alcanar 126. Se esse
processo fizer o significando inteiro ser deslocado para fora, ento ocorrer um underflow. A definio precisa
de underflow um tanto sutil. Veja detalhes na Seo H.7.
Quando um dos operandos de uma multiplicao for no-normalizada, seu significando ter zeros iniciais, e
assim o produto dos significandos tambm ter zeros iniciais. Se o expoente do produto for menor que 126, o
resultado ser no-normalizado, e assim vamos deslocar para a direita e incrementar o expoente como antes. Se
o expoente for maior que 126, o resultado poder ser um nmero normalizado. Nesse caso, desloque o produ-
to esquerda (enquanto decrementa o expoente) at ele se tornar normalizado ou o expoente cair a 126.
Os nmeros no-normalizados representam uma grande pedra no caminho da implementao da multipli-
cao de ponto flutuante, porque eles exigem a execuo de um deslocamento varivel no multiplicador, o que
no seria necessrio em caso contrrio. Desse modo, multiplicadores de alto desempenho em ponto flutuante

Modo de arredondamento Sinal do resultado 0 Sinal do resultado < 0

- +1 se r s
+ +1 se r s
0
Mais prximo +1 se r p0 ou r s +1 se r p0 ou r s
Figura H.11 Regras para implementao dos modos de arredondamento do IEEE. Seja S a magnitude do resultado preli-
minar. Brancos significam que os p bits mais significativos de S so os bits reais do resultado. Se a condio listada verdadeira,
some 1 ao p-simo bit mais significativo de S. Os smbolos r e s representam os bits de arredondamento e aderncia, enquanto
p0 o p-simo bit mais significativo de S.
134 Apndice H Aritmtica de computadores

com freqncia no tratam nmeros no-normalizados mas, em vez disso, efetuam uma trap, permitindo que o
software os trate. Alguns cdigos prticos freqentemente sofrem underflow, mesmo quando funcionam de
maneira apropriada, e esses programas sero bem mais lentos em sistemas que exigem que os no-norma-
lizados sejam processados por um tratador de trap.
At agora no mencionamos como lidar com operandos iguais a zero. Esse caso pode ser tratado testando-se
ambos os operandos antes de iniciar a multiplicao ou testando-se o produto posteriormente. Se efetuar o tes-
te posterior, no deixe de tratar o caso 0 de maneira apropriada: isso resulta em NaN, no em 0. Depois de
detectar que o resultado 0, defina o expoente polarizado como 0. No se esquea do sinal. O sinal de um pro-
duto o XOR dos sinais dos operandos, mesmo quando o resultado 0.

Preciso da multiplicao
Na discusso sobre a multiplicao de inteiros, mencionamos que os projetistas devem decidir entre fornecer a
palavra de baixa ordem do produto ou o produto inteiro. Uma questo semelhante surge na multiplicao de
ponto flutuante, na qual o produto exato pode ser arredondado at a preciso dos operandos ou at a prxima
preciso mais alta. No caso da multiplicao de inteiros, nenhuma das linguagens de alto nvel padro contm
uma construo que gere uma instruo simples vezes simples resulta em dupla. A situao diferente no
caso de ponto flutuante. Muitas linguagens permitem a atribuio do produto de duas variveis de preciso
simples a uma varivel de preciso dupla, e a construo tambm pode ser explorada por algoritmos numri-
cos. O caso mais conhecido o uso do refinamento iterativo para resolver sistemas lineares de equaes.

H.5 Adio de ponto flutuante


Em geral, uma operao de ponto flutuante obtm duas entradas com p bits de preciso e retorna um resultado
de p bits. O algoritmo ideal calcularia isso primeiro executando a operao exatamente, e depois arredondando
o resultado at p bits (utilizando o modo de arredondamento atual). O algoritmo de multiplicao apresentado
na seo anterior segue essa estratgia. Embora a implementao de hardware da aritmtica IEEE deva retornar
o mesmo resultado que o algoritmo ideal, na realidade ela no precisa executar o algoritmo ideal. No caso da
adio, de fato, existem maneiras melhores de proceder. Para verificar isso, considere alguns exemplos.
Primeiro, a soma dos nmeros binrios de 6 bits 1.100112 e 1.100012 25: quando os somandos so deslo-
cados para terem o mesmo expoente, isto :

1.10011
+ .0000110001

Usando um somador de 6 bits (e descartando os bits de baixa ordem da segunda parcela), temos:

1.10011
+ .00001
1.10100

O primeiro bit descartado 1. Isso no suficiente para decidir se devemos arredondar para cima. Os bits
descartados restantes, 0001, precisam ser examinados. Ou, na realidade, s precisamos registrar se quaisquer
desses bits so no-nulos, armazenando esse fato em um bit de aderncia, exatamente como no algoritmo de
multiplicao. Assim, para somar dois nmeros de p bits, basta um somador de p bits, desde que o primeiro bit
descartado (de arredondamento) e o OR dos bits restantes (de aderncia) sejam mantidos. Ento, a Figura H.11
pode ser usada para determinar se necessrio um arredondamento, exatamente como ocorre na multiplica-
o. No exemplo anterior, o bit de aderncia 1, e ento necessrio um arredondamento. A soma final
1.101012.
Aqui est outro exemplo:

1.11011
+ .0101001
H.5 Adio de ponto flutuante 135

Um somador de 6 bits fornece:

1.11011
+ .01010
10.00101

Devido ao carry de sada esquerda, o bit de arredondamento no o primeiro bit descartado; em vez disso,
ele o bit de baixa ordem da soma (1). Os bits descartados, 01, so submetidos juntos a um OR para formar o
bit de aderncia. Pelo fato de os bits de arredondamento e de aderncia serem ambos iguais a 1, os 6 bits de alta
ordem da soma, 10.00102, devem ser arredondados at a resposta final ser 10.00112.
Em seguida, considere a subtrao e este exemplo:

1.00000
.00000101111

A maneira mais simples de calcular isso converter 0,000001011112 em sua forma de complemento de
dois, para que a diferena se transforme em uma soma.

1.00000
+ 1.11111010001

O clculo dessa soma em um somador de 6 bits fornece:

1.00000
+ 1.11111
0.11111

Como os bits superiores se cancelaram, o primeiro bit descartado (o bit de proteo) tem de preencher o lu-
gar do bit menos significativo da soma, que se torna 0.1111102, e o segundo bit descartado se torna o bit de ar-
redondamento. Isso anlogo ao caso (1) no algoritmo de multiplicao (veja a pgina 132). O bit de arredon-
damento de 1 no suficiente para decidir se devemos arredondar para cima. Em vez disso, precisamos efetuar
o OR de todos os bits restantes (0001) para formar um bit de aderncia. Nesse caso, o bit de aderncia 1, e as-
sim o resultado final deve ser arredondado para 0.111111. Esse exemplo mostra que, se a subtrao fizer o bit
mais significativo se cancelar, ser necessrio um bit de proteo. natural perguntar se dois bits de proteo
so necessrios no caso em que os dois bits mais significativos se cancelam. A resposta no, porque se x e y es-
to to prximos que os dois bits superiores de x y se cancelam, ento x y ser exata, e assim os bits de prote-
o no sero necessrios.
Para resumir, a adio mais complexa que a multiplicao porque, dependendo dos sinais dos operandos,
ela pode na realidade ser uma subtrao. Se for uma adio, haver um carry de sada esquerda, como no se-
gundo exemplo. Se ela for uma subtrao, poder haver cancelamento, como no terceiro exemplo. Em cada
caso, a posio do bit de arredondamento diferente. Porm, no precisamos calcular a soma exata e depois ar-
redond-la. Podemos deduzi-la a partir da soma dos p bits de alta ordem com os bits de arredondamento e de
aderncia.
O restante desta seo se dedica a uma discusso detalhada do algoritmo de adio de ponto flutuante. Sejam
a1 e a2 os dois nmeros a serem somados. As notaes ei e si so usadas para o expoente e o significando dos so-
mandos ai. Isso significa que as entradas de ponto flutuante foram descompactadas, e que si tem um bit inicial
explcito. Para somar a1 e a2, execute estas oito etapas.
1. Se e1 < e2, troque os operandos. Isso assegura que a diferena dos expoentes satisfaz d = e1 e2 0. Defina
por tentativas o expoente do resultado como e1.
2. Se os sinais de a1 e a2 forem diferentes, substitua s2 por seu complemento de dois.

3. Insira s2 em um registrador de p bits e o desloque d = e1 e2 posies para a direita (deslocando valores 1 se


s2 foi complementado na etapa anterior). A partir dos bits deslocados, defina g como o bit mais significati-
vo, r como o prximo bit mais significativo, e defina o bit de aderncia como o OR dos bits restantes.
136 Apndice H Aritmtica de computadores

4. Calcule um significando preliminar S = s1 + s2, somando s1 ao registrador de p bits que contm s2. Se os si-
nais de a1 e a2 forem diferentes, o bit mais significativo de S ser 1, e no houve nenhum carry de sada, e as-
sim S negativo. Substitua S por seu complemento de dois. Isso s pode acontecer quando d = 0.
5. Desloque S como a seguir. Se os sinais de a1 e a2 forem iguais e ocorreu um carry de sada na etapa 4, deslo-
que S para a direita uma unidade, preenchendo a posio de alta ordem com 1 (o carry de sada). Caso con-
trrio, desloque-o para a esquerda at ser normalizado. Quando fizer o deslocamento esquerda, no pri-
meiro deslocamento preencha a posio de baixa ordem com o bit g. Depois disso, desloque em zeros.
Ajuste o expoente do resultado de acordo.
6. Ajuste r e s. Se S foi deslocado para a direita na etapa 5, defina r := bit de baixa ordem S antes do desloca-
mento e de s := g OR r OR s. Se no houve nenhum deslocamento, defina r := g, s := r OR s. Se houve um ni-
co deslocamento esquerda, no altere r e s. Se ocorreram dois ou mais deslocamentos esquerda, r := 0,
s := 0. (Nesse ltimo caso, dois ou mais deslocamentos s podem ocorrer quando a1 e a2 tm sinais opostos
e o mesmo expoente e, nesse caso, a computao de s1 + s2 na etapa 4 ser exata.)
7. Arredonde S usando a Figura H.11; especificamente, se uma entrada de tabela for no-vazia, some 1 ao bit
de baixa ordem de S. Se o arredondamento causar carry de sada, desloque S para a direita e ajuste o expo-
ente. Esse o significando do resultado.
8. Calcule o sinal do resultado. Se a1 e a2 tiverem o mesmo sinal, esse ser o sinal do resultado. Se a1 e a2 tive-
rem sinais diferentes, ento o sinal do resultado depender de qual dentre a1, a2 negativo, de ter havido
uma troca na etapa 1, e de S ter sido ou no substitudo por seu complemento de dois na etapa 4. Consulte a
Figura H.12.

EXEMPLO Use o algoritmo para calcular a soma (1.0012 22) + (1.1112 20)
Resposta s1 = 1.001, e1 = 2, s2 = 1.111, e2 = 0
1. e1 < e2, ento trocar. d = 2. Tentar exp = 0.

2. Sinais de ambos os operandos negativos; no negar s2.

3. Deslocar s2 (1.001 aps a troca) direita duas unidades, resultando em s2 = .010, g = 0, r = 1, s = 0.

4. 1.111
+ .010
(1)0.001 S = 0.001, com um carry de sada.
5. Carry de sada; ento, deslocar S para a direita, S = 1.000, exp = exp + 1, ento exp = 1.

6. r = bit de baixa ordem da soma = 1, s = g r s = 0 1 0 = 1.

7. r AND s = TRUE, e assim a Figura H.11 manda arredondar. S = S + 1 ou S = 1.001.

8. Ambos os sinais so negativos; assim, o sinal do resultado negativo. Resposta final: S 2exp = 1.0012 21.

troca compl sinal(a1) sinal(a2) sinal(resultado)

Sim +
Sim + +
No No + +
No No +
No Sim +
No Sim + +
Figura H.12 Regras para calcular o sinal de uma soma quando as parcelas (os somandos) tm sinais diferentes. A colu-
na troca se refere troca dos operandos na etapa 1, enquanto a coluna compl se refere execuo de um complemento de dois
na etapa 4. Os brancos significam no importa.
H.5 Adio de ponto flutuante 137

EXEMPLO Utilize o algoritmo para calcular a soma (1.0102) + 1.1002.


Resposta s1 = 1.010, e1 = 0, s2 = 1.100, e2 = 0.

1. Nenhuma troca, d = 0, tentativa de exp = 0.

2. Os sinais diferem, substituir s2 por 0.100.

3. d = 0, ento no deslocar. r = g = s = 0.

4. 1.010
+ 0.100
1.110 Os sinais so diferentes, o bit mais significativo 1, no h carry de sada;
assim, deve efetuar a soma de complemento de dois, dando S = 0.010.
5. Deslocar esquerda duas vezes; assim, S = 1.000, exp = exp 2, ou exp = 2.

6. Dois deslocamentos esquerda, ento r = g = s = 0.

7. Nenhuma adio exigida para arredondamento.

8. A resposta sinal S 2exp ou sinal 1.000 22. Obter sinal da Figura H.12. Tendo em vista que h com-
plemento, mas no troca, e que sinal(a1) , o sinal da soma +. Desse modo, a resposta 1.0002 22.

Como acelerar a adio


Vamos avaliar quanto tempo demora a execuo do algoritmo anterior. A etapa 2 pode exigir uma adio, a etapa
4 exige uma ou duas adies, e a etapa 7 pode exigir uma adio. Se a demora for de T unidades de tempo para a
execuo de uma soma de p bits (onde p = 24 para preciso simples, 53 para dupla), ento aparentemente o algo-
ritmo ir demorar pelo menos 4T unidades de tempo. Contudo, isso muito pessimista. Se a etapa 4 exigir duas
somas, ento a1 e a2 tero o mesmo expoente e sinais diferentes. Entretanto, nesse caso a diferena ser exata, e as-
sim no ser necessrio nenhum arredondamento na etapa 7. Desse modo, s ocorrero trs adies. De modo se-
melhante, parece que um deslocamento de varivel dever ser exigido, tanto na etapa 3 quanto na etapa 5. Porm,
se e 1 e 2 1, ento a etapa 3 requer um deslocamento direita de no mximo uma posio, e ento apenas a eta-
pa 5 precisar de um deslocamento de varivel. Alm disso, se e 1 e 2 >1, ento a etapa 3 precisar de um deslo-
camento de varivel, mas a etapa 5 exigir um deslocamento esquerda de no mximo uma posio. Portanto,
apenas um deslocamento de varivel ser executado. Ainda assim, o algoritmo exige trs somas seqenciais que,
no caso de um significando de preciso dupla com 53 bits, pode ser bastante demorado.
Vrias tcnicas podem acelerar a adio. Uma delas usar o pipelining. A seo Juntando tudo apresenta exem-
plos de como alguns chips comerciais fazem a adio com pipeline. Outro mtodo (usado no Intel 860 [Kohn e Fu
1989]) executar duas adies em paralelo. Explicaremos agora como isso reduz a latncia de 3T para T.
Existem trs casos a considerar. Primeiro, suponha que ambos os operandos tenham o mesmo sinal. Quere-
mos combinar as operaes de adio das etapas 4 e 7. A posio do bit de alta ordem da soma no conhecida
com antecedncia, porque a adio na etapa 4 pode causar ou no um carry de sada. Ambas as possibilidades
so levadas em conta, tendo-se dois somadores. O primeiro somador pressupe que a adio na etapa 4 no re-
sultar em um carry de sada. Desse modo, os valores de r e s podero ser calculados antes de a soma ser real-
mente efetuada. Se r e s indicarem que necessrio um arredondamento, o primeiro somador calcular S = s1 +
s2 + 1, onde a notao +1 significa somar 1 na posio do bit menos significativo de s1. Isso pode ser feito com
um somador comum, configurando-se o bit de carry de entrada de baixa ordem como 1. Se r e s no indicarem
nenhum arredondamento, o somador calcular S = s1 + s2 da maneira habitual. Um detalhe extra: quando r = 1,
s = 0, voc tambm precisar conhecer o bit de baixa ordem da soma, que tambm pode ser calculado rapida-
mente com antecedncia. O segundo somador cobre a possibilidade de haver carry de sada. Os valores de r e s e
da posio em que o arredondamento 1 adicionado so diferentes dos anteriores, mas de novo podem ser cal-
culados rapidamente com antecedncia. No se sabe se haver um carry de sada at a soma ser realmente efetua-
da, mas isso no importa. Efetuando-se ambas as somas em paralelo, temos a garantia de que um somador pro-
duzir a resposta correta.
138 Apndice H Aritmtica de computadores

O prximo caso ocorre quando a1 e a2 tm sinais opostos, mas o mesmo expoente. A soma a1 + a2 exata
nesse caso (no necessrio nenhum arredondamento), mas o sinal no conhecido at a soma ser completa-
da. Assim, no calcule o complemento de dois (que exige uma soma) na etapa 2 mas, em vez disso, calcule s1 +
s2 + 1 e s1 + s2 + 1 em paralelo. A primeira soma tem o resultado de complementar simultaneamente s1 e calcular
a soma, resultando em s2 s1. A segunda soma calcula s1 s2. Uma delas ser no-negativa e, conseqentemen-
te, ser a resposta final correta. Mais uma vez, todas as adies sero efetuadas em uma etapa, com o uso de dois
somadores operando em paralelo.
O ltimo caso, quando a1 e a2 tm sinais opostos e expoentes distintos, mais complexo. Se e 1 e 2 > 1, a
posio do bit inicial da diferena est em uma de duas posies, e assim h dois casos, exatamente como na
adio. Quando e 1 e 2 = 1, o cancelamento possvel, e o bit inicial pode estar em praticamente qualquer po-
sio. Porm, apenas se o bit inicial da diferena estiver na mesma posio do bit inicial de s1, poder ser neces-
srio um arredondamento. Assim, um somador pressupe um arredondamento, o outro no pressupe ne-
nhum arredondamento. Desse modo, a adio da etapa 4 e o arredondamento da etapa 7 podem ser combina-
dos. Porm, existe ainda o problema da adio na etapa 2!
Para eliminar essa adio, considere o seguinte diagrama da etapa 4:

| p |
s1 1 xxxxxxx
s2 - 1 yyzzzzz

Se os bits marcados com z forem todos iguais a 0, ento os p bits de alta ordem de S = s1 s2 podero ser cal-
culados como s1 + s2 + 1. Se pelo menos um dos z bits for 1, use s1 + s2. Assim, s1 s2 poder ser calculado com
uma nica adio. Porm, ainda no conhecemos os valores g e r para o complemento de dois de s2, que so ne-
cessrios para o arredondamento da etapa 7.
Para calcular s1 s2 e conseguir os bits g e r adequados, combine as etapas 2 e 4 a seguir. No comple-
mente s2 na etapa 2. Estenda o somador usado para calcular S dois bits direita (chame a soma estendida
S). Se o bit de aderncia preliminar (calculado na etapa 3) for 1, calcule S = s1 + s 2 , onde s1 tem dois bits 0
acrescentados direita, e s2 tem os valores preliminares g e r acrescentados. Se o bit de aderncia for 0, cal-
cule s1 + s2 + 1. Agora, os dois bits de baixa ordem de Stm os valores corretos de g e r (o bit de aderncia j
foi calculado corretamente na etapa 3). Finalmente, essa modificao pode ser combinada com a modifica-
o que combina a adio das etapas 4 e 7 para fornecer o resultado final no tempo T, o tempo correspon-
dente a uma nica adio.
Precisamos considerar mais alguns detalhes, descritos em Santoro, Bewick e Horowitz [1989] e no Exerccio
H.17. Embora o trabalho de Santoro seja indicado para multiplicao, grande parte da discusso se aplica igual-
mente adio. Tambm relevante o Exerccio H.19, que contm um mtodo alternativo para somar nmeros
de magnitude com sinal.

Nmeros no-normalizados
Diferente da multiplicao, para a adio h bem poucas mudanas na descrio precedente, se uma das entra-
das for um nmero no-normalizado. Deve haver um teste para verificar se o campo de expoente 0. Se for, ao
descompactar o significando, no existir um valor 1 inicial. Definindo-se o expoente polarizado como 1 ao
descompactar um no-normalizado, o algoritmo funcionar sem alteraes.
Para lidar com sadas no-normalizadas, a etapa 5 deve ser ligeiramente modificada. Desloque S at ele ser
normalizado ou at o expoente se tornar Emin (isto , o expoente polarizado se tornar 1). Se o expoente for Emin
e, aps o arredondamento, o bit de alta ordem de S for 1, o resultado ser um nmero normalizado e dever ser
compactado da maneira usual, omitindo-se o valor 1. Por outro lado, se o bit de alta ordem for 0, o resultado
ser no-normalizado. Quando o resultado descompactado, o campo de expoente deve ser definido como 0. A
Seo H.7 descreve as regras exatas para detectar o underflow.
A propsito, a deteco do estouro (overflow) muito fcil. Ela s pode ocorrer se a etapa 5 envolver um
deslocamento direita e o expoente polarizado nesse ponto for deslocado at 255 em preciso simples (ou
2047 no caso de preciso dupla) ou se isso acontecer depois do arredondamento.
H.6 Diviso e resto 139

H.6 Diviso e resto


Nesta seo, discutiremos a diviso e o resto de ponto flutuante.

Diviso iterativa
Discutimos anteriormente um algoritmo para diviso de inteiros. Convert-lo em um algoritmo de diviso de
ponto flutuante semelhante a converter o algoritmo de multiplicao de inteiros em ponto flutuante. A fr-
mula

( s1 2 e1 ) / ( s 2 2 e 2 ) = ( s1 / s 2 ) 2 e1 e2

mostra que, se o divisor calcular s1/s2, ento a resposta final ser esse quociente multiplicado por . Conforme a
Figura H.2(b), o alinhamento de operandos um pouco diferente da diviso de inteiros. Carregue s2 em B e s1
em P. O registrador A no necessrio para conter os operandos. Ento o algoritmo de inteiros para a diviso
(apenas com a pequena mudana de ignorar o primeiro deslocamento esquerda) poder ser usado, e o resulta-
do ter a forma q0.q1L. Para arredondar, basta calcular dois bits adicionais do quociente (proteo e arredonda-
mento) e usar o resto como o bit de aderncia. O dgito de proteo necessrio, porque o primeiro bit do quo-
ciente pode ser 0. Porm, como o numerador e o denominador so ambos normalizados, no possvel os dois
bits mais significativos do quociente serem iguais a 0. Esse algoritmo produz um nico bit do quociente em
cada etapa.
Uma abordagem diferente para a diviso converge para o quociente em uma taxa quadrtica, em vez de line-
ar. Uma mquina real que utiliza esse algoritmo ser descrita na Seo H.10. Primeiro, descreveremos os dois
principais algoritmos iterativos e, em seguida, discutiremos os prs e contras da iterao quando comparada
aos algoritmos diretos. Existe uma tcnica geral para construir algoritmos iterativos, chamada iterao de New-
ton, mostrada na Figura H.13. Primeiro, modele o problema na forma de localizao do zero de uma funo. Em
seguida, a partir de uma suposio sobre o zero, faa a aproximao da funo por sua tangente nessa suposio
e forme uma nova suposio baseada no ponto em que a tangente tem um zero. Se xi for uma suposio em um
zero, a linha da tangente ter a equao:

y f ( x i ) = f ( x i )( x x i )

Essa equao tem um zero em


f( xi )
H.6.1 x = xi +1 = xi
f ( x i )

Para remodelar a diviso como a localizao do zero de uma funo, considere f(x) = x1 b. Tendo em vista
que o zero dessa funo est em 1/b, a aplicao da iterao de Newton a essa funo fornecer um mtodo ite-
rativo para calcular 1/b a partir de b. Usando-se f'(x) = 1/x2, a Equao H.6.1 se transforma em:
1 / xi b
H.6.2 xi +1 = xi = x i + x i x i2 b = x i ( 2 x i b )
1 / x i2

f(x)

f(x)

x
x x
i i+1

Figura H.13 Iterao de Newton para localizao de zero. Se xi uma estimativa de um zero de f, ento xi+1 uma estima-
tiva melhor. Para calcular xi+1, encontre a interseo do eixo x com a linha tangente a f em f(xi).
140 Apndice H Aritmtica de computadores

Desse modo, poderamos implementar a computao de a/b usando o seguinte mtodo:


1. Ajuste a escala de b para adapt-la ao intervalo 1 b < 2 e obtenha um valor aproximado de 1/b (chame-o de
x0) usando uma pesquisa em tabela.
2. Faa a iterao de x i +1 = x i ( 2 x i b ) at alcanar um xn que seja preciso o suficiente.

3. Calcule axn e inverta o ajuste de escala feito na etapa 1.

Aqui esto mais alguns detalhes. Quantas vezes ter de ocorrer a iterao da etapa 2? Dizer que xi pre-
ciso at p bits significa que ( x 1 1 / b )/(1 / b ) = 2 p , e uma manipulao algbrica simples mostra que, quan-
do isso ocorrer, tem-se ( x i +1 1 / b )/(1 / b ) = 2 2 p . Desse modo, o nmero de bits corretos duplicado em
cada etapa. A iterao de Newton apresenta autocorreo no sentido de que um erro cometido em xi no
tem realmente grande importncia. Ou seja, ela trata xi como uma suposio em 1/b e retorna xi+1 como um
aperfeioamento sobre ela (aproximadamente duplicando os dgitos). Um detalhe que tornaria xi incorreta
seria em erro de arredondamento. Porm, o mais importante que nas primeiras iteraes podemos tirar
proveito do fato de no esperarmos muitos bits corretos executando a multiplicao em preciso reduzida,
obtendo assim maior velocidade sem sacrificar a exatido. Outra aplicao da iterao de Newton discuti-
da no Exerccio H.20.
O segundo mtodo de diviso iterativa s vezes chamado algoritmo de Goldschmidt. Ele se baseia na idia de
que, para calcular a/b, voc deve multiplicar o numerador e o denominador por um nmero r, com rb 1. Com
mais detalhes, seja x0 = a e y0 = b. Em cada etapa, calcule x i +1 = r i x i e y i +1 = r i y i . Ento, o quociente
x i +1 / y i +1 = x i / y i = a / b constante. Se escolhermos ri de forma que x i a / b, ento y i 1, e assim xi conver-
gir para a resposta que desejamos. Essa mesma idia pode ser usada para calcular outras funes. Por exemplo,
para calcular a raiz quadrada de a, sejam x0 = a e y0 = a e, em cada etapa, calcule x i +1 = r12 x i , y i +1 = r i y i . Em se-
guida, faa x i +1 / y i +1 2 = x i / y i2 = 1 / a; assim, se os valores de ri forem escolhidos para orientar x i 1, ento
y i a . Essa tcnica usada para calcular razes quadradas na mquina TI 8847.
Voltando ao algoritmo de diviso de Goldschmidt, defina x0 = a e y0 = b, e escreva b = 1 , onde <1. Se es-
colhermos r0 = 1 + , ento y1 = r0y0 = 1 2. Em seguida, escolhemos r1 = 1 + 2 de tal forma que y2 = r1y1 = 1
4 e assim por diante. Ento, < 1, y i 1. Com essa escolha de ri, o valor de xi ser calculado como
i i
x i +1 = r i x i = (1 + 2 ) x i = (1 + (1 b ) 2 ) x i ou
i
H.6.3 xi+1 = a[1 + (1 b)][1 + (1 b)2][1 + (1 b)4] ... [1 + (1 b) 2 ]

Aparentemente, h dois problemas com esse algoritmo. Primeiro, a convergncia lenta quando b no est
prximo de 1 (isto , no est prximo de 0); em segundo lugar, a frmula no tem autocorreo como o
quociente est sendo calculado sob a forma de um produto de termos independentes, um erro em um deles no
ser corrigido. Para lidar com convergncia lenta, se quiser calcular a/b, procure um inverso aproximado de b
(chame-o b ) e execute o algoritmo sobre ab / bb . Isso convergir rapidamente, pois bb 1.
Para lidar com o problema da autocorreo, a computao deve ser executada com alguns bits de preciso
extra para compensar erros de arredondamento. No entanto, o algoritmo do Goldschmidt tem uma forma defi-
ciente de autocorreo, no sentido de que o valor preciso de ri no tem importncia. Desse modo, nas primeiras
i
iteraes, quando a preciso total de1 2 no necessria, voc pode escolher ri para ser um truncamento de
i
1 2 , o que pode fazer essas iteraes funcionarem mais rpido sem afetar a velocidade de convergncia. Se ri
i
for truncado, ento yi no ser mais exatamente igual a1 2 . Portanto, a Equao H.6.3 no poder mais ser
utilizada, mas fcil organizar a computao de tal forma que ela no dependa do valor preciso de ri. Com essas
mudanas, o algoritmo de Goldschmidt ser semelhante ao seguinte (as anotaes entre colchetes mostram a
conexo com nossas frmulas anteriores).
1. Ajuste a escala a e b de forma que 1 b < 2.

2. Procure uma aproximao para 1/b (chame-a b ) em uma tabela.

3. Defina x 0 = ab e y 0 = bb .

4. Faa a iterao at xi ficar prximo o suficiente de a/b:


H.6 Diviso e resto 141

Loop
r2y [se yi = 1 + i, ento r 1 i]
2
y=yr [yi + 1 = yi r 1 i ]
xi+1 = xi r [xi+1 = xi + r]
End loop

Os dois mtodos de iterao esto relacionados entre si. Suponha que, no mtodo de Newton, desenvolve-
mos a iterao e calculamos cada termo xi+1 diretamente em funo de b, em vez de calcul-lo recursivamente
em termos de xi. Efetuando o transporte desse clculo (veja o Exerccio H.22), descobrimos que
i
xi+1 = x0(2 x0b)[(1 + (x0b 1)2][1 + (x0b 1)4] ... [1 + (x0b 1) 2 ]

Essa frmula muito semelhante Equao H.6.3. De fato, elas so idnticas se a, b em H.6.3 forem substi-
tudos por ax0, bx0 e a = 1. Desse modo, se as iteraes fossem feitas para preciso infinita, os dois mtodos re-
sultariam exatamente na mesma seqncia xi.
A vantagem da iterao que ela no exige hardware especial de diviso. Em vez disso, ela pode utilizar o
multiplicador (que, entretanto, exige controle extra). Alm disso, em cada etapa, ela fornece o dobro do nme-
ro de dgitos na etapa anterior diferente da diviso comum, que produz um nmero fixo de dgitos em cada
etapa.
H duas desvantagens na inverso por iterao. A primeira que o padro IEEE exige que a diviso seja arre-
dondada corretamente, mas a iterao s produz um resultado prximo resposta arredondada de forma corre-
ta. No caso da iterao de Newton, que calcula 1/b em vez de a/b diretamente, existe um problema adicional.
Ainda que 1/b fosse arredondado corretamente, no haveria nenhuma garantia de que a/b tambm o fosse. Um
exemplo em decimal com p = 2 a = 13, b = 51. Assim, a/b = 0,2549. . . , que arredondado para 0,25. Porm,
1/b = 0,0196. . . , que arredondado para 0,020, e ento a 0,020 = 0,26, que tem um erro de 0,01. A segunda
desvantagem que a iterao no fornece um resto. Isso especialmente inoportuno se o hardware de diviso
de ponto flutuante est sendo usado para executar a diviso de inteiros, pois uma operao de resto est presen-
te em quase toda linguagem de alto nvel.
O folclore tradicional garante que o caminho para se obter um resultado corretamente arredondado a partir
da iterao calcular 1/b para um pouco mais de 2p bits, calcular a/b para um pouco mais de 2p bits, e depois ar-
redondar os valores para p bits. Porm, existe um modo mais rpido, que aparentemente foi implementado pri-
meiro na mquina TI 8847. Nesse mtodo, a/b calculado para cerca de 6 bits extras de preciso, fornecendo
um quociente preliminar q. Comparando qb com a (mais uma vez com apenas 6 bits extras), possvel decidir
rapidamente se q est arredondado corretamente ou se precisa ser empurrado para cima ou para baixo 1 unida-
de na posio menos significativa. Esse algoritmo ser explorado com mais detalhes no Exerccio H.21.
Um fato que devemos levar em conta ao decidir sobre algoritmos de diviso a velocidade relativa da diviso
e da multiplicao. Como a diviso mais complexa que a multiplicao, ela funcionar mais lentamente. Uma
regra prtica comum que os algoritmos de diviso devem tentar alcanar uma velocidade de aproximadamen-
te um tero da velocidade da multiplicao. Um argumento em favor dessa regra que existem programas reais
(como algumas verses de spice) em que a razo entre diviso e multiplicao 1:3. Outro lugar em que surge
um fator igual a 3 no mtodo iterativo padro para calcular a raiz quadrada. Esse mtodo envolve uma nica
diviso por iterao, mas pode ser substitudo por um mtodo que emprega trs multiplicaes. Isso ser discu-
tido no Exerccio H.20.

Resto de ponto flutuante


Para inteiros no-negativos, a diviso e o resto de inteiros satisfazem a:

a = (a DIV b) b + a REM b, 0 a REM b < b

Um resto de ponto flutuante x REM y pode ser definido de forma semelhante como x = INT(x/y)y + x REM y.
Como x/y deve ser convertida em um inteiro? A funo resto do IEEE utiliza a regra de arredondar para o valor
par. Isto , escolha n = INT (x/y), de forma que x / y n 1 / 2. Se dois valores diferente de n satisfizerem a essa
relao, escolha o valor par. Em seguida, REM definido como x yn. Diferente dos inteiros, em que 0 a REM
142 Apndice H Aritmtica de computadores

b < b, para nmeros em ponto flutuante temos x REM y y / 2. Embora isso defina REM com preciso, no
uma definio operacional prtica, porque n pode ser enorme. Em preciso simples, n poderia ser to grande
quanto 2127/2126 = 2253 1076.
Existe um caminho natural para se calcular REM, se for usado um algoritmo de diviso direta. Prossiga
como se voc estivesse calculando x/y. Se x = s1 2 e1 e y = s 2 2 e 2 , e se o divisor for como o da Figura H.2(b), car-
regue s1 em P e s2 em B. Depois de e1 e2 etapas de diviso, o registrador P conter um nmero r da forma x yn
que satisfaz a 0 r < y. Como o resto IEEE satisfaz a REM y/ 2, REM igual a r ou a r y. S necessrio con-
trolar o ltimo bit do quociente produzido, o que necessrio para resolver os casos intermedirios. Infeliz-
mente, e1 e2 pode ter muitas etapas, e as unidades de ponto flutuante em geral tm um perodo mximo de
tempo que podem gastar em uma nica instruo. Desse modo, normalmente no possvel implementar REM
de forma direta. Nenhum dos chips discutidos na Seo H.10 implementa REM, mas eles poderiam faz-lo for-
necendo uma instruo de etapa de resto isso feito na famlia Intel 8087. Uma etapa de resto toma como ar-
gumentos dois nmeros x e y, e executa etapas de diviso at o resto estar em P ou at terem sido executadas n
etapas, onde n um nmero pequeno, como o nmero de etapas necessrias para diviso na preciso mais alta
suportada. Ento, REM pode ser implementado como uma rotina de software que chama a instruo da etapa
REM (e1 e2)/n vezes, inicialmente usando x como numerador, mas depois substituindo-o pelo resto da
etapa de REM anterior.
REM pode ser usado para calcular funes trigonomtricas. Para simplificar, imagine que estamos traba-
lhando na base 10 com cinco dgitos significativos, e considere o clculo de sen x. Suponha que x = 7. Ento, po-
demos reduzir por p = 3.1416 e calcular em vez disso sen(7) = sen(7 2 3,1416) = sen(0,7168). Porm, supo-
nha que desejamos calcular sen(2,0 105). Ento, 2 105/3,1416 = 63661,8 que, em nosso sistema de cinco po-
sies, vem a ser 63662. Tendo em vista que a multiplicao de 3,1416 por 63662 fornece 200000,5392, que ar-
redondamos para 2,0000 105, a reduo de argumentos reduz 2 105 a 0, que no est nem mesmo perto do
valor correto. O problema que nosso sistema de cinco posies no tem a preciso necessria para efetuar a re-
duo de argumentos correta. Vamos supor que tivssemos o operador REM. Ento, poderamos calcular 2
105 REM 3,1416 e obter 0,53920. No entanto, isso ainda no est correto, porque usamos 3,1416, que uma
aproximao para p. O valor de 2 105 REM p 0,071513.
Tradicionalmente, existem duas abordagens para calcular funes peridicas com argumentos grandes. A pri-
meira retornar um erro para seu valor quando x for grande. A segunda armazenar em um nmero muito
grande de posies e efetuar a reduo de argumentos exata. O operador REM no ajuda muito em nenhuma des-
sas situaes. H uma terceira abordagem que usada em algumas bibliotecas de matemtica, como a verso de
Berkeley do UNIX 4.3bsd. Nessas bibliotecas, calculado como o nmero de ponto flutuante mais prximo.
Vamos chamar essa mquina e denot-la por . Ento, quando calcular sen x, reduza x usando . Como vimos
no exemplo anterior, bem diferente de quando x grande, de forma que o clculo de sen x como (x REM )
no dar o valor exato de sen x. Porm, o clculo de funes trigonomtricas dessa maneira tem a propriedade de
que todas as identidades familiares (como sen2 x + cos2 x = 1) so verdadeiras dentro de alguns erros de arredon-
damento. Desse modo, o uso de REM em conjunto com a mquina fornece um mtodo simples para calcular
funes trigonomtricas, exato para pequenos argumentos e que ainda pode ser til para argumentos grandes.
Quando REM usado para reduo de argumentos, ele muito prtico se tambm retorna os bits de baixa or-
dem de n (onde x REM y = x ny). Isso ocorre porque uma implementao prtica de funes trigonomtricas se
reduzir por algo menor que 2p. Por exemplo, ela poderia usar p/2, explorando identidades como (sin(x p/2) =
-cos x, sin(x = p) = -sin x. Ento, os bits baixos de n so necessrios para se escolher a identidade correta.

H.7 Mais informaes sobre aritmtica de ponto flutuante


Antes de deixarmos o assunto de aritmtica de ponto flutuante, apresentaremos alguns tpicos adicionais.

Multiplicaoadio conjuntas
Talvez o uso mais comum das unidades de ponto flutuante seja a execuo de operaes de matrizes, e a opera-
o de matrizes mais freqente a multiplicao de uma matriz por uma matriz (ou vetor), que se reduz a cal-
cular um produto interno, x1 . y1 + x2 . y2 + ... + xn . yn. Esse clculo requer uma srie de combinaes de multi-
plicao-adio.
H.7 Mais informaes sobre aritmtica de ponto flutuante 143

Motivado por isso, o IBM RS/6000 introduziu uma nica instruo que calcula ab + c, a multiplicao-adio
conjuntas. Embora isso exija a capacidade de ler trs operandos em uma nica instruo, tem o potencial para
melhorar o desempenho da computao de produtos internos.
A multiplicao-adio conjuntas calcula ab + c exatamente, e depois efetua o arredondamento. Embora ar-
redondar s uma vez aumente um pouco a exatido de produtos internos, essa no sua principal motivao.
H duas vantagens principais em se arredondar uma vez. Primeiro, como vimos nas sees anteriores, dispen-
dioso implementar o arredondamento, porque ele pode exigir uma adio. Arredondando-se apenas uma vez,
uma operao de adio eliminada. Em segundo lugar, a exatido extra da multiplicao-adio conjuntas
pode ser usada para calcular corretamente a diviso e a raiz quadrada com arredondamento quando essas ope-
raes no esto diretamente disponveis em hardware. A multiplicao-adio conjuntas tambm pode ser
usada para implementar de modo eficiente pacotes de ponto flutuante de preciso mltipla.
A implementao da diviso arredondada de forma correta com a utilizao da multiplicao-adio con-
juntas tem muitos detalhes, mas a idia principal simples. Considere novamente o exemplo da Seo H.6 (p-
gina 141), que foi a computao de a/b com a = 13, b = 51. Ento, 1/b arredondado para b = 0,020, e ab arre-
dondado para q = 0, 26, que no o quociente arredondado de maneira correta. A aplicao da multiplica-
o-adio conjuntas duas vezes ajustar corretamente o resultado, por meio das frmulas

r = a bq
q = q + b

Calculando para exatido de dois dgitos, bq = 51 0, 26 arredondado para 13, e assim r = a bq seria 0,
sem fornecer nenhum ajuste. Porm, o uso da multiplicao-adio conjuntas fornece r = a bq = 13
(51 0, 26) = 0, 26, e ento q = q + rb = 0, 26 0,0052 = 0, 2548, que arredondado para o quociente correto,
0,25. Outros detalhes podem ser encontrados nos artigos de Montoye, Hokenek e Runyon [1990] e Markstein
[1990].

Precises
O padro especifica quatro precises: simples, simples estendida, dupla e dupla estendida. As propriedades des-
sas precises esto resumidas na Figura H.7. As implementaes no so obrigadas a ter todas as quatro pre-
cises, mas so encorajadas a admitir a combinao de simples e simples estendida ou todas as combinaes
de simples, dupla e dupla estendida. Devido ao uso disseminado da preciso dupla em computao cientfica,
a preciso dupla quase sempre implementada. Desse modo, o projetista de computadores em geral s tem
de decidir se deve dar suporte preciso dupla estendida e, se for o caso, quantos bits ela deve ter.
Os co-processadores Motorola 68882 e Intel 387 implementam a preciso estendida usando o menor tama-
nho permissvel de 80 bits (64 bits de significando). No entanto, muitos dos chips de alto desempenho de pon-
to flutuante mais recentemente projetados no implementam a preciso estendida de 80 bits. Uma razo que a
largura de 80 bits da preciso estendida incmoda para barramentos e registradores de 64 bits. Algumas novas
arquiteturas, como SPARC V8 e PA-RISC, especificam uma preciso estendida de 128 bits (ou qudrupla). Elas
estabeleceram uma conveno de facto para preciso qudrupla com 15 bits de expoente e 113 bits de signifi-
cando.
Embora a maioria das linguagens de alto nvel no oferea acesso preciso estendida, ela muito til para
programadores de software matemtico. Como um exemplo, considere a escrita de uma rotina de biblioteca
para calcular o comprimento de um vetor (x,y) no plano, ou seja, x 2 + y 2 . Se x for maior que 2Emax/2, ento
esse clculo da forma bvia ir sofrer estouro. Isso significa que o intervalo de expoente permissvel para essa
sub-rotina ser cortado ao meio ou ter de ser empregado um algoritmo mais complexo usando ajuste de esca-
la. Porm, se a preciso estendida estiver disponvel, o algoritmo simples funcionar. Calcular o comprimento
de um vetor uma tarefa simples, e no difcil elaborar um algoritmo que no sofra estouro. No entanto, exis-
tem problemas mais complexos para os quais a preciso estendida significa a diferena entre um algoritmo sim-
ples e rpido e um algoritmo muito mais complexo. Um dos melhores exemplos desse fato a converso de bi-
nrio para decimal. Um algoritmo eficiente para a converso de binrio para decimal que faz uso essencial da
preciso estendida apresentado de forma muito simples em Coonen [1984]. Esse algoritmo tambm esque-
matizado de modo resumido em Goldberg [1991]. A computao de valores exatos para funes transcenden-
tais outro exemplo de um problema que se torna muito mais fcil se a preciso estendida est presente.
144 Apndice H Aritmtica de computadores

Um fato muito importante sobre a preciso diz respeito ao arredondamento duplo. Para ilustrar em decimais,
vamos supor que queremos calcular 1,9 0,66, e que a preciso simples de dois dgitos, enquanto a preciso
estendida tem trs dgitos. O resultado exato do produto 1,254. Arredondado para preciso estendida, o re-
sultado 1,25. Quando efetuamos o arredondamento adicional para preciso simples, obtemos 1,2. Porm, o
resultado de 1,9 0,66, arredondado corretamente para preciso simples, 1,3. Desse modo, arredondar duas
vezes pode no produzir o mesmo resultado que arredondar uma vez. Suponha que voc queira construir hard-
ware que s efetue aritmtica de preciso dupla. Voc pode simular preciso simples calculando primeiro em
preciso dupla e depois arredondando para simples? O exemplo anterior sugere que isso no possvel. Entre-
tanto, o arredondamento duplo nem sempre perigoso. De fato, a regra a seguir verdadeira (no fcil provar
isso, mas veja o Exerccio H.25).

Se x e y tm significandos de p bits, e se x + y calculada exatamente e depois arredondada para q posies, um segundo


arredondamento para p posies no mudar a resposta se q 2p + 2. Isso verdadeiro no apenas para a adio, mas
tambm para multiplicao, diviso e raiz quadrada.

Em nosso exemplo anterior, q = 3 e p = 2, e assim q 2p + 2 no verdadeira. Por outro lado, para a aritmtica
IEEE, a preciso dupla tem q = 53, p = 24, e assim q = 53 2p + 2 = 50. Desse modo, a preciso simples pode ser
implementada calculando-se em preciso dupla isto , calculando-se a resposta exatamente e depois arredon-
dando-se para preciso dupla e em seguida arredondando-se para preciso simples.

Excees
O padro IEEE define cinco excees: underflow, estouro (overflow), diviso por zero, inexato e invlido. Por
padro, quando essas excees ocorrem, elas simplesmente definem um flag e a computao continua. Os flags
so bits de aderncia, significando que, uma vez ativados, eles permanecem ativos at serem apagados de forma
explcita. O padro encoraja fortemente as implementaes a oferecerem um bit de ativao de trap para cada
exceo. Quando ocorre uma exceo com um tratador de trap ativado, chamado tratador de trap do usurio,
e o valor do flag de exceo associado fica indefinido. Na Seo H.3, mencionamos que 3 tem o valor NaN e
1/0 . Esses so exemplos de operaes que ativam uma exceo. Por padro, o clculo de 3 define o flag
invlido e retorna o valor NaN. De modo semelhante, 1/0 define o flag de diviso por zero e retorna .
As excees de underflow, estouro e diviso por zero so encontradas na maioria dos outros sistemas. A exceo
de invlido corresponde ao resultado de operaes como 1, 0/0 ou , que no tm nenhum valor natural
como um nmero de ponto flutuante ou como . A exceo de inexato peculiar aritmtica IEEE e ocorre quando
o resultado de uma operao deve ser arredondado ou quando ele sofre um estouro. De fato, como 1/0 e uma opera-
o que causa um estouro resultam em , os flags de exceo devem ser consultados para fazer distino entre elas.
A exceo de inexato uma exceo incomum, no sentido de no ser realmente uma condio excepcional por-
que ocorre muito freqentemente. Desse modo, provvel que ativar um tratador de trap para a exceo de inexato
tenha um impacto severo sobre o desempenho. A ativao de um tratador de trap no tem influncia sobre o fato de
uma operao ser excepcional, exceto no caso de underflow. Esse tema ser discutido a seguir.
O padro IEEE pressupe que, quando ocorre uma trap, possvel identificar a operao que foi a respons-
vel e seus operandos. Em mquinas com pipelining ou vrias unidades aritmticas, quando ocorre uma exce-
o, talvez no seja suficiente apenas fazer o tratador de trap examinar o contador do programa. Talvez seja ne-
cessrio o suporte de hardware para identificar exatamente a operao responsvel pela trap.
Outro problema ilustrado pelo fragmento de programa a seguir.

r1 = r2 / r3
r2 = r4 + r5

Essas duas instrues bem poderiam ser executadas em paralelo. Se a diviso provocasse uma trap, seu argu-
mento r2 j poderia ter sido sobrescrito pela adio, especialmente porque a adio quase sempre mais rpida
que a diviso. Os sistemas de computadores que admitem a interceptao (captura) no padro IEEE devem for-
necer algum caminho para salvar o valor de r2, seja em hardware ou fazendo o compilador evitar tal situao
inicialmente. Esse tipo de problema no peculiar ao ponto flutuante. Na seqncia
r1 = 0(r2)
r2 = r3
H.7 Mais informaes sobre aritmtica de ponto flutuante 145

seria eficiente executar r2 = r3 enquanto se espera por memria. Porm, se acessar 0(r2) causar uma falha de
pgina, possvel que r2 no esteja mais disponvel para reiniciar a instruo r1 = 0(r2).
Uma abordagem para esse problema, usada no MIPS R3010, identificar instrues que podem causar uma
exceo prematuramente no ciclo de instrues. Por exemplo, uma adio s pode provocar estouro se um dos
operandos tem um expoente Emax e assim por diante. Essa verificao prematura conservadora: ela pode sina-
lizar uma operao que na realidade no causa uma exceo. No entanto, se tais falsos positivos forem raros,
essa tcnica ter excelente desempenho. Quando uma instruo marcada como possivelmente excepcional,
um cdigo especial no tratador de trap pode calcular a instruo sem destruir qualquer estado. Lembre-se de
que todos esses problemas s ocorrem quando so habilitados tratadores de traps. Caso contrrio, a configura-
o dos flags de exceo durante o processamento normal direto.

Underflow
Aludimos vrias vezes ao fato de que a deteco do underflow mais complexa que no caso das outras exce-
es. O padro IEEE especifica que, se um tratador de trap de underflow estiver habilitado, o sistema dever
ativar a captura se o resultado for no-normalizado. Por outro lado, se os tratadores de trap estiverem desativa-
dos, o flag de underflow s ser definido se existir uma perda de exatido isto , se o resultado necessitar ser
arredondado. O raciocnio que, se no houver nenhuma perda de exatido em um underflow, no haver ne-
nhum sentido em configurar um flag de advertncia. Contudo, se um tratador de trap estivesse habilitado, o
usurio poderia estar tentando simular o esvaziamento at zero e, portanto, deveria ser notificado sempre que
um resultado ficasse abaixo de 1,0 2 E min .
Assim, se no houver nenhum tratador de trap, a exceo de underflow s ser sinalizada quando o resulta-
do for no-normalizado e inexato. Porm, as definies de no-normalizado e inexato esto ambas sujeitas a v-
rias interpretaes. Normalmente, inexato significa que havia um resultado que no podia ser representado
exatamente e teve de ser arredondado. Considere o exemplo (em um sistema de ponto flutuante de base 2 com
significandos de 3 bits) de (1,112 22) (1,11 2 E min ) = 0,1100012 2 E min , com arredondamento at o mais
prximo em efeito. O resultado entregue 0,112 2 E min , que teve de ser arredondado, causando a sinalizao
de inexato. Porm, correto sinalizar tambm o underflow? O underflow gradual perde significado porque o
intervalo de expoentes limitado. Se o intervalo de expoentes fosse ilimitado, o resultado entregue seria 1,102
2 E min -1 , exatamente a mesma resposta obtida com o underflow gradual. O fato de nmeros no-normalizados
terem menor quantidade de bits em seu significando que os nmeros normalizados no faz portanto nenhuma
diferena nesse caso. O comentrio para o padro [Cody et al. 1984] encoraja essa ao como o critrio para
configurar o flag de underflow. Isto , ele deve ser definido sempre que o resultado entregue for diferente do
que seria entregue em um sistema com o mesmo tamanho de frao, mas com um intervalo de expoentes muito
grande. Entretanto, devido dificuldade de implementar esse esquema, o padro permite a configurao do
flag de underflow sempre que o resultado no-normalizado e diferente do resultado infinitamente preciso.
H duas definies possveis do que significa um resultado ser no-normalizado. Considere o exemplo de
1,102 21 multiplicado por 1,012 2 E min . O produto exato 01111
, 2 E min . O resultado arredondado o n-
E min
mero normal 1,00 2 2 . O underflow deve ser sinalizado? Sinalizar o underflow significa que voc est
usando a regra de antes do arredondamento, porque o resultado era no-normalizado antes do arredondamento.
No sinalizar o underflow significa que voc est usando a regra de depois do arredondamento, porque o resulta-
do normalizado aps o arredondamento. O padro IEEE permite a escolha de qualquer regra; porm, a regra
escolhida deve ser usada de forma constante em todas as operaes.
Para ilustrar essas regras, considere a adio de ponto flutuante. Quando o resultado de uma adio (ou sub-
trao) no-normalizado, ela sempre exata. Desse modo, o flag de underflow nunca precisa ser definido para
a adio. Isso ocorre porque, se as traps no estiverem habilitadas, nenhuma exceo ser levantada. Se as traps
estiverem habilitadas, o valor do flag de underflow ser indefinido e assim, mais uma vez, no ser necessrio
ativ-lo.
Uma ltima sutileza deve ser mencionada a respeito do underflow. Quando no existe nenhum tratador de
trap de underflow, o resultado de uma operao sobre nmeros de p bits que cause um underflow ser um n-
mero no-normalizado com p 1 ou menos bits de preciso. Quando as traps esto habilitadas, o tratador de
trap fornecido com o resultado da operao arredondada para p bits e com o expoente junto. Agora, existe um
problema potencial de arredondamento duplo. Se o tratador de trap quiser retornar o resultado no-nor-
146 Apndice H Aritmtica de computadores

malizado, ele no poder simplesmente arredondar seu argumento, porque isso poderia levar a um erro de arre-
dondamento duplo. Desse modo, o tratador de trap deve receber pelo menos um bit extra de informao, se ti-
ver de ser capaz de fornecer o resultado corretamente arredondado.

H.8 Como acelerar a adio de inteiros


A seo anterior mostrou que muitas etapas formam a implementao de operaes de ponto flutuante. Porm,
cada operao de ponto flutuante eventualmente se reduz a uma operao de inteiros. Desse modo, o aumento
da velocidade de operaes de inteiros tambm levar a um ponto flutuante mais rpido.
A adio de inteiros a operao mais simples e a mais importante. Mesmo no caso de programas que no
efetuam aritmtica explcita, a adio deve ser executada para incrementar o contador do programa e calcular
endereos. Apesar da simplicidade da adio, no existe um nico caminho melhor para executar a adio em
alta velocidade. Descreveremos trs tcnicas em uso corrente: carry-lookahead, carry-skip e carry-select.

Carry-lookahead
Um somador de n bits simplesmente um circuito combinacional. Portanto, ele pode ser escrito por uma fr-
mula lgica cuja forma uma soma de produtos, e pode ser calculado por um circuito com dois nveis de lgica.
Como determinar a aparncia desse circuito? A partir da Equao H.2.1 (pgina 120), a frmula para a i-sima
soma pode ser escrita como

H.8.1 si=aibici+aibici+aibici+aibici

onde ci ao mesmo tempo o carry de entrada para o i-simo somador e o carry de sada do (i 1)-simo somador.
O problema com essa frmula que, embora saibamos os valores de ai e bi eles so as entradas para o circui-
to no conhecemos ci. Assim, nosso objetivo escrever ci em termos de ai e bi. Para conseguir isso, primeiro
reescrevemos a Equao H.2.2 (pgina 120) como

H.8.2 ci = g i 1 + p i 1 c1 1 , g i 1 = a i 1 b i 1 , p i 1 = a i 1 + b i 1

Aqui est a razo para os smbolos p e g: se gi1 verdadeiro, ento ci certamente verdadeiro, e assim um
carry gerado. Desse modo, g significa gerar. Se pi1 verdadeiro, ento se ci1 verdadeiro, ele propagado para
ci. Comece com a Equao H.8.1 e utilize a Equao H.8.2 para substituir ci por . Em seguida, use a Equao
H.8.2 com i 1 em lugar de i para substituir ci1 por ci2 e assim por diante. Isso fornece o resultado:

H.8.3 ci = 8i 1 + pi 1 gi 2 + pi pi 2 gi 3 + ... + pi 1 pi 2 ... p1 g0 + pi 1 pi 2 ... p1p0c0

Um somador que calcula carry usando a Equao H.8.3 chamado somador carry-lookahead ou CLA. Um
CLA exige um nico nvel lgico para formar p e g, dois nveis para formar os bits de carry e dois para a soma,
dando um total geral de cinco nveis lgicos. Esse um vasto aperfeioamento em relao aos 2n nveis exigidos
para o somador ripple-carry.
Infelizmente, como bvio a partir da Equao H.8.3 ou da Figura H.14, um somador carry-lookahead so-
bre n bits exige um fan-in de n + 1 na porta OR, como tambm na porta AND mais direita. Alm disso, o sinal
de pn1 deve controlar n portas AND. A estrutura bastante irregular e muitos fios longos da Figura H.14 tornam im-
praticvel construir um somador carry-lookahead total quando n grande.
Porm, podemos usar a idia de carry-lookahead para construir um somador que tem aproximadamente
log2n nveis lgicos (substancialmente menos que o nmero 2n exigido por um somador ripple-carry) e ainda
tem uma estrutura simples e regular. A idia construir os valores de p e g em etapas. J vimos que:

c1 = g0 + c0p0

Isso nos diz que existe um carry de sada da 0-sima posio (c1) se existe um carry gerado na 0-sima posi-
o ou se existe um carry para a 0-sima posio e o carry se propaga. De modo semelhante,

c2 = G01 + P01c0
H.8 Como acelerar a adio de inteiros 147

p g p c
1 0 0 0
g p g p g
n1 n1 n2 n2 n3

c
n
c =g +p g + ... +p p . . . p1g +p p ...p c
n n1 n1 n2 n1 n2 2 n1 n2 0 0

Figura H.14 Circuito de carry-lookahead puro para calcular o carry de sada cn de um somador de n bits.

G01 significa que existe um carry gerado para fora do bloco que consiste nos dois primeiros bits. P01 significa
que um carry se propaga por esse bloco. P e G tm as seguintes equaes lgicas:

G01 = g1 + p1g0

P01 = p1p0

De modo mais geral, para qualquer j com i < j, j + 1 < k, temos as relaes recursivas:

H.8.4 ck+1 = Gik + Pikci

H.8.5 Gik = Gj+1,k + Pj+1,kGij

H.8.6 Pik =PijPj+1,k

A equao H.8.5 nos diz que um carry gerado para fora do bloco e consiste nos bits i a k inclusive, se ele for
gerado na parte de alta ordem do bloco (j + 1, k) ou se ele for gerado na parte de baixa ordem do bloco (i, j) e de-
pois se propagar para a parte alta. Essas equaes tambm so vlidas para i j < k se definimos Gii = gi e Pii = pi.

EXEMPLO Expresse P03 e G03 em termos de valores p e g.


Resposta Usando a Equao H.8.6, P03 = P01P23 = P00P11P22P33. Tendo em vista que Pii = pi, P03 = p0p1p2p3. Para G03, a
Equao H.8.5 nos diz que G03 = G23 + P23G01 = (G33 + P33G22) + (P22P33)(G11 + P11G00 = g3 + p3g2 + p3p2g1 +
p2p3p1g0.

Com esses preliminares fora do caminho, agora podemos mostrar o projeto de um CLA prtico. O somador
consiste em duas partes. A primeira parte calcula vrios valores de P e G a partir de pi e gi, usando as Equaes
H.8.5 e H.8.6; a segunda parte utiliza esses valores de P e G para calcular todos os bits de carry por meio da
Equao H.8.4. A primeira parte do projeto mostrada na Figura H.15. No nvel superior do diagrama, os n-
meros de entrada a7 . . . a0 e b7 . . . b0 so convertidos em valores p e g, com o uso de clulas do tipo 1. Em segui-
da, diversos valores P e G so gerados combinando-se clulas do tipo 2 em uma estrutura de rvore binria. A
segunda parte do projeto mostrada na Figura H.16. Alimentando c0 na parte inferior dessa rvore, todos os
bits de carry terminam no nvel superior. Cada clula deve conhecer um par de valores (P,G), a fim de fazer a
converso, e o valor de que ela necessita escrito dentro das clulas. Agora, compare as Figuras H.15 e H.16.
Existe uma correspondncia individual entre as clulas, e o valor de (P,G) necessrio para as clulas de gerao
de carry exatamente o valor reconhecido pelas clulas correspondentes de gerao de (P,G). A clula combi-
148 Apndice H Aritmtica de computadores

a b a b a b a b a b a b a b a b
7 7 6 6 5 5 4 4 3 3 2 2 1 1 0 0

1 1 1 1 1 1 1 1

g p g p g g
7 7 1 1 0 0

2 2 2 2

G P G P G P G P
6,7 6,7 4,5 4,5 2,3 2,3 0,1 0,1

2 2

G P G P
4,7 4,7 0,3 0,3 a b G
i i j+1, k

2
G
1 2 i,j
G P P
i,j
0,7 0,7

P =P P
g = ab p =a +b i, k i, j j+1, k
i i i i i i
G =G +P G
i, k j+j, k j+1, k i, j

Figura H.15 Primeira parte da rvore de carry-lookahead. medida que os sinais fluem de cima para baixo, so calcula-
dos diversos valores de P e G.

c c c c c c c c
7 6 5 4 3 2 1 0

p p p p
6 4 2 0

g g g g
6 4 2 0

c c c c
6 4 2 0
p p
4, 5 0, 1

G G
4, 5 0, 1

c c
4 0
c =G +P c c
P j+1 i, j i, j i i
0, 3

G
0, 3 P
i, j
c G
0 i, j

c
i

Figura H.16 Segunda parte da rvore de carry-lookahead. Os sinais fluem da parte inferior para a superior, combinan-
do-se com P e G para formar os bits de carry.

nada mostrada na Figura H.17. Os nmeros a serem somados fluem para a parte superior e descem pela rvo-
re, combinando-se com c0 na parte inferior e fluindo de volta para cima na rvore para formar os bits de carry.
Observe que est faltando um detalhe na Figura H.17: um pequeno fragmento de lgica extra para calcular c8,
correspondente ao transporte de sada do somador.
Os bits em um CLA devem passar por aproximadamente log2 n nveis lgicos, em comparao com 2n para
um somador ripple-carry. Essa uma melhoria substancial de velocidade, em especial para n grande. Porm,
enquanto o somador ripple-carry tinha n clulas, o CLA tem 2n clulas, embora em nosso layout elas ocupem o
espao n log n. O importante que um pequeno investimento em tamanho compensado por uma drstica me-
lhoria na velocidade.
Vrias modificaes dependentes da tecnologia podem melhorar os CLAs. Por exemplo, se cada n da rvo-
re tiver trs entradas em vez de duas, a altura da rvore diminuir de log2 n para log3 n. claro que as clulas se-
ro mais complexas e, desse modo, podero operar mais lentamente, negando a vantagem da reduo da altura.
Para tecnologias em que a tcnica de ripple-carry funciona bem, um projeto hbrido pode ser melhor. Isso
ilustrado na Figura H.18. Os bits de carry trafegam entre os somadores no nvel superior, enquanto os retngu-
H.8 Como acelerar a adio de inteiros 149

s s s
7 1 0
a b a b a b
7 7 1 1 0 0

A A A A A A A A

c c c c c c c c
7 6 5 4 3 2 1 0

B B B B

c c c c
6 4 2 0

B B

c
4 G P c
0,3 0,3 0

B
P
s j+1,k
i a b G c
i i j+1,k j+1
c
0
s =a b c G
i i i i ij
A s =a +b B P
i i i
ij
g =a b c
i i i i

g p c G P c
i i i i, k i, k i

Figura H.17 Somador de rvore completa de carry-lookahead. Essa a combinao das Figuras H.15 e H.16. Os nmeros
a serem somados entram na parte superior, fluem at a parte inferior para se combinar com c0, e depois fluem de volta para
cima, a fim de calcular os bits da soma.

los B so os mesmos da Figura H.17. Esse projeto ser mais rpido se o tempo de propagao entre os quatro
somadores for mais rpido que o tempo para percorrer um nvel de retngulos B. (Para tornar o padro mais
claro, a Figura H.18 mostra um somador de 16 bits, e assim o somador de 8 bits da Figura H.17 corresponde
metade direita da Figura H.18.)

Somadores carry-skip
Um somador carry-skip fica no meio do caminho entre um somador ripple-carry e um somador carry-
lookahead, tanto em termos de velocidade quanto de custo. (Um somador carry-skip no denominado CSA,
pois esse nome reservado para somadores carry-save.) A motivao para esse somador vem do exame das
equaes correspondentes a P e G. Por exemplo,

P03 = p0p1p2p3

G03 = g3 + p3g2 + p3p2g1 + p3p2p1g0

c c c c c c
15 14 13 3 2 1

C c C c C c C c
12 8 4 0

P P G
12, 15 0, 3 0, 3
B B

P c c
8, 15 8 0
P
0, 7
B

c
0

Figura H.18 Combinao de CLA e somador ripple-carry. Na linha superior, os bits de carry se propagam por ondulao
dentro de cada grupo de quatro retngulos.
150 Apndice H Aritmtica de computadores

Calcular P muito mais simples que calcular G, e um somador carry-skip s calcula os valores de P. Um so-
mador desse tipo est ilustrado na Figura H.19. Os bits de carry comeam percorrendo simultaneamente cada
bloco. Se qualquer bloco gerar um carry, o carry de sada de um bloco ser verdadeiro, embora o carry de entra-
da no bloco talvez ainda no seja correto. Se, no incio de cada operao de adio, o carry para cada bloco for 0,
no ser gerado nenhum carry de sada esprio. Desse modo, o carry de sada de cada bloco poder ento ser
imaginado como se fosse o sinal de G. Uma vez que o carry de sada do bloco menos significativo gerado, ele
no apenas alimenta o prximo bloco, mas tambm alimentado pela porta AND com o sinal P de cada bloco
seguinte. Se os sinais de carry de sada e P forem ambos verdadeiros, o carry saltar o segundo bloco e ficar
pronto para alimentar o terceiro bloco e assim por diante. O somador carry-skip s prtico se os sinais de
carry de entrada puderem ser limpos com facilidade no incio de cada operao por exemplo, pelo
pr-carregamento em CMOS.
Para analisar a velocidade de um somador carry-skip, vamos supor que demore uma unidade de tempo para
um sinal passar por dois nveis lgicos. Ento, um carry levar k unidades de tempo para passar por um bloco
de tamanho k, e ele levar uma unidade de tempo para saltar um bloco. O caminho de sinal mais longo no so-
mador carry-skip comea com a gerao de um carry na 0-sima posio. Se o somador tiver n bits de largura,
ele ir demorar k unidades de tempo para percorrer o primeiro bloco, n/k 2 unidades de tempo para saltar blo-
cos, e mais k para percorrer o ltimo bloco. Em termos especficos: se tivermos um somador de 20 bits dividido
em grupos de 4 bits, ele levar 4 + (20/4 2) + 4 = 11 unidades de tempo para executar uma adio. Um pouco
de experimentao revela que existem caminhos mais eficientes para dividir 20 bits em blocos. Por exemplo,
considere cinco blocos com os 2 bits menos significativos no primeiro bloco, os 5 bits seguintes no segundo
bloco, seguidos por blocos de tamanho 6, 5 e 2. Ento, o tempo de adio ser reduzido a 9 unidades de tempo.
Isso ilustra um importante princpio geral. Para um somador carry-skip, tornar os blocos interiores maiores ir
acelerar o somador. De fato, a mesma idia de variar os tamanhos de blocos pode s vezes acelerar tambm ou-
tros projetos de somadores. Devido grande quantidade de propagao, um somador carry-skip mais apro-
priado para tecnologias em que a propagao rpida.

Somador carry-select
Um somador carry-select funciona sobre o seguinte princpio: duas adies so executadas em paralelo, uma su-
pondo que o carry de entrada 0 e a outra supondo que o carry de entrada 1. Quando o carry de entrada fi-
nalmente conhecido, a soma correta (que foi calculada previamente) simplesmente selecionada. Um exemplo
de tal projeto mostrado na Figura H.20. Um somador de 8 bits dividido em duas metades, e o carry de sada
da metade inferior usado para selecionar os bits da soma da metade superior. Se cada bloco estiver calculando
sua soma com o uso de ripple-carry (um algoritmo de tempo linear), o projeto da Figura H.20 ser duas vezes
mais rpido a um custo 50% maior. Porm, observe que o sinal de c4 deve controlar muitos multiplexadores
(muxes), que podem ser muito lentos em algumas tecnologias. Em vez de dividir o somador em metades, ele
poderia ser dividido em quatro partes, permitindo uma acelerao ainda maior. Isso ilustrado na Figura H.21.
Se um bloco demorar k unidades de tempo para somar nmeros de k bits e demorar uma unidade de tempo para
calcular a entrada do mux a partir dos dois sinais de carry de sada, ento cada bloco para tornar a operao
tima deve ser 1 bit maior que o seguinte, como mostra a Figura H.21. Assim, como no somador carry-skip, o
melhor projeto envolve blocos de tamanho varivel.

a b a b a b a b a b a b
19 19 18 18 3 3 2 2 1 1 0 0

c c c c c
20 16 12 8 4
c
0

P P P
12, 15 8, 11 4, 7

Figura H.19 Somador carry-skip. Esse um somador carry-skip de 20 bits (n = 20); cada bloco tem 4 bits de largura (k = 4).
H.9 Como acelerar a multiplicao e a diviso de inteiros 151

a b a b
7 7 4 4

a b a b a b a b
0 3 3 2 2 1 1 0 0

a b c
4 4 0

1 s s s s
3 2 1 0

c
4
s s s s
7 6 5 4

Figura H.20 Somador carry-select simples. Ao mesmo tempo que a soma dos 4 bits de baixa ordem est sendo calculada,
os bits de alta ordem so calculados duas vezes em paralelo: uma vez supondo que c4 = 0 e uma vez supondo c4 = 1.

c c
13 8
0 0 0
c
4
c c
13 8 s s s s
1 1 1 3 2 1 0

s s s s s s
18 17 16 15 14 13 s s s s s
12 11 10 9 8 s s s s
7 6 5 4

Figura H.21 Somador carry-select. Logo que o carry de sada do bloco mais direita conhecido, ele usado para selecio-
nar os outros bits da soma.

Como um resumo desta seo, o tempo assinttico e os requisitos de espao para os diferentes somadores
so dados na Figura H.22. (Os tempos para carry-skip e carry-select vm de uma escolha cuidadosa do tamanho
do bloco. Veja o Exerccio H.26 para o somador carry-skip.) Esses diferentes somadores no devem ser consi-
derados escolhas disjuntas, mas sim blocos de construo a serem usados na elaborao de um somador. A uti-
lidade desses diferentes blocos de construo altamente dependente da tecnologia usada. Por exemplo, o so-
mador carry-select funciona bem quando um sinal pode controlar muitos muxes, e o somador carry-skip
atraente em tecnologias nas quais os sinais podem ser apagados no incio de cada operao. Conhecer o com-
portamento assinttico de somadores til para entend-los, mas confiar demais nesse comportamento uma
trap, porque esse comportamento assinttico s importante medida que n cresce grandemente. Porm, n
para um somador representa os bits de preciso, e a preciso dupla atual igual de 20 anos atrs cerca de 53
bits. Embora seja verdade que os computadores se tornam cada vez mais rpidos, os clculos ficam mais demo-
rados e portanto tm mais erros de arredondamento que, por sua vez, requer maior preciso e esse efeito
cresce muito lentamente com o tempo.

H.9 Como acelerar a multiplicao e a diviso de inteiros


Os algoritmos de multiplicao e diviso apresentados na Seo H.2 so bastante lentos, produzindo 1 bit por
ciclo (embora esse ciclo pudesse ser uma frao do tempo do ciclo de instrues da CPU). Nesta seo, discuti-
remos vrias tcnicas para aumentar o desempenho da multiplicao e da diviso, inclusive o algoritmo de divi-
so usado no chip Pentium.

Somador Tempo Espao

Ripple O(n) O(n)


CLA O(log n) O(n log n)
Carry-skip O( n) O(n)
Carry-select O( n) O(n)
Figura H.22 Tempo assinttico e requisitos de espao para quatro tipos diferentes de somadores
152 Apndice H Aritmtica de computadores

Deslocamento sobre zeros


Embora a tcnica de deslocamento sobre zeros no seja muito usada atualmente, instrutivo examin-la. Ela se
distingue pelo fato de seu tempo de execuo depender dos operandos. Sua pouca utilizao pode ser atribuda
principalmente impossibilidade de oferecer acelerao suficiente sobre algoritmos a um bit de cada vez. Alm
disso, o pipelining, a sincronizao com a CPU e a boa otimizao do compilador so difceis com algoritmos
executados em tempo varivel. Na multiplicao, a idia que rege o deslocamento sobre zeros adicionar lgica
que detecte quando o bit de baixa ordem do registrador A 0 (veja a Figura H.2(a) e, nesse caso, ignore a etapa
de adio e passe diretamente para a etapa de deslocamento da a expresso deslocamento sobre zeros.
E o deslocamento no caso da diviso? Na diviso sem restaurao, uma operao da ULA (uma adio ou
uma subtrao) executada em cada etapa. Aparentemente no h nenhuma oportunidade para ignorar uma
operao. Porm, pense na diviso deste modo: para calcular a/b, subtraia de a mltiplos de b, e depois informe
quantas subtraes foram feitas. Em cada fase do processo de subtrao, o resto deve caber no registrador P da
Figura H.2(b). No caso em que o resto um nmero positivo pequeno, normalmente voc subtrai b; porm, su-
ponha que em vez disso voc s deslocasse o resto e subtrasse b apenas na prxima vez. Desde que o resto fosse
suficientemente pequeno (seu bit de alta ordem seja 0), depois de desloc-lo, ele ainda caberia no registrador P,
e nenhuma informao seria perdida. Entretanto, esse mtodo exige mudar o modo como controlamos o n-
mero de vezes que b subtrado de a. Essa idia normalmente recebe o nome de diviso SRT, indicando Swee-
ney, Robertson e Tocher, que propuseram independentemente algoritmos dessa natureza. A principal compli-
cao extra da diviso SRT que os bits do quociente no podem ser determinados de imediato a partir do sinal
de P em cada etapa, como eles podem ser determinados na diviso sem restaurao comum.
Mais exatamente, para dividir a por b, onde a e b so nmeros de n bits, carregue a e b nos registradores A e B,
respectivamente, da Figura H.2.

Diviso SRT 1. Se B tem k zeros iniciais quando expresso com n bits, deslocar todos os registradores k bits esquerda.
Diviso SRT 2. Para i = 0, n 1,
(a) Se os trs bits superiores de P so iguais, definir qi = 0 e deslocar (P,A) um bit esquerda.
(b) Se os trs bits superiores de P no so todos iguais e P negativo, definir qi = 1 (tambm es-
crito como 1), deslocar (P,A) um bit esquerda e somar B.
(c) Caso contrrio, definir qi = 1, deslocar (P,A) um bit esquerda e subtrair B.
Fim do loop
Diviso SRT 3. Se o resto final negativo, corrigir o resto somando B e corrigir o quociente subtraindo 1 de q0. Final-
mente, o resto deve ser deslocado k bits direita, onde k o deslocamento inicial.
Um exemplo numrico dado na Figura H.23. Embora estejamos discutindo a diviso de inteiros, ele ajuda
a explicar o algoritmo para imaginar o ponto binrio imediatamente esquerda do bit mais significativo. Isso
altera a Figura H.23 de 010002/00112 para 0.10002/.00112. Como o ponto binrio alterado no numerador e no
denominador, o quociente no afetado. O par de registradores (P,A) contm o resto e um nmero em com-
plemento de dois. Por exemplo, se P contm 111102 e A = 0, ento o resto 1.11102 = 1/8. Se r o valor do res-
to, ento 1 r < 1.
Dados esses preliminares, agora podemos analisar o algoritmo de diviso SRT. A primeira etapa do algorit-
mo desloca b, de forma que b . A regra que define qual operao da ULA executar esta: se 1/4 r < 1/4
(verdadeira sempre que os trs bits superiores de P so iguais), ento calcular 2r deslocando (P,A) um bit es-
querda; se no, se r < 0 (e conseqentemente r < 1/4, pois caso contrrio teria sido eliminado pela primeira
condio), calcular 2r + b, deslocando e depois somando; se no, fazer r 1/4 e subtrair b de 2r. Usando b 1/2,
fcil verificar que essas regras mantm 1/2 r < . No caso da diviso sem restaurao, s temos r b, e
necessrio que P tenha n + 1 bits de largura. Porm, para diviso SRT, o limite sobre r mais restrito, isto , 1/2
r < . Desse modo, podemos economizar um bit eliminando o bit de alta ordem de P (e tambm b e o somador).
Em particular, o teste de igualdade dos trs bits superiores de P se torna um teste sobre apenas dois bits.
O algoritmo poderia mudar ligeiramente em uma implementao da diviso SRT. Depois de cada operao
da ULA, o registrador P pode ser deslocado tantas posies quantas necessrias para fazer r 1/4 ou r < 1/4.
Deslocando k posies, k bits do quociente so definidos como iguais a zero, todos de uma vez. Por essa razo, a
diviso SRT s vezes descrita como uma diviso que mantm o resto normalizado para r 1 / 4.
H.9 Como acelerar a multiplicao e a diviso de inteiros 153

P A
00000 1000 Dividir 8 = 1000 por 3 = 0011. B contm 0011.
00010 0000 Etapa 1: B tinha dois zeros iniciais; deslocar esquerda 2. Agora B contm 1100.
Etapa 2.1: Os trs bits superiores so iguais. Esse o caso (a); ento
00100 0000 definir q = 0 e deslocar.
0
Etapa 2.2: Os trs bits superiores no so iguais e P > 0; o caso (c), ento
01000 0001 definir q = 1 e deslocar.
1
+ 10100 Subtrair B.
11100 0001 Etapa 2.3: Os bits superiores so iguais; o caso (a), ento
11000 0010 definir q = 0 e deslocar.
2
Etapa 2.4: Os trs bits superiores so desiguais; o caso (b), ento
10000 0101 definir q = 1 e deslocar.
3
+ 01100 Somar B.
11100 Etapa 3. O resto negativo; assim, restaur-lo e subtrair 1 de q.
+ 01100
01000 preciso desfazer o deslocamento da etapa 1; ento, deslocar direita 2 unidades para obter resto verdadeiro.
Resto = 10, quociente = 010 1 = 0010.

Figura H.23 Diviso SRT de 10002/00112. Os bits do quociente so mostrados em negrito, usando-se a notao 1 para re-
presentar 1.

Note que o valor do bit do quociente calculado em uma dada etapa se baseia na operao executada nessa
etapa (que, por sua vez, depende do resultado da operao da etapa anterior). Isso contrasta com a diviso sem
restaurao, na qual o bit do quociente calculado na i-sima etapa depende do resultado da operao na mesma
etapa. Essa diferena se reflete no fato de que, quando o resto final negativo, o ltimo bit do quociente tem de
ser ajustado na diviso SRT, mas no na diviso sem restaurao. Porm, o fato fundamental sobre os bits do
quociente na diviso SRT que eles podem incluir 1. Embora a Figura H.23 mostre os bits do quociente sendo
armazenados nos bits de baixa ordem de A, uma implementao real no pode fazer isso, porque no possvel
encaixar os trs valores, 1, 0, 1, em um nico bit. Alm disso, o quociente deve ser convertido para comple-
mento de dois comum em um somador completo. Uma forma simples de fazer isso acumular os bits do quoci-
ente positivo em um registrador e os bits do quociente negativo em outro, depois subtrair os dois registradores,
aps todos os bits serem conhecidos. Pelo fato de existir mais de um modo de escrever um nmero em termos
dos dgitos 1, 0, 1, dizemos que a diviso SRT utiliza uma representao de quociente redundante.
As diferenas entre diviso SRT e diviso comum sem restaurao podem ser resumidas como a seguir:
1. Regra de deciso da ULA: na diviso sem restaurao, ela determinada pelo sinal de P; em SRT, ela deter-
minada pelos dois bits mais significativos de P.
2. Quociente final: na diviso sem restaurao, ela imediata a partir dos sinais sucessivos de P; em SRT, exis-
tem trs dgitos de quociente (1, 0, 1), e o quociente final deve ser calculado em um somador completo de n
bits.
3. Velocidade: a diviso SRT ser mais rpida sobre operandos que produzem zero bit de quociente.

A verso simples do algoritmo de diviso SRT dada antes no oferece acelerao suficiente para ser prtica
na maioria dos casos. Porm, estudaremos mais adiante nesta seo variantes da diviso SRT que so bastante
prticas.

Como acelerar a multiplicao com um nico somador


Como mencionamos antes, as tcnicas de deslocamento sobre zero no so muito usadas no hardware atual.
Agora, descreveremos alguns mtodos que esto em uso disseminado. Os mtodos que aumentam a velocidade
da multiplicao podem ser divididos em duas classes: aqueles que utilizam um nico somador e aqueles que
utilizam vrios somadores. Vamos descrever em primeiro lugar as tcnicas que empregam um nico somador.
Na descrio da adio notamos que, devido propagao de carry, no prtico efetuar a adio com dois
nveis de lgica. Usando as clulas da Figura H.17, a soma dois nmeros de 64 bits exigir uma viagem por sete
154 Apndice H Aritmtica de computadores

clulas para calcular os valores de P e G, e mais sete para calcular os bits de carry, o que exigir pelo menos 28
nveis de lgica. No multiplicador simples da Figura H.2, cada etapa de multiplicao passa por esse somador.
A quantidade de computao em cada etapa pode ser drasticamente reduzida com a utilizao de somadores
carry-save (CSAs). Um somador carry-save simplesmente uma coleo de n somadores completos indepen-
dentes. Um multiplicador que utiliza tal somador ilustrado na Figura H.24. Cada crculo marcado com +
um somador completo de um nico bit, e cada retngulo representa um bit de um registrador. Cada operao
de adio resulta em um par de bits, armazenados nas partes de soma e carry de P. Tendo em vista que cada
soma independente, apenas dois nveis de lgica esto envolvidos na adio uma ampla melhoria em com-
parao a 28 nveis.
Para operar o multiplicador da Figura H.24, carregue os bits de soma e carry de P com zero e execute a pri-
meira operao da ULA. (Se for utilizada a recodificao de Booth, ela poder ser uma subtrao, em vez de
uma adio.) Em seguida, desloque o bit soma de baixa ordem de P para A, deslocando tambm o prprio A.
Os n 1 bits de alta ordem de P no precisam ser deslocados, porque no prximo ciclo os bits de soma sero
alimentados no somador de ordem mais baixa seguinte. Cada etapa de adio tem sua velocidade substancial-
mente aumentada, pois cada clula de adio funciona de forma independente das outras, e nenhum carry
propagado.
Existem duas desvantagens nos somadores carry-save. Primeiro, eles exigem mais hardware, porque deve
haver uma cpia do registrador P para conter as sadas de carry do somador. Em segundo lugar, depois da lti-
ma etapa, a palavra de alta ordem do resultado deve ser alimentada em um somador comum para combinar as
partes de soma e carry. Um modo de conseguir isso alimentar a sada de P no somador usado para executar a
operao de adio. A multiplicao com um somador carry-save s vezes chamada multiplicao redundan-
te, porque P representado com o uso de dois registradores. Tendo em vista que existem muitas maneiras de
representar P como a soma de dois registradores, essa representao redundante. A expresso somador
carry-propagate (CPA) usada para denotar um somador que no um CSA. O somador de propagao pode
propagar seus bits de carry usando ripple-carry, carry-lookahead ou algum outro mtodo.
Outra maneira de acelerar a multiplicao sem usar somadores extras examinar os k bits de baixa ordem
de A em cada etapa, em vez de apenas um bit. Com freqncia, isso chamado multiplicao de base mais alta.
Como um exemplo, suponha que k = 2. Se o par de bits for 00, adicione 0 a P; se ele for 01, adicione B. Se for
10, basta deslocar b um bit para a esquerda antes de som-lo a P. Infelizmente, se o par fosse 11, parece que
teramos de calcular b + 2b. No entanto, isso pode ser evitado usando-se uma verso de base mais alta da reco-
dificao de Booth. Imagine A como um nmero na base 4: quando surgir o dgito 3, altere-o para 1 e some 1
ao prximo dgito mais alto, a fim de compensar. Um benefcio extra de se usar esse esquema que, seme-
lhante recodificao de Booth comum, ele funciona para inteiros negativos, bem como para inteiros positi-
vos (Seo H.2).
As regras precisas para recodificao de Booth na base 4 so dadas na Figura H.25. Na i-sima etapa de mul-
tiplicao, os dois bits de baixa ordem do registrador A contm a2i e a2i+1. Esses dois bits, juntamente com o bit
que acabou de ser deslocado (a2i-1), so usados para selecionar o mltiplo de b que deve ser somado ao registra-
dor P. Um exemplo numrico dado na Figura H.26. Outro nome para essa tcnica de multiplicao overlap-
ping triplets (sobreposio de terceto), pois ela examina 3 bits para determinar que mltiplo de b utilizar, en-
quanto a recodificao de Booth comum examina 2 bits.

P
Bits de transporte Deslocamento

Bits da soma

A
c s
+ + + + + + i+1 i

c
i +
a
i
B

b
i

Figura H.24 Multiplicador carry-save. Cada crculo representa um somador (3,2) funcionando independentemente. Em
cada etapa, o nico bit de P que precisa ser deslocado o bit soma de baixa ordem.
H.9 Como acelerar a multiplicao e a diviso de inteiros 155

Bits de baixa ordem de A ltimo bit deslocado

2i + 1 2i 2i 1 Mltiplo
0 0 0 0
0 0 1 +b
0 1 0 +b
0 1 1 +2b
1 0 0 2b
1 0 1 b
1 1 0 b
1 1 1 0
Figura H.25 Mltiplos de b a utilizar para recodificao de Booth na base 4. Por exemplo, se os dois bits de baixa ordem
do registrador A forem ambos iguais a 1 e o ltimo bit a ser deslocado do registrador A for 0, ento o mltiplo correto ser b,
obtido na penltima linha da tabela.

P A L
00000 1001 Multiplicar 7 = 1001 vezes 5 = 1011. B contm 1011.
+ 11011 Os bits de baixa ordem de A so 0, 1; L = 0; ento, somar B.
11011 1001
11110 1110 0 Deslocar direita dois bits, deslocando os valores 1 no lado esquerdo.
+ 01010 Os bits de baixa ordem de A so 1, 0; L = 0; ento, somar 2b.
01000 1110 0
00010 0011 1 Deslocar direita dois bits.
O produto 35 = 0100011.

Figura H.26 Multiplicao de 7 por 5 usando a recodificao de Booth na base 4. A coluna identificada com L contm
o ltimo bit deslocado da extremidade direita de A.

Alm de ter lgica de controle mais complexa, a tcnica de sobreposio de terceto tambm exige que o re-
gistrador P seja 1 bit maior, a fim de acomodar a possibilidade de 2b ou 2b ser somado a ele. possvel usar
uma verso de recodificao de Booth de base 8 (ou ainda mais alta). Porm, nesse caso, seria necessrio usar o
mltiplo 3B como uma parcela potencial. Normalmente, os multiplicadores na base 8 calculam 3B de uma vez
por todas no incio de uma operao de multiplicao.

Multiplicao mais rpida com muitos somadores


Se houver espao disponvel para muitos somadores, a velocidade da multiplicao poder ser melhorada. A Fi-
gura H.27 mostra um multiplicador de array simples para multiplicar dois nmeros de 5 bits, usando trs CSAs
e um somador de propagao. A parte (a) um diagrama de blocos do tipo que usaremos ao longo desta seo.
As partes (b) e (c) mostram o somador em mais detalhes. Todas as entradas para o somador so mostradas em
(b); os somadores reais com suas interconexes so mostrados em (c). Cada linha de somadores em (c) corres-
ponde a um retngulo em (a). O quadro est distorcido, de forma que bits de mesmo significado fiquem na
mesma coluna. Em uma implementao real, mais provvel que o array fique organizado como um quadrado.
O multiplicador de array na Figura H.27 executa o mesmo nmero de adies que o projeto da Figura H.24;
assim, sua latncia no drasticamente diferente da latncia de um nico somador carry-save. Porm, com o
hardware da Figura H.27, a multiplicao pode ser canalizada, aumentando o throughput total. Por outro lado,
embora esse nvel de pipelining s vezes seja utilizado em processadores de arrays, ele no empregado em ne-
nhum dos aceleradores de ponto flutuante de um nico chip discutidos na Seo H.10. O pipelining descrito
de forma geral no Apndice A e por Kogge [1981] no contexto de multiplicadores.
s vezes, o espao reservado em um chip para aritmtica pode no conter um array grande o bastante para
multiplicar dois nmeros de preciso dupla. Nesse caso, um projeto popular usar um arranjo de duas passagens,
como o da Figura H.28. A primeira passagem pelo array retira 5 bits de B. Em seguida, o resultado dessa primei-
ra passagem inserido de volta no incio para ser combinado s trs parcelas seguintes. O resultado dessa segunda
passagem ento colocado em um CPA. Contudo, esse projeto perde a capacidade de ser canalizado.
156 Apndice H Aritmtica de computadores

b A b A b A
2 1 0

b A b A
4 3

CSA

(a)
CSA

CSA

Somador de propagao

b a b a
0 1 0 0

b A
0
b A
(b) 1
b A
2
b A
3
b A
4
b a b a
4 1 4 0

b a b A
0 4 0

b a b A
1 4 1
b A
2

(c)

p p p p p p p p p p
9 8 7 6 5 4 3 2 1 0

Figura H.27 Um multiplicador de arrays. O nmero de 5 bits em A multiplicado por b4b3b2b1b0. A parte (a) mostra o dia-
grama de blocos, (b) mostra as entradas para o array e (c) expande o array para mostrar todos os somadores.

b A
5
b A b A b A
2 1 0

b A
8
b A CSA
3

b A
7
b A CSA
4

CSA

CPA

Figura H.28 Multiplicador de array de vrias passagens. Multiplica dois nmeros de 8 bits com cerca de metade do hard-
ware que seria usado em um projeto de uma nica passagem, como o da Figura H.27. No final da segunda passagem, os bits
fluem para o CPA. As entradas usadas na primeira passagem esto marcadas em negrito.

Se os arrays exigem tantas etapas de adio quanto as organizaes muito mais econmicas das Figuras H.2 e
H.24, por que eles so to populares? Antes de tudo, a utilizao de um array tem uma latncia menor que o uso
de um nico somador como o array um circuito combinacional, os sinais fluem por ele diretamente, sem
usarem um clock. Embora o somador de duas passagens da Figura H.28 normalmente utilize um clock, o tem-
po do ciclo para a passagem por k arrays pode ser menor que k vezes o clock que seria necessrio para projetos
como os da Figura H.2 ou H.24. Em segundo lugar, o array acessvel a vrios esquemas para aumentar a acele-
rao. Um deles mostrado na Figura H.29. A idia desse projeto efetuar duas adies em paralelo ou, em ou-
H.9 Como acelerar a multiplicao e a diviso de inteiros 157
b A b A b A
2 1 0

CSA

b A b A b A
5 4 3

CSA

b A
6

CSA

b A
7

CSA

CSA

CSA

CSA

Figura H.29 Array par/mpar. Os dois primeiros somadores funcionam em paralelo. Seus resultados so entregues ao ter-
ceiro e ao quarto somador; esses dois somadores tambm funcionam em paralelo e assim por diante.

tras palavras, cada fluxo passar somente por metade dos somadores. Desse modo, ele funciona em velocidade
quase duas vezes maior que a do multiplicador da Figura H.27. Esse multiplicador par/mpar popular em
VLSI, em virtude de sua estrutura regular. Os arrays tambm podem ser acelerados com o uso de lgica assn-
crona. Uma das razes pelas quais o multiplicador da Figura H.2 necessita de um clock para impedir que a sa-
da do somador volte a alimentar a entrada do somador antes de a sada ser completamente estabilizada. Desse
modo, se o array da Figura H.28 for longo o bastante para que nenhum sinal possa se propagar de cima para bai-
xo no tempo necessrio para o primeiro somador se estabilizar, talvez seja possvel evitar por completo os
clocks. Williams et al. [1987] discutem um projeto que utiliza essa idia, embora ele se refira a divisores, em
vez de multiplicadores.
As tcnicas do pargrafo anterior ainda tm um tempo de multiplicao igual a O(n), mas o tempo pode ser
reduzido para log n com o uso de uma rvore. A rvore mais simples combinaria pares de parcelas, reduzindo o
nmero de parcelas de n para n/2. Em seguida, esses n/2 nmeros seriam novamente somados aos pares, redu-
zindo seu nmero para n/4 e assim por diante, resultando em uma nica soma depois de log n etapas. Porm,
essa idia simples de rvore binria no corresponde a somadores completos (3,2), que reduzem trs entradas a
duas, em vez de reduzirem duas entradas a uma s. Uma rvore que utiliza somadores completos, conhecida
como rvore de Wallace, mostrada na Figura H.30. Quando unidades aritmticas de computadores eram cons-
trudas a partir de peas MSI, uma rvore de Wallace era o projeto preferido para multiplicadores de alta veloci-
dade. No entanto, h um problema com a implementao desse projeto em VLSI. Se tentar preencher todos os
somadores e caminhos para a rvore de Wallace da Figura H.30, voc descobrir que ela no tem a estrutura
elegante e regular da Figura H.27. Isso ocorre porque os projetistas do VLSI freqentemente optavam por usar
outros projetos de log n, como o multiplicador de rvore binria, que discutiremos em seguida.
O problema com a adio de parcelas em uma rvore binria a chegada de somador (2,1) que combina dois
dgitos e produz um nico dgito de soma. Devido aos bits de carry, isso no possvel com o uso da notao bi-
nria, mas pode ser feito com alguma outra representao. Utilizaremos a representao de dgito com sinal 1, 1 e
0, que usamos anteriormente para entender o algoritmo de Booth. Essa representao tem dois custos. Primei-
ro, so necessrios 2 bits para representar cada dgito com sinal. Em segundo lugar, o algoritmo para somar
dois nmeros de dgitos com sinal ai e bi complexa e exige o exame de aia1ai2 e bibi1bi2. Embora isso signifi-
que que voc deve examinar 2 bits anteriores, em adio binria talvez seja necessrio examinar um nmero ar-
bitrrio de bits anteriores, devido aos bits de carry.
158 Apndice H Aritmtica de computadores

b A b A b A b A b A b A b A b A
7 6 5 4 3 2 1 0

CSA CSA

CSA CSA

CSA

CSA

Somador de propagao

Figura H.30 Multiplicador de rvore de Wallace. Um exemplo de rvore de multiplicao que calcula um produto em 0(log
n) etapas.

Podemos descrever o algoritmo para somar dois nmeros de dgito com sinal da maneira ilustrada a seguir.
Primeiro, calcule os bits de soma e carry si e ci+1 usando a Figura H.31. Em seguida, calcule a soma final como
si + ci. As tabelas esto configuradas de forma que essa soma final no gere um carry.

EXEMPLO Qual a soma dos nmeros de dgito com sinal 1102 e 0012?
Resposta Os dois bits de baixa ordem tm a soma 0 + 1 = 11, o par seguinte soma 1 + 0 = 01, e o par de alta ordem tem a
soma 1 + 0 = 01; assim, a soma 11 + 010 + 0100 = 1012.

Portanto, isso define um somador (2,1). Com isso em mos, podemos usar uma rvore binria direta para
executar a multiplicao. Na primeira etapa, ela soma b0A + b1A em paralelo com b2A + b3A, . . . , bn2A + bn1A.
A prxima etapa soma os resultados dessas somas aos pares e assim por diante. Embora a soma final deva ser
executada por um somador carry-propagate para convert-la da forma de dgito com sinal em complemento de
dois, essa ltima etapa de adio necessria em qualquer multiplicador que utilize CSAs.
Para resumir, tanto as rvores de Wallace quanto as rvores de dgito com sinal so multiplicadores de log n.
A rvore de Wallace utiliza um nmero menor de portas, embora seja mais difcil de esquematizar. A rvore de
dgito com sinal tem uma estrutura mais regular, mas exige 2 bits para representar cada dgito e tem uma lgica
de adio mais complicada. Como ocorre no caso dos somadores, possvel combinar diferentes tcnicas de
multiplicao. Por exemplo, podemos combinar a recodificao de Booth e os arrays.
Na Figura H.27, em vez de fazer cada entrada igual a biA, poderamos utilizar bibi1A. Para evitar ter de calcu-
lar o mltiplo 3b, pode-se empregar a recodificao de Booth.

Diviso mais rpida com um nico somador


As duas tcnicas que discutimos para acelerar a multiplicao com um nico somador foram os somadores
carry-save e a multiplicao de base mais alta. No entanto, existe uma dificuldade ao se tentar utilizar essas
abordagens para acelerar a diviso sem restaurao. Se o somador da Figura H.2(b) for substitudo por um so-
mador carry-save, P ser substitudo por dois registradores, um para os bits de soma e um para os bits de carry
(compare com o multiplicador da Figura H.24). No fim de cada ciclo, o sinal de P incerto (pois P a soma no-
avaliada dos dois registradores), ainda que o sinal de P seja usado para calcular o dgito do quociente e decidir

1 1 1 0 1x 1x
+1 +1 +1 +0 +0y +0y
10 00 10 00 11 Se x 0 e y 0 1 1 Se x 0 e y 0
01 caso contrrio 1 1 caso contrrio

Figura H.31 Tabela de adio de dgito com sinal. A soma mais esquerda mostra que, ao se calcular 1 + 1, o bit soma 0
e o bit de carry 1.
H.9 Como acelerar a multiplicao e a diviso de inteiros 159

sobre a prxima operao da ULA. Quando utilizada uma base mais alta, o problema decidir que valor sub-
trair de P. No mtodo de lpis e papel, voc tem de supor o dgito do quociente. Em diviso binria, s h duas
possibilidades. Poderamos refinar o problema supondo inicialmente uma delas e depois ajustando a suposio
com base no sinal de P. Isso no funciona em bases mais altas, porque h mais de dois dgitos possveis do quo-
ciente, o que resulta em uma seleo de quociente potencialmente muito complicada: voc teria de calcular to-
dos os mltiplos de b e compar-los a P.
Podemos fazer funcionar tanto a tcnica de carry-save quanto a diviso de base mais alta se usarmos uma re-
presentao de quociente redundante. Vimos em nossa discusso da diviso SRT (pgina 152) que, permitindo
dgitos do quociente iguais a 1, 0 ou 1, muitas vezes temos a opo de selecionar um deles. A idia no algorit-
mo anterior era escolher 0 sempre que possvel, porque isso significava que uma operao da ULA podia ser ig-
norada. Na diviso de carry-save, a idia que, como o resto (que o valor do par de registradores (P,A)) exato
no conhecido (sendo armazenado na forma de carry-save), o dgito do quociente exato tambm no conhe-
cido. Porm, graas representao redundante, o resto no tem de ser conhecido com exatido para se esco-
lher um dgito do quociente. Isso est ilustrado na Figura H.32, onde o eixo x representa ri, o resto aps i etapas.
A linha identificada por qi = 1 mostra o valor que ri+1 teria se escolhssemos qi = 1 e, de forma semelhante, para
as linhas qi = 0 e qi = 1. Podemos escolher qualquer valor para qi, desde que ri+1 = 2ri qib satisfaa a r i +1 b.
Os intervalos permissveis so mostrados na metade direita da Figura H.32. Isso mostra que no necessrio
conhecer o valor preciso de ri para se escolher um dgito de quociente qi. Voc s precisa saber que r reside em
um intervalo pequeno o bastante para caber inteiramente em uma das barras superpostas mostradas na metade
direita da Figura H.32.
Essa a base para o uso de somadores carry-save. Observe os bits de alta ordem do somador carry-save e so-
me-os em um somador de propagao. Em seguida, utilize essa aproximao de r (junto com o divisor, b) para
calcular qi, em geral por meio de uma tabela de pesquisa. A mesma tcnica funciona para diviso de base mais
alta (seja ou no utilizado um somador carry-save). Os bits de alta ordem P podem ser usados para indexar uma
tabela que fornece um dos dgitos de quociente permitidos.
O desafio de projeto ao se construir um divisor SRT de alta velocidade descobrir quantos bits de P e B pre-
cisam ser examinados. Por exemplo, vamos supor que tomamos uma base 4, usamos os dgitos de quociente 2,
1, 0, 1 e 2, mas temos um somador de propagao. Quantos bits de P e B precisam ser examinados? Essa deciso
envolve duas etapas. No caso da diviso sem restaurao comum de base 2, como em cada fase r b, o buffer
de P no sofrer estouro. Porm, para a base 4, ri+1 = 4ri qib calculado em cada fase e, se ri estiver prximo de
b, ento 4ri estar prximo de 4b, e at mesmo o maior dgito de quociente no far r voltar ao intervalo
r i +1 b. Em outras palavras, o resto poderia crescer sem limite. No entanto, restringir r i 2b / 3 facilita a veri-
ficao de que ri permanecer limitado.
Depois de descobrir o limite a que ri deve satisfazer, podemos traar o diagrama da Figura H.33, anlogo ao
da Figura H.32. Por exemplo, o diagrama mostra que, se ri est entre (1/12)b e (5/12)b, podemos escolher q = 1
e assim por diante. Ou, ento, em outras palavras, se r/b est entre 1/12 e 5/12, podemos escolher q = 1. Supo-
nha que o divisor examine 5 bits de P (inclusive o bit de sinal) e 4 bits de b (ignorando o sinal, pois ele sempre
no-negativo). O caso interessante ocorre quando os bits altos de P so 1001xxx , enquanto os bits altos de b
so xxx.... Imagine o ponto binrio na extremidade esquerda de cada registrador. Tendo em vista que efetuamos
o truncamento, r (o valor de P concatenado com A) poderia ter um valor de 0.00112 at 0.01002, e b poderia ter
um valor de .10012 at .10102. Desse modo, r/b poderia ser to pequeno quanto 0.00112/.10102 ou to grande

q =0 q =1
i i
q =1
i
q =1
i
q =0
i
q =1
r i
i r
b b i
b 0 b

b
r = 2r q b
i+1 i i

Figura H.32 Seleo de quociente para diviso de base 2. O eixo x representa o i-simo resto, que a quantidade no par
de registradores (P,A). O eixo y mostra o valor do resto aps uma etapa adicional de diviso. Cada barra no grafo do lado direito
fornece o intervalo de ri valores para os quais permitido selecionar o valor de qi associado.
160 Apndice H Aritmtica de computadores

q = 2 q = 1 q =0 q =1 q =2
i i i i i

r
i
2b 2b
3 3

r = 4r q b
i+1 i i

r
i+1

q =2
q =1 i
2b q =0 i
i
3
r
i
0 b b b 5b 2b
q = 1 12 6 3 12 3
q = 2 i
i

Figura H.33 Seleo de quociente para diviso de base 4 com dgitos de quociente 2, 1, 0, 1, 2.

quanto 0.01002/.10012. Porm, 0.00112/.10102 = 3/10 < 1/3 exigiria um bit de quociente igual a 1, enquanto
0.01002/.10012 = 4/9 > 5/12 exigiria um bit de quociente igual a 2. Em outras palavras, 5 bits de P e 4 bits de b
no so suficientes para escolher um bit de quociente. Ocorre que 6 bits de P e 4 bits de b so suficientes. Isso
pode ser verificado escrevendo-se um programa simples que confere todos os casos. A sada de tal programa
mostrada na Figura H.34.

EXEMPLO Usando registradores de 8 bits, calcule 149/5 usando a diviso SRT de base 4.
Resposta Siga o algoritmo SRT da pgina 152, mas substitua a regra de seleo do quociente na etapa 2 por uma que utili-
ze a Figura H.34. Veja a Figura H.35.

b Intervalo de P q b Intervalo de P q

8 12 7 2 12 18 10 2
8 6 3 1 12 10 4 1
8 2 1 0 12 4 3 0
8 2 5 1 12 3 9 1
8 6 11 2 12 9 17 2
9 14 8 2 13 19 11 _2
9 7 3 1 13 10 4 1
9 3 2 0 13 4 3 0
9 2 6 1 13 3 9 1
9 7 13 2 13 10 18 2
10 15 9 2 14 20 11 2
10 8 3 1 14 11 4 1
10 3 2 0 14 4 3 0
10 2 7 1 14 3 10 1
10 8 14 2 14 10 19 2
11 16 9 2 15 22 12 2
11 9 3 1 15 12 4 1
11 3 2 0 15 5 4 0
11 2 8 1 15 3 11 1
11 8 15 2 15 11 21 2
Figura H.34 Dgitos de quociente para diviso SRT de base 4 com um somador de propagao. A linha superior nos diz
que, se os 4 bits de alta ordem de b so 10002 = 8, e se os 6 bits superiores de P esto entre 1101002 = 12 e 1110012 = 7, en-
to 2 um dgito de quociente vlido.
H.10 Juntando tudo 161

P A
000000000 10010101 Dividir 149 por 5. B contm 00000101.
000010010 10100000 Etapa 1: B tinha 5 zeros iniciais, assim desloca esquerda 5. B agora
contm 10100000, assim usar a seo b = 10 da tabela.
Etapa 2.1: 6 bits superiores de P so 2, assim desloca esquerda 2. Da tabela, pode escolher q para ser
001001010 1000000 0 ou 1. Escolher q = 0.
0
Etapa 2.2: 6 bits superiores de P so 9, assim
100101010 000002 desloca esquerda 2. q = 2.
1
+ 011000000 Subtrair 2b.
111101010 000002 Etapa 2.3: Bits superiores = 3, assim desloca esquerda 2. Pode
110101000 00020 escolher 0 ou 1 para q; escolher q = 0.
2
Etapa 2.4: Bits superiores = 11, assim desloca
010100000 0202 esquerda 2. q = 2.
3
+ 101000000 Somar 2b.
111100000 Etapa 3: O resto negativo, assim restaurar somando
+ 010100000 b e subtrair 1 de q.
010000000 Resposta: q = 1 = 29.
Para obter o resto, desfazer deslocamento na etapa 1; assim, resto = 010000000 >> 5 = 4.

Figura H.35 Exemplo de diviso SRT de base 4. Diviso de 149 por 5.

O Pentium utiliza um algoritmo de diviso SRT de base 4 semelhante ao que acabamos de apresentar, exceto
por utilizar um somador carry-save. Os Exerccios H.34(c) e H.35 exploram essa questo em detalhes. Embora
esses casos sejam simples, todas as anlises de SRT ocorrem da mesma maneira. Primeiro, calcular o intervalo
de ri, depois plotar ri contra ri+1 para encontrar os intervalos de quocientes, e finalmente escrever um programa
para calcular quantos bits so necessrios. (s vezes tambm possvel calcular analiticamente o nmero de
bits necessrios.) Vrios detalhes precisam ser considerados ao se construir um divisor SRT prtico. Por exem-
plo, a tabela de pesquisa de quociente tem uma estrutura bastante regular, o que significa que em geral mais
econmica codific-la como um PLA, e no em ROM. Para ver mais detalhes sobre a diviso SRT, consulte Bur-
gess e Williams [1995].

H.10 Juntando tudo


Nesta seo, vamos comparar o Weitek 3364, o MIPS R3010 e o Texas Instruments 8847 (ver as Figuras H.36 e
H.37). Em muitos aspectos, esses so chips ideais para comparao. Cada um deles implementa o padro IEEE
para adio, subtrao, multiplicao e diviso em um nico chip. Todos foram lanados em 1988 e funcionam
com um tempo de ciclo de aproximadamente 40 nanossegundos. Porm, como veremos, eles utilizam algorit-
mos bastante diferentes. O chip Weitek bem descrito em Birman et al. [1990], o chip MIPS descrito com me-
nos detalhes em Rowen, Johnson e Ries [1988], e os detalhes do chip TI podem ser encontrados em Darley et al.
[1989].

Caractersticas MIPS R3010 Weitek 3364 TI 8847

Tempo de ciclo de clock (ns) 40 50 30


Tamanho (mil2) 114.857 147.600 156.180
Transistores 75.000 165.000 180.000
Pinos 84 168 207
Potncia (watts) 3,5 1,5 1,5
Ciclos/adio 2 2 2
Ciclos/multiplicao 5 2 3
Ciclos/diviso 19 17 11
Ciclos/raiz quadrada 30 14
Figura H.36 Resumo dos trs chips de ponto flutuante discutidos nesta seo. Os tempos de ciclos se referem a peas de
produo disponveis em junho de 1989. As contagens de ciclos se referem a operaes de preciso dupla.
162 Apndice H Aritmtica de computadores

Pads
Input registers

Operand select C register

Timing
Operand select
Divide/square root
registers and
multiplexers

Divide/square root

Divide/square root
state machine

state machine
Pre-alignment

Instruction decoder
Signed digit
multiplier

Pads

Pads
ALU

Pipeline register

Pipeline register
Normalizer

Status
Signied digit converter Rounder

Sun register
Product register
Pads

TI 8847

Pads Register
timing Register file
and
IEEE decoder
exception Conflict
and status detct Foward- Operand fowarding
register ing and staging
control

External data bus

Instruction
32b1 64b alignment
Exponent
datapath Shifter

Sticky
Add
decode
control

Pipeline
Pads

control Adder

Pads
and IEEE
interlock rounding
logic
Sticky

Divide
control Divider
Clocks

Phase I/O
locked control
Sticky

Multiply
loop Multiplier
control
Pads

MIPS R3010
Figura H.37 Layout dos chips TI 8847, MIPS R3010 e Weitek 3364. Na coluna da esquerda encontram-se as microfotografias; a coluna
da direita mostra os esquemas correspondentes a cada chip.

Esses trs chips tm vrios itens em comum. Eles executam adio e multiplicao em paralelo e no imple-
mentam preciso estendida nem uma operao de etapa de resto. (Vimos na Seo H.6 que fcil implementar
a funo resto do IEEE em software, se estiver disponvel uma instruo de etapa de resto.) Os projetistas des-
ses chips provavelmente decidiram no fornecer preciso estendida, porque os usurios mais influentes so
aqueles que utilizam cdigos portteis, que no podem contar com preciso estendida. Porm, como vimos, a
preciso estendida pode tornar as bibliotecas matemticas mais rpidas e mais simples.
No resumo dos trs chips dados na Figura H.36, observe que uma quantidade de transistores mais alta em geral leva
a contagens de ciclos menores. A comparao entre os nmeros de ciclos/op precisa ser feita com cuidado, porque os
valores para o chip MIPS so os de um sistema completo (o par R3000/3010), enquanto os nmeros do Weitek e
do TI correspondem a chips independentes e em geral so maiores quando utilizados em um sistema completo.
H.10 Juntando tudo 163

Pads

ALU

Reg. file

I/O muxes
Control

Pads

Pads
Divide/sqrt

Multiplier

Status
reg.

Pads

Weitek 3364
Figura H.37 Continuao.

O chip MIPS tem o menor nmero de transistores dos trs. Isso se reflete no fato de ser ele o nico dos trs
chips que no tem nenhum pipelining ou raiz quadrada de hardware. Alm disso, as operaes de multiplica-
o e adio no so completamente independentes, porque compartilham o somador carry-propagate que
executa o arredondamento final (bem como a lgica de arredondamento).
A adio no R3010 utiliza uma mistura de ripple-carry, CLA e carry-select. Um somador carry-select usado
conforme a Figura H.20. Em cada metade, os bits de carry se propagam com o uso de um esquema hbrido rip-
ple-CLA do tipo indicado na Figura H.18. Entretanto, isso ajustado ainda mais fazendo-se variar o tamanho
de cada bloco, em vez de fixar cada um em 4 bits (como eles esto na Figura H.18). O multiplicador est a meio
caminho entre os projetos das Figuras H.2 e H.27. Ele tem um array grande o suficiente para que a sada possa
ser colocada de volta na entrada sem ter de usar clocks. Alm disso, ele emprega a recodificao de Booth de
base 4 e a tcnica par/mpar da Figura H.29. O R3010 pode efetuar uma diviso e uma multiplicao em parale-
lo (como o chip Weitek, mas diferente do chip TI). O divisor um mtodo SRT de base 4 com dgitos de quo-
ciente 2, 1, 0, 1 e 2, e semelhante ao que est descrito em Taylor [1985]. A diviso de preciso dupla apro-
ximadamente quatro vezes mais lenta que a multiplicao. O R3010 mostra que, para chips que utilizam um
multiplicador O(n), um divisor SRT pode operar com rapidez suficiente para manter uma relao razovel en-
tre multiplicao e diviso.
O Weitek 3364 tem unidades independentes de adio, multiplicao e diviso. Ele tambm utiliza a diviso
SRT de base 4. Porm, as operaes de adio e multiplicao no chip Weitek so efetuadas com pipeline. As
trs fases da adio so (1) comparao de expoentes, (2) adio seguida por deslocamento (ou vice-versa) e
(3) arredondamento final. As fases (1) e (3) demoram apenas meio ciclo, o que permite realizar a operao in-
teira em dois ciclos, embora existam trs fases no pipeline. O multiplicador utiliza um array no estilo da Figura
H.28, mas emprega recodificao de Booth de base 8, o que significa que ele tem de calcular 3 vezes o multipli-
cador. As trs fases de pipeline do multiplicador so (1) calcular 3b, (2) passar pelo array e (3) soma final com
propagao do carry e arredondamento. Valores em preciso simples passam pelo array uma vez, enquanto os
de preciso dupla passam duas vezes. Como na adio, a latncia de dois ciclos.
O chip Weitek utiliza algoritmo de adio interessante. Ele uma variao sobre o somador carry-skip
representado na Figura H.19. No entanto, Pij, o AND lgico de muitos termos, calculado por ripple-carry,
executando uma nica operao AND por propagao. Desse modo, enquanto os bits de carry se propagam
para a esquerda dentro de um bloco, o valor de Pij se propaga para a direita dentro do bloco seguinte, e os
tamanhos dos blocos so escolhidos de forma que ambas as ondas se completem ao mesmo tempo. Diferen-
te do chip MIPS, o 3364 tem raiz quadrada por hardware, que compartilha o hardware de diviso. A razo
164 Apndice H Aritmtica de computadores

entre a multiplicao e a diviso de preciso dupla 2:17. A grande disparidade entre multiplicao e divi-
so se deve ao fato de que a multiplicao utiliza a recodificao de Booth de base 8, enquanto a diviso em-
prega o mtodo de base 4. No MIPS R3010, a multiplicao e a diviso usam a mesma base.
A principal caracterstica do TI 8847 que ele efetua a diviso por iterao (usando o algoritmo de
Goldschmidt descrito na Seo H.6). Isso melhora a velocidade da diviso (a relao de multiplicao para divi-
so 3:11), mas significa que a multiplicao e a diviso no podem ser feitas em paralelo, como nos outros
dois chips. A adio tem um pipeline de duas fases. A comparao de expoentes, o deslocamento fracionrio e a
adio de fraes so feitas na primeira fase, a normalizao e o arredondamento na segunda fase. A multiplica-
o utiliza uma rvore binria de somadores de dgito com sinal e tem um pipeline de trs fases. A primeira fase
passa pelo array, retirando metade dos bits; a segunda fase passa pelo array uma segunda vez; e a terceira fase efe-
tua a converso da forma de dgito com sinal para a de complemento de dois. Tendo em vista que s existe um
array, uma nova operao de multiplicao s pode ser iniciada em ciclos alternados. Todavia, reduzindo-se o
clock-rate, podem ser realizadas duas passagens pelo array em um nico ciclo. Nesse caso, uma nova multipli-
cao pode ser iniciada em cada ciclo. O somador do 8847 utiliza um algoritmo de carry-select, em lugar do
carry-lookahead. Como mencionamos na Seo H.6, o TI transporta 60 bits de preciso, a fim de efetuar corre-
tamente a diviso com arredondamento.
Esses trs chips ilustram os diferentes compromissos assumidos por projetistas com restries semelhantes.
Um dos detalhes mais interessantes sobre esses chips a diversidade de seus algoritmos. Cada um utiliza um al-
goritmo de adio diferente, bem como um algoritmo de multiplicao diferente. De fato, a recodificao de
Booth a nica tcnica universalmente utilizada por todos os chips.

H.11 Falcias e armadilhas

Falcia Raramente ocorrem underflows em cdigo de aplicao de ponto flutuante real.

Embora a maioria dos cdigos raramente sofra underflow, existem cdigos reais que com freqncia sofrem
underflow. O SDRWAVE [Kahaner 1988], que resolve uma equao de onda unidimensional, um exemplo.
Esse programa sofre underflow com bastante freqncia, mesmo quando funciona corretamente. As medies
em uma mquina mostram que a adio de suporte de hardware para underflow gradual faria com que o
SDRWAVE executasse 50% mais rpido.

Falcia Converses entre inteiros e ponto flutuante so raras.

De fato, no spice elas so to freqentes quanto as divises. A suposio de que as converses so raras leva a
um equvoco no conjunto de instrues do SPARC verso 8, que no fornece uma instruo para movimenta-
o de registradores de inteiros para registradores de ponto flutuante.

Armadilha No aumentar a velocidade de uma unidade de ponto flutuante sem aumentar sua largura de banda de me-
mria.

Um uso tpico de uma unidade de ponto flutuante a adio de dois vetores para produzir um terceiro
vetor. Se esses vetores consistirem em nmeros de preciso dupla, cada adio de ponto flutuante utilizar
trs operandos de 64 bits cada ou 24 bytes de memria. Os requisitos de largura de banda de memria sero
ainda maiores se a unidade de ponto flutuante puder executar a adio e a multiplicao em paralelo
(como faz a maioria).

Armadilha -x no igual a 0 x.

Esse um detalhe timo no padro IEEE que pegou de surpresa alguns projetistas. Como os nmeros de
ponto flutuante utilizam o sistema de magnitude de sinal, existem dois zeros, +0 e 0. O padro nos diz que 0
0 = +0, enquanto (0) = 0. Desse modo, x no igual a 0 x quando x = 0.
H.12 Perspectiva histrica e referncias 165

H.12 Perspectiva histrica e referncias


Os computadores mais antigos usavam ponto fixo em lugar de ponto flutuante. Em Preliminary Discussion of
the Logical Design of an Electronic Computing Instrument, Burks, Goldstine e von Neumann [1946] colocam
a questo nestes termos:

Parece haver dois propsitos importantes em um sistema de ponto decimal flutuante, ambos surgindo do fato
de que o nmero de dgitos em uma palavra uma constante fixada por consideraes de projeto para cada mqui-
na especfica. O primeiro desses propsitos reter em uma soma ou em um produto tantos dgitos significativos
quanto possvel, e o segundo desses propsitos liberar o operador humano do fardo de avaliar e inserir em um
problema fatores de escala constantes multiplicativas que servem para manter os nmeros dentro dos limites
da mquina.
claro que no existe nada que negue o fato de que o tempo humano consumido na organizao da introduo
de fatores de escala adequados. Ns apenas mostramos que o tempo assim consumido uma porcentagem muito
pequena do tempo total que despenderemos na preparao de um problema interessante para nossa mquina. Em
nossa opinio, a primeira vantagem do ponto flutuante um tanto ilusria. Para ter tal ponto flutuante, necess-
rio desperdiar capacidade de memria que, de outra forma, poderia ser utilizada para transportar mais dgitos
por palavra. Portanto, no nos parece de forma alguma claro que as vantagens modestas de um ponto flutuante bi-
nrio compensem a perda de capacidade de memria e o aumento da complexidade dos circuitos aritmticos e de
controle.

Isso nos permite ver os fatos da perspectiva dos primeiros projetistas de computadores, que acreditavam que
poupar tempo e memria do computador eram objetivos mais importantes que poupar tempo do programador.
Os documentos originais que introduzem a rvore de Wallace, a recodificao de Booth, a diviso SRT, os
tercetos sobrepostos, e assim por diante, foram reimpressos em Swartzlander [1990]. Uma boa explicao de
uma mquina antiga (o IBM 360/91) que utilizava uma rvore de Wallace com pipeline, recodificao de Booth
e diviso iterativa encontra-se em Anderson et al. [1967]. H uma discusso do tempo mdio para diviso SRT
de um nico bit em Freiman [1961]; esse um dos poucos documentos histricos interessantes que no apare-
cem em Swartzlander.
O livro padro de Mead e Conway [1980] desencorajou o uso de CLAs por no serem econmicos em VLSI.
O importante artigo de Brent e Kung [1982] ajudou a combater essa viso. Um exemplo de layout detalhado
para CLAs pode ser encontrado em Ngai e Irwin [1985] ou em Weste e Eshraghian [1993], e um tratamento
mais terico dado por Leighton [1992]. Takagi, Yasuura e Yajima [1985] fornecem uma descrio detalhada
de um multiplicador em rvore de dgito com sinal.
Antes do predomnio da aritmtica IEEE, foram usados muitos formatos de ponto flutuante diferentes. Trs
formatos importantes foram utilizados pelo IBM 370, o DEC VAX e o Cray. Aqui est um breve resumo desses for-
matos mais antigos. O formato do VAX se aproxima do padro IEEE. Seu formato de preciso simples (o forma-
to F) semelhante preciso simples do IEEE pelo fato de ter um bit oculto, 8 bits de expoente e 23 bits de fra-
o. Contudo, ele no tem um bit de aderncia, o que o faz arredondar os casos intermedirios para cima, e no
para o valor par. O VAX tem um intervalo de expoentes ligeiramente diferente do formato simples do IEEE:
Emin 128, em vez de 126 como no IEEE, e Emax 126 em lugar de 127. As principais diferenas entre o VAX
e o IEEE so a falta de valores especiais e de underflow gradual. O VAX tem um operando reservado, mas ele
funciona de modo semelhante a um NaN de sinalizao: captura sempre que referenciado. Originalmente, a
preciso dupla do VAX (o formato D) tambm tinha 8 bits de expoente. No entanto, como isso muito pouco
para muitas aplicaes, foi acrescentado um formato G; como o padro IEEE, esse formato tem 11 bits de expo-
ente. O VAX tambm tem um formato H, que tem 128 bits de comprimento.
O formato de ponto flutuante do IBM 370 utiliza a base 16, em vez da base 2. Isso significa que ele no pode
utilizar um bit oculto. Em preciso simples, ele tem 7 bits de expoente e 24 bits (6 dgitos hexa) de frao. Des-
7 9 8
se modo, o maior nmero representvel 16 2 = 2 4 27 = 2 2 , em comparao com 2 2 para o IEEE. Todavia,
um nmero normalizado no sentido hexadecimal s precisa ter um dgito inicial no-nulo. Quando interpreta-
dos em binrio, os trs bits mais significativos poderiam ser zero. Assim, existem potencialmente menos de 24
bits de significado. A razo para se utilizar a base mais alta foi minimizar a quantidade de deslocamento exigida
ao se adicionar nmeros de ponto flutuante. Porm, isso menos significativo em mquinas atuais, nas quais o
166 Apndice H Aritmtica de computadores

tempo de adio de ponto flutuante em geral fixado de forma independente dos operandos. Outra diferena
entre a aritmtica do 370 e a aritmtica do IEEE o fato de que o 370 no tem um dgito de arredondamento
nem um dgito de aderncia, que significa efetivamente que ele efetua o truncamento, em vez de arredondar.
Desse modo, em muitos clculos, o resultado ser sistematicamente muito pequeno. Diferente da aritmtica do
VAX e do IEEE, todo padro de bits um nmero vlido. Portanto, as rotinas de biblioteca devem estabelecer
convenes relativas ao que deve ser retornado em caso de erros. Por exemplo, na biblioteca IBM FORTRAN,
4 retorna 2!
A aritmtica em computadores Cray interessante porque orientada por uma motivao que visa ao mais
alto desempenho de ponto flutuante possvel. Ela tem um campo de expoente de 15 bits e um campo de frao
de 48 bits. A adio em computadores Cray no tem um dgito de proteo, e a multiplicao ainda menos
precisa que a adio. Pensando na multiplicao como uma soma de p nmeros, cada um com 2p bits de com-
primento, os computadores Cray descartam os bits de baixa ordem de cada parcela. Desse modo, a anlise das
caractersticas exatas de erro da operao de multiplicao no fcil. Os recprocos so calculados com o uso
de iterao, e a diviso de a por b feita multiplicando-se a por 1/b. Os erros na multiplicao e no clculo de re-
cprocos se combinam para tornar pouco confiveis os trs ltimos bits de uma operao de diviso. Pelo me-
nos os computadores Cray servem para manter os analistas numricos atentos!
O processo de padronizao do IEEE comeou em 1977, inspirado principalmente por W. Kahan e baseado
em parte no trabalho de Kahan com o IBM 7094 na University of Toronto [Kahan 1968]. O processo de padro-
nizao foi um trabalho demorado com o underflow gradual causando a maior controvrsia. (De acordo com
Cleve Moler, os visitantes que chegavam aos Estados Unidos eram aconselhados a no deixar de ver Las Vegas,
o Grand Canyon e as reunies do comit de padres IEEE.) O padro foi finalmente aprovado em 1985. O Intel
8087 foi a primeira implementao comercial importante do IEEE e surgiu em 1981, antes de o padro ser fina-
lizado. Ele contm recursos que foram eliminados no padro final, como bits projetivos. De acordo com Kahan,
o comprimento da preciso dupla estendida se baseava no que poderia ser implementado no 8087. Embora o
padro IEEE no se baseasse em nenhum sistema de ponto flutuante existente, a maioria de suas caractersticas
estava presente em algum outro sistema. Por exemplo, o CDC 6600 reservava padres de bits especiais para
INDEFINITE e INFINITY, enquanto a idia de nmeros no-normalizados aparece em Goldberg [1967], bem
como em Kahan [1968]. Kahan recebeu o prmio Turing de 1989 em reconhecimento a seu trabalho sobre o
ponto flutuante.
Embora ponto flutuante raramente atraia o interesse da imprensa em geral, os jornais ficaram repletos de
histrias sobre a diviso em ponto flutuante em novembro de 1994. Um bug no algoritmo de diviso usado em
todos os chips Pentium da Intel acabara de vir luz. Ele foi descoberto por Thomas Nicely, um professor de ma-
temtica no Lynchburg College, na Virgnia. Nicely encontrou o bug ao efetuar clculos envolvendo recprocos
de nmeros primos. As notcias sobre a descoberta de Nicely surgiram pela primeira vez na imprensa na primeira
pgina da edio de 7 de novembro do Electronic Engineering Times. A resposta imediata da Intel foi evasiva,
afirmando que o bug s afetaria matemticos tericos. A Intel informou imprensa que isso nem sequer se
qualifica como uma errata... mesmo que fosse um engenheiro, voc no veria isso.
Com o aumento da presso, a Intel emitiu um documento, datado de 30 de novembro, explicando por que
no considerava o bug significativo. Um de seus argumentos se baseava no fato de que, se escolher dois nme-
ros em ponto flutuante ao acaso e dividir um pelo outro, a chance de que o quociente resultante esteja errado
de aproximadamente 1 em 9 bilhes. No entanto, a Intel foi negligente ao explicar por que considerava que o
cliente tpico acessaria nmeros de ponto flutuante ao acaso.
A presso continuou a aumentar sobre a Intel. Um ponto delicado era que a Intel sabia do bug antes da des-
coberta de Nicely, mas tinha decidido no torn-lo pblico. Finalmente, em 20 de dezembro, a Intel anunciou
que substituiria incondicionalmente qualquer chip Pentium que usasse o algoritmo defeituoso e que assumiria
a responsabilidade pelos custos no-especificados da troca, que acabou sendo de 300 milhes de dlares.
O Pentium utiliza uma verso simples de diviso SRT, como vimos na Seo H.9. O bug foi introduzido
quando a Intel converteu a tabela de pesquisa de quocientes em um PLA. Evidentemente, havia alguns elemen-
tos da tabela que continham o dgito de quociente 2 que a empresa imaginou que nunca seriam acessados, e o
projeto do PLA foi otimizado com base nessa suposio. O PLA resultante retornava 0 em vez de 2 nessas situa-
es. Porm, essas entradas eram realmente acessadas, e isso causou o bug de diviso. Embora o efeito do PLA
defeituoso fosse provocar erros em 5 das 2.048 entradas de tabelas, o Pentium s calcula um quociente incorre-
to uma vez em 9 bilhes de vezes sobre entradas aleatrias. Esse assunto explorado no Exerccio H.34.
H.12 Perspectiva histrica e referncias 167

Referncias
Anderson, S. F., J. G. Earle, R. E. Goldschmidt e D. M. Powers [1967]. The IBM System/360 Model 91: Floa-
ting-point execution unit, IBM J. Research and Development 11, 3453. Reimpresso em Swartzlander [1990].
Uma boa descrio de uma antiga unidade de ponto flutuante de alto desempenho que usava um multiplicador de rvore
de Wallace com pipeline e diviso iterativa.
Bell, C. G. e A. Newell [1971]. Computer Structures: Readings and Examples, McGraw-Hill, Nova York.
Birman, M., A. Samuels, G. Chu, T. Chuk, L. Hu, J. McLeod e J. Barnes [1990]. Developing the WRL3170/3171
SPARC floating-point coprocessors, IEEE Micro 10:1, 5564.
Esses chips tm o mesmo ncleo de ponto flutuante do Weitek 3364, e esse documento apresenta uma descrio bastante
detalhada desse projeto de ponto flutuante.
Brent, R. P. e H. T. Kung [1982]. A regular layout for parallel adders, IEEE Trans. on Computers C-31, 260264.
Esse o artigo que popularizou os CLAs em VLSI.
Burgess, N. e T. Williams [1995]. Choices of operand truncation in the SRT division algoriithm, IEEE Trans. on
Computers 44:7.
Analisa quantos bits do divisor e do resto precisam ser examinados na diviso SRT.
Burks, A. W., H. H. Goldstine e J. von Neumann [1946]. Preliminary discussion of the logical design of an electronic
computing instrument, Report to the U.S. Army Ordnance Department, p. 1; tambm em Papers of John von Neumann,
W. Aspray e A. Burks, editores, MIT Press, Cambridge, Mass. e Tomash Publishers, Los Angeles, 1987, 97146.
Cody, W. J., J. T. Coonen, D. M. Gay, K. Hanson, D. Hough, W. Kahan, R. Karpinski, J. Palmer, F. N. Ris e D. Steven-
son [1984]. A proposed radix- and word-length-independent standard for floating-point arithmetic, IEEE Mi-
cro 4:4, 86100.
Contm um esboo do padro 854, mais geral que o 754. Esse artigo importante por conter comentrios sobre o pa-
dro, a maior parte dos quais igualmente relevante para o 754. Porm, esteja ciente de que existem algumas diferenas
entre esse esboo e o padro final.
Coonen, J. [1984]. Contributions to a Proposed Standard for Binary Floating-Point Arithmetic, tese de doutorado, Univ.
of Calif., Berkeley.
A nica discusso detalhada de como os modos de arredondamento podem ser usados para implementar a converso efi-
ciente entre binrio e decimal.
Darley, H. M., et al. [1989]. Floating point/integer processor with divide and square root functions, U.S. Patent
4,878,190, outubro 31, 1989.
Bastante legvel como todas as patentes. Apresenta uma viso de alto nvel do chip TI 8847, mas no tem todos os deta-
lhes do algoritmo de diviso.
Demmel, J. W. e X. Li [1994]. Faster numerical algorithms via exception handling, IEEE Trans. on Computers 43:8,
983992.
Uma boa discusso sobre como as caractersticas exclusivas de ponto flutuante do IEEE podem melhorar o desempenho
de uma importante biblioteca de software.
Freiman, C. V. [1961]. Statistical analysis of certain binary division algorithms, Proc. IRE 49:1, 91103.
Contm uma anlise do desempenho do algoritmo de diviso SRT de deslocamento sobre zeros.
Goldberg, D. [1991]. What every computer scientist should know about floating-point arithmetic, Computing Sur-
veys 23:1, 548.
Contm um tutorial detalhado sobre o padro IEEE do ponto de vista do software.
Goldberg, I. B. [1967]. 27 bits are not enough for 8-digit accuracy, Comm. ACM 10:2, 105106.
Esse artigo prope a utilizao de bits ocultos e underflow gradual.
Gosling, J. B. [1980]. Design of Arithmetic Units for Digital Computers, Springer-Verlag, Nova York.
Um livro conciso e bem escrito, embora se concentre em projetos MSI.
Hamacher, V. C., Z. G. Vranesic e S. G. Zaky [1984]. Computer Organization, 2a edio, McGraw-Hill, Nova York.
Um livro introdutrio sobre arquitetura de computadores, com um bom captulo sobre aritmtica de computadores.
Hwang, K. [1979]. Computer Arithmetic: Principles, Architecture, and Design, Wiley, Nova York.
Esse livro contm a mais ampla variedade de tpicos dos livros de aritmtica de computadores.
IEEE [1985]. IEEE standard for binary floating-point arithmetic, SIGPLAN Notices 22:2, 925.
O IEEE 754 foi reimpresso aqui.
Kahan, W. [1968]. 7094-II system support for numerical analysis, SHARE Secretarial Distribution SSD-159.
Esse sistema tinha muitas caractersticas que foram incorporadas ao padro de ponto flutuante do IEEE.
Kahaner, D. K. [1988]. Benchmarks for real programs, SIAM News (novembro).
O benchmark apresentado nesse artigo provoca muitos underflows.
168 Apndice H Aritmtica de computadores

Knuth, D. [1981]. The Art of Computer Programming, vol. II, 2a edio, Addison-Wesley, Reading, Mass.
Apresenta uma seo sobre a distribuio de nmeros de ponto flutuante.
Kogge, P. [1981]. The Architecture of Pipelined Computers, McGraw-Hill, Nova York.
Tem uma breve discusso sobre multiplicadores com pipelines.
Kohn, L. e S.-W. Fu [1989]. A 1,000,000 transistor microprocessor, IEEE Intl Solid-State Circuits Conf., 5455.
Existem vrios artigos sobre o i860, mas esse contm o mximo de detalhes sobre seus algoritmos de ponto flutuante.
Koren, I. [1989]. Computer Arithmetic Algorithms, Prentice Hall, Englewood Cliffs, N.J.
Leighton, F. T. [1992]. Introduction to Parallel Algorithms and Architectures: Arrays, Trees, Hypercubes, Morgan Kauf-
mann, San Francisco.
um excelente livro, com nfase na anlise de complexidade de algoritmos. A Seo 1.2.1 tem uma tima descrio da
adio com carry-lookahead em uma rvore.
Magenheimer, D. J., L. Peters, K. W. Pettis e D. Zuras [1988]. Integer multiplication and division on the HP Precisi-
on architecture, IEEE Trans. on Computers 37:8, 980990.
Apresenta a base lgica para as instrues de inteiros e de etapa de diviso na arquitetura Precision.
Markstein, P. W. [1990]. Computation of elementary functions on the IBM RISC System/6000 processor, IBM J. of
Research and Development 34:1, 111119.
Explica como usar a multiplicao-adio conjuntas para calcular corretamente a diviso e a raiz quadrada com arre-
dondamento.
Mead, C. e L. Conway [1980]. Introduction to VLSI Systems, Addison-Wesley, Reading, Mass.
Montoye, R. K., E. Hokenek e S. L. Runyon [1990]. Design of the IBM RISC System/6000 floating-point execution,
IBM J. of Research and Development 34:1, 5970.
Descreve uma implementao da multiplicao-adio conjuntas.
Ngai, T.-F. e M. J. Irwin [1985]. Regular, area-time efficient carry-lookahead adders, Proc. Seventh IEEE Symposium
on Computer Arithmetic, 915.
Descreve um CLA como o da Figura H.17, no qual os bits fluem para cima e depois voltam a descer.
Patterson, D. A. e J. L. Hennessy [1994]. Computer Organization and Design: The Hardware/Software Interface, Mor-
gan Kaufmann, San Francisco.
O Captulo 4 uma introduo mais elegante parte inicial deste apndice.
Peng, V., S. Samudrala e M. Gavrielov [1987]. On the implementation of shifters, multipliers, and dividers in VLSI
floating point units, Proc. Eighth IEEE Symposium on Computer Arithmetic, 95102.
Pesquisa altamente recomendada de diferentes tcnicas realmente usadas em projetos VLSI.
Rowen, C., M. Johnson e P. Ries [1988]. The MIPS R3010 floating-point coprocessor, IEEE Micro, 5362 (junho).
Santoro, M. R., G. Bewick e M. A. Horowitz [1989]. Rounding algorithms for IEEE multipliers, Proc. Ninth IEEE
Symposium on Computer Arithmetic, 176183.
Uma discusso muito clara de como implementar com eficincia o arredondamento para a multiplicao de ponto flutuante.
Scott, N. R. [1985]. Computer Number Systems and Arithmetic, Prentice Hall, Englewood Cliffs, N.J.
Swartzlander, E., ed. [1990]. Computer Arithmetic, IEEE Computer Society Press, Los Alamitos, Calif.
Uma coleo de documentos histricos em dois volumes.
Takagi, N., H. Yasuura e S. Yajima [1985].High-speed VLSI multiplication algorithm with a redundant binary addi-
tion tree, IEEE Trans. on Computers C-34:9, 789796.
Uma discusso do multiplicador de rvore binria com sinal que foi a base para o projeto utilizado no TI 8847.
Taylor, G. S. [1981]. Compatible hardware for division and square root, Proc. Fifth IEEE Symposium on Computer
Arithmetic, 127134.
Boa discusso de um algoritmo de diviso SRT na base 4.
Taylor, G. S. [1985]. Radix 16 SRT dividers with overlapped quotient selection stages, Proc. Seventh IEEE Symposi-
um on Computer Arithmetic, 6471.
Descreve um algoritmo muito sofisticado de diviso em base alta.
Weste, N. e K. Eshraghian [1993]. Principles of CMOS VLSI Design: A Systems Perspective, 2a edio, Addison-Wesley,
Reading, Mass.
Esse livro didtico tem uma seo sobre os layouts de diversos tipos de somadores.
Williams, T. E., M. Horowitz, R. L. Alverson e T. S. Yang [1987]. A self-timed chip for division, Advanced Research
in VLSI, Proc. 1987 Stanford Conf., MIT Press, Cambridge, Mass.
Descreve um divisor que tenta alcanar a velocidade de um projeto combinacional sem utilizar a rea que seria exigida
por um desses projetos.
Exerccios 169

Exerccios
H.1 [12] <H.2> Usando n bits, qual o maior e o menor inteiro que podem ser representados no sistema de complemento
de dois?
H.2 [20/25] <H.2> Na subseo Nmeros com sinal (pgina 123), afirmamos que o complemento de dois sofre estouro
(overflow) quando o carry para a posio de bit de alta ordem diferente do carry de sada daquela posio.
a. [20] <H.2> Fornea exemplos de pares de inteiros para todas as quatro combinaes de carry de entrada e carry de
sada. Confirme a regra enunciada anteriormente.
b. [25] <H.2> Explique por que a regra sempre verdadeira.
H.3 [12] <H.2> Empregando nmeros binrios de 4 bits, multiplique 8 8 usando a recodificao de Booth.
H.4 [15] <H.2> As Equaes H.2.1 e H.2.2 se referem adio de dois nmeros de n bits. Derive equaes semelhantes
para a subtrao, na qual haver um emprstimo em vez de um carry.
H.5 [25] <H.2> Em uma mquina que no detecta o estouro de inteiros em hardware, mostre como voc detectaria em
software o estouro em uma operao de adio com sinal.
H.6 [15/15/20] <H.3> Represente os nmeros a seguir como nmeros de ponto flutuante IEEE de preciso simples e de
preciso dupla.
a. [15] <H.3> 10.
b. [15] <H.3> 10,5.
c. [20] <H.3> 0,1.
H.7 [12/12/12/12/12] <H.3> Temos a seguir uma lista de nmeros em ponto flutuante. Em preciso simples, anote cada
nmero em binrio, em decimal e fornea sua representao em aritmtica IEEE.
a. [12] <H.3> O maior nmero menor que 1.
b. [12] <H.3> O maior nmero.
c. [12] <H.3> O menor nmero normalizado positivo.
d. [12] <H.3> O maior nmero no-normalizado.
e. [12] <H.3> O menor nmero positivo.
H.8 [15] <H.3> A ordenao de nmeros no-negativos de ponto flutuante igual de inteiros quando tambm so con-
siderados nmeros no-normalizados?
H.9 [20] <H.3> Escreva um programa que imprima os padres de bits usados para representar nmeros em ponto flutu-
ante no seu computador favorito. Que padro de bits usado para NaN?
H.10 [15] <H.4> Usando p = 4, mostre como o algoritmo de multiplicao binria de ponto flutuante calcula o produto de
1,875 1,875.
H.11 [12/10] <H.4> A respeito da adio de expoentes na multiplicao em ponto flutuante:
a. [12] <H.4> Qual seria a aparncia do hardware que implementaria a adio de expoentes?
b. [10] <H.4> Se o desvio em preciso simples fosse 129 em vez de 127, a adio seria mais difcil ou mais fcil de im-
plementar?
H.12 [15/12] <H.4> Na discusso sobre a deteco de estouro para multiplicao em ponto flutuante, afirmou-se que (no
caso de preciso simples) possvel detectar um expoente com estouro executando a adio de expoentes em um so-
mador de 9 bits.
a. [15] <H.4> Fornea a regra exata para detectar o estouro.
b. [12] <H.4> A deteco de estouro seria mais fcil se voc utilizasse um somador de 10 bits?
H.13 [15/10] <H.4> Sobre a multiplicao em ponto flutuante:
a. [15] <H.4> Construa dois nmeros em ponto flutuante de preciso simples cujo produto no sofra estouro at a
etapa de arredondamento final.
b. [10] <H.4> Existe algum modo de arredondamento em que esse fenmeno no pode ocorrer?
170 Apndice H Aritmtica de computadores

H.14 [15] <H.4> Fornea um exemplo de um produto com um operando no-normalizado, mas com uma sada normali-
zada. Qual foi a durao da etapa final de deslocamento? Qual o deslocamento mximo que pode ocorrer quando as
entradas so nmeros de preciso dupla?
H.15 [15] <H.5> Utilize o algoritmo de adio de ponto flutuante da pgina 135 para calcular 1.0102 .10012 (em preciso
de 4 bits).
H.16 [10/15/20/20/20] <H.5> Em certas situaes, possvel ter certeza de que a + b representvel exatamente como um
nmero de ponto flutuante, ou seja, nenhum arredondamento necessrio.
a. [10] <H.5> Se a, b tm o mesmo expoente e sinais diferentes, explique por que a + b exata. Isso foi usado na sub-
seo Como acelerar a adio na pgina 137.
b. [15] <H.5> Fornea um exemplo em que os expoentes diferem por 1, a e b tm sinais diferentes e a + b no exata.
c. [20] <H.5> Se a b 0 e os dois bits superiores de a se cancelam ao se calcular a b, explique por que o resultado
exato (esse fato mencionado na pgina 135).
d. [20] <H.5> Se a b 0 e os expoentes diferem por 1, mostre que a b exata, a menos que o bit de alta ordem de
a b esteja na mesma posio que o de a (mencionado em Como acelerar a adio, pgina 137).
e. [20] <H.5> Se o resultado de a b ou a + b for no-normalizado, mostre que o resultado exato (mencionado na
subseo Underflow, pgina 145).
H.17 [15/20] <H.5> Adio de ponto flutuante rpida (usando somadores paralelos) para p = 5.
a. [15] <H.5> Analise o algoritmo de adio rpida para a + b, onde a = 1.01112 e b = .110112.
b. [20] <H.5> Suponha que o modo de arredondamento tende a +. Que complicao surge no exemplo anterior
para o somador que pressupe um carry de sada? Sugira uma soluo.
H.18 [12] <H.4, H.5> Como voc utilizaria dois somadores paralelos para evitar a adio de arredondamento final na mul-
tiplicao de ponto flutuante?
H.19 [30/10] <H.5> Este problema apresenta um modo de reduzir o nmero de etapas de adio na adio de ponto flutu-
ante de trs para duas, usando apenas um nico somador.
a. [30] <H.5> Sejam A e B inteiros de sinais opostos, sendo a e b suas magnitudes. Mostre que as regras a seguir para
manipular os nmeros sem sinal a e b fornecem A + B.
1. Complementar um dos operandos.
2. Usar o carry para somar o operando complementado ao outro operando (no-complementado).
3. Se houve um carry de sada, o sinal do resultado ser o sinal associado ao operando no-complementado.
4. Caso contrrio, se no houve nenhum carry de sada, complementar o resultado e dar a ele o sinal do operando
complementado.
b. [10] <H.5> Utilize a seqncia anterior para mostrar como as etapas 2 e 4 do algoritmo de adio em ponto flutu-
ante da pgina 135 pode ser executado usando-se apenas uma nica adio.
H.20 [20/15/20/15/20/15] <H.6> Raiz quadrada iterativa.
a. [20] <H.6> Use o mtodo de Newton para derivar um algoritmo iterativo para raiz quadrada. A frmula envolver
uma diviso.
b. [15] <H.6> Qual o modo mais rpido que voc poderia imaginar para dividir por 2 um nmero em ponto flutu-
ante?
c. [20] <H.6> Se a diviso lenta, ento a rotina iterativa de raiz quadrada tambm ser lenta. Use o mtodo de New-
ton sobre f(x) = 1/x2 a para derivar um mtodo que no utilize divises.
d. [15] <H.6> Suponha que a razo de diviso por 2 : adio em ponto flutuante : multiplicao em ponto flutuante
seja 1:2:4. Que relaes entre tempo de multiplicao e tempo de diviso tornam cada etapa de iterao no mto-
do da parte (c) mais rpida que cada iterao no mtodo da parte (a)?
e. [20] <H.6> Quando se utiliza o mtodo da parte (a), quantos bits precisam estar na suposio inicial para se obter
exatido de preciso dupla depois de trs iteraes? (Ignore o erro de arredondamento.)
f. [15] <H.6> Suponha que, ao se executar o spice no TI 8847, ele passe 16,7% de seu tempo na rotina de raiz qua-
drada (essa porcentagem foi medida em outras mquinas). Usando os valores da Figura H.36 e supondo trs itera-
Exerccios 171

es, o quanto a execuo do spice seria mais lenta se a raiz quadrada fosse implementada em software, empre-
gando-se o mtodo da parte (a)?
H.21 [10/20/15/15/15] <H.6> Diviso iterativa arredondada corretamente. Sejam a e b nmeros em ponto flutuante com
significandos de p bits (p = 53 em preciso dupla). Seja q o quociente exato q = a/b, 1 q < 2. Suponha que q seja o re-
sultado de um processo de iterao, que q tenha alguns bits de preciso extras e que 0 < q q < 2p. Nos itens a seguir,
importante que q < q, mesmo quando q puder ser representado de forma exata como um nmero de ponto flutuan-
te.
a. [10] <H.6> Se x um nmero em ponto flutuante, e 1 x < 2, qual ser o prximo nmero representvel depois
de x?
b. [20] <H.6> Mostre como calcular q a partir de q, onde q tem p + 1 bits de preciso e q q < 2 p .
c. [15] <H.6> Supondo arredondamento para o mais prximo, mostre que o quociente corretamente arredondado
q, q 2 p ou q + 2 p .
d. [15] <H.6> Fornea regras para calcular o quociente corretamente arredondado a partir de q, com base no bit de
baixa ordem de q e no sinal de a bq.
e. [15] <H.6> Resolva a parte (c) para os outros trs modos de arredondamento.
i
H.22 [15] <H.6> Verifique a frmula da pgina 141. [Sugesto: Se xn = x0(2 xob) Pi=1,n [1 + (1 x 0b )2 ], ento
i
2 x nb = 2 x 0b( 2 x 0b ) P [1 + (1 x 0b )2 i ] = 2 [1 (1 x 0b )2 ] P [1 + (1 x 0b )2 ].]
H.23 [15] <H.7> O exemplo que demonstrou que o arredondamento duplo pode dar uma resposta diferente de se arredon-
dar uma vez utilizou a regra de arredondar at o valor par. Se os casos intermedirios forem sempre arredondados
para cima, o arredondamento duplo ainda ser perigoso?
H.24 [10/10/20/20] <H.7> Alguns casos da afirmao destacada em itlico na subseo Precises (pgina 143) no so
difceis de demonstrar.
a. [10] <H.7> Que forma deve ter um nmero binrio se o arredondamento para q bits seguido pelo arredondamen-
to para p bits der uma resposta diferente do arredondamento direto at p bits?
b. [10] <H.7> Mostre que, para a multiplicao de nmeros de p bits, o arredondamento at q bits seguido pelo arre-
dondamento at p bits igual a arredondar imediatamente at p bits, se q 2p.
c. [20] <H.7> Se a e b so nmeros de p bits com o mesmo sinal, mostre que o arredondamento de a + b at q bits se-
guido pelo arredondamento at p bits igual ao arredondamento imediato at p bits, se q 2p + 1.
d. [20] <H.7> Faa a parte (c) quando a e b tm sinais opostos.
H.25 [Discusso] <H.7> Na abordagem do MIPS para tratamento de excees, voc precisa de um teste para determinar se
dois operandos de ponto flutuante poderiam causar uma exceo. Esse teste deve ser rpido e tambm no ter muitos
falsos positivos. Voc pode apresentar um teste prtico? O custo de desempenho do seu projeto depender da distri-
buio de nmeros em ponto flutuante. Isso discutido em Knuth [1981] e no artigo de Hamming em Swartzlander
[1990].
H.26 [12/12/10] <H.8> Somadores carry-skip.
a. [12] <H.8> Supondo que o tempo seja proporcional aos nveis de lgica, quanto tempo ir demorar um somador
de n bits dividido em blocos (fixos) de comprimento k bits para executar uma adio?
b. [12] <H.8> Que valor de k fornece o somador mais rpido?
c. [10] <H.8> Explique por que o somador carry-skip demora o tempo 0( n ).
H.27 [10/15/20] <H.8> Complete os detalhes dos diagramas de blocos para os seguintes somadores.
a. [10] <H.8> Na Figura H.15, mostre como implementar os retngulos 1 e 2 em termos de portas AND e OR.
b. [15] <H.8> Na Figura H.18, que sinais precisam fluir das clulas do somador na linha superior para as clulas
C? Escreva as equaes lgicas correspondentes ao retngulo C.
c. [20] <H.8> Mostre como estender o diagrama de blocos de H.17, de forma que ele produza o bit de carry de
sada c8.
H.28 [15] <H.9> Na recodificao de Booth comum, o mltiplo de b usado na i-sima etapa simplesmente ai1 ai. Voc
poderia encontrar uma frmula semelhante para recodificao de Booth na base 4 (tercetos sobrepostos)?
172 Apndice H Aritmtica de computadores

H.29 [20] <H.9> Amplie a Figura H.29 na forma de H.27, mostrando os somadores individuais.
H.30 [25] <H.9> Escreva o diagrama anlogo da Figura H.25 para recodificao de Booth na base 8.
H.31 [18] <H.9> Suponha que an1 ... a1a0 e bn1 ... b1b0 estejam sendo somados em um somador de dgito com sinal, con-
forme ilustra o exemplo da pgina 158. Escreva uma frmula para o i-simo bit da soma, si, em termos de ai, ai1, ai2,
bi, bi1 e bi2.
H.32 [15] <H.9> O texto discutiu a diviso SRT na base 4 com dgitos do quociente 2, 1, 0, 1, 2. Suponha que 3 e 3 tam-
bm sejam permitidos como dgitos do quociente. Que relao substitui |ri| 2b/3?
H.33 [25/20/30] <H.9> Com base na tabela de diviso SRT, Figura H.34:
a. [25] <H.9> Escreva um programa para gerar os resultados da Figura H.34.
b. [20] <H.9> Observe que a Figura H.34 tem uma certa simetria em relao aos valores positivos e negativos de P.
Voc poderia encontrar um modo de explorar a simetria e armazenar apenas os valores correspondentes a P posi-
tivo?
c. [30] <H.9> Suponha que um somador carry-save seja usado em lugar de um somador de propagao. A entrada
para a tabela de pesquisa do quociente ter k bits do divisor e l bits do resto, onde os bits do resto so calculados
somando-se os l bits superiores dos registradores de soma e carry. Quais so os valores de k e l? Escreva um pro-
grama para gerar o anlogo da Figura H.34.
H.34 [12/12/12]<H.9, H.12> Os vrios milhes de chips Pentium produzidos inicialmente tinham uma falha que fazia a di-
viso retornar algumas vezes o resultado errado. O Pentium utiliza um algoritmo SRT de base 4 semelhante ao ilus-
trado no exemplo da pgina 160 (mas com o resto armazenado em formato carry-save: veja o Exerccio H.33 (c)). De
acordo com a Intel, o bug era causado por cinco entradas incorretas na tabela de pesquisa do quociente.
a. [12] <H.9, H.12> As entradas incorretas deveriam ter gerado um quociente igual a 2, com sinal positivo ou negati-
vo; porm, em vez disso, o quociente gerado era 0. Devido redundncia, concebvel que o algoritmo pudesse se
recuperar de um dgito de quociente incorreto em iteraes posteriores. Mostre que isso no possvel no caso
da falha do Pentium.
b. [12] <H.9, H.12> Tendo em vista que a operao uma diviso de ponto flutuante em vez de uma diviso de intei-
ros, o algoritmo de diviso SRT da pgina 152 deve ser modificado de duas maneiras. Primeiro, a etapa 1 no
mais necessria, pois o divisor j est normalizado. Em segundo lugar, o primeiro resto pode no satisfazer ao li-
mite apropriado (|r | 2b/3 para o Pentium; veja a pgina 159). Mostre que ignorar o primeiro deslocamento es-
querda na etapa 2 (a) do algoritmo SRT resolver esse problema.
c. [12] <H.9, H.12> Se as entradas incorretas da tabela fossem indexadas por um resto que pudesse ocorrer na pri-
meira etapa de diviso (quando o resto o divisor), testes aleatrios revelariam rapidamente o bug. Isso no acon-
teceu. O que voc diria sobre os valores do resto que indexam as entradas incorretas?
H.35 [12/12/12] <H.6, H.9> A discusso da instruo da etapa do resto pressups que a diviso foi efetuada com um algo-
ritmo de um bit de cada vez. O que teria de mudar se a diviso fosse implementada com o uso de um mtodo de base
mais alta?
H.36 [25] <H.9> No array da Figura H.28, no se explora o fato de um array poder ser canalizado. Voc poderia apresentar
um projeto que levasse a sada do CSA inferior aos CSAs inferiores, e no ao superior? Isso tornar a execuo mais
rpida que o arranjo apresentado na Figura H.28?
I
Implementao de
protocolos de coerncia
O diabo est nos detalhes.
Provrbio clssico

I.1 Questes de implementao para o protocolo de coerncia de espionagem


I.2 Questes de implementao no protocolo de diretrio distribudo
Exerccios

2003, Elsevier Science (EUA).


2003, Editora Campus Ltda. uma empresa Elsevier. Todos os direitos reservados.
174 Apndice I Implementao de protocolos de coerncia

I.1 Questes de implementao para o protocolo


de coerncia de espionagem
A principal complicao na utilizao real do protocolo de coerncia de espionagem da Seo 6.3 que os erros
de gravao no so atmicos: a operao de detectar um erro de gravao, obter o barramento, conseguir o va-
lor mais recente e atualizar a cache no pode ser feita como se demorasse um nico ciclo. Em particular, dois
processadores no podem utilizar o barramento ao mesmo tempo. Desse modo, devemos decompor a gravao
em vrias etapas que podem estar separadas no tempo, mas que ainda preservaro a execuo correta. A primei-
ra etapa detecta o erro e solicita o barramento. A segunda etapa adquire o barramento, coloca o erro no barra-
mento, obtm os dados e completa a gravao. Cada uma dessas duas etapas atmica, mas o bloco da cache
no se torna exclusivo at a segunda etapa ter se iniciado. Desde que o bloco no seja alterado para exclusivo
nem a atualizao da cache tenha permisso para prosseguir antes da aquisio do barramento, as gravaes
para o mesmo bloco da cache sero serializadas quando alcanarem a segunda etapa do protocolo de coerncia.
Infelizmente, esse processo de duas etapas introduz novas complicaes no protocolo.
A Figura I.1 mostra o diagrama de estados finitos real para implementao da coerncia por esse processo de
duas etapas, sob a hiptese de que uma transao de barramento atmica uma vez que o barramento adqui-
rido. Essa suposio simplesmente significa que a transao de barramento no uma transao dividida e,
uma vez que ele adquirido, quaisquer solicitaes so processadas antes que outro processador possa adquirir
o barramento. Discutiremos em breve as complexidades de um barramento de transao dividida. Na imple-
mentao mais simples, a mquina de estados finitos da Figura I.1 simplesmente replicada para cada bloco na
cache. Como no existe nenhuma interao entre operaes em diferentes blocos de cache, essa replicao do
controlador funciona. A replicao do controlador no necessria mas, antes de ver por que, vamos nos certi-
ficar de que entendemos a operao do controlador de estados finitos da Figura I.1.
Os estados adicionais da Figura I.1 em relao aos da Figura 6.12 so todos transientes: o controlador deixa-
r esses estados quando o barramento estiver disponvel. Quatro dos estados so estados pendentes de wri-
te-back que surgem porque, em uma cache de write-back, quando um bloco substitudo (ou invalidado), ele
deve ser gravado de volta na memria. Quatro eventos podem provocar tal write-back:
1. Um erro de gravao no barramento por outro processador para esse bloco exclusivo.

2. Um erro de leitura da CPU que fora a substituio do bloco exclusivo.

3. Um erro de gravao da CPU que fora a substituio do bloco exclusivo.

4. Um erro de leitura no barramento por outro processador para esse bloco.

Em cada um dos casos, o estado seguinte diferente; ento, h quatro estados pendentes de write-back sepa-
rados, com quatro estados sucessores distintos.
A replicao lgica do controlador para cada bloco da cache permite a operao correta se duas condies forem
vlidas (alm de nossa suposio bsica de que o processador bloqueado at se completar um acesso cache):
1. Uma operao no barramento para um bloco da cache e uma operao pendente para um bloco da cache di-
ferente no interferem entre si.
2. O controlador da Figura I.1 lida corretamente com os casos em que uma operao pendente e uma opera-
o de barramento se destinam ao mesmo bloco.
A primeira condio certamente verdadeira, pois operaes para diferentes blocos podem prosseguir em
qualquer ordem e no afetam as transies de estados para o outro bloco. Para ver por que a segunda condio
verdadeira, considere cada um dos estados pendentes e o que acontecer se houver um acesso conflitante:
n Write-back pendente 1 A cache est realizando o write-back dos dados para elimin-los de qualquer modo;
assim, um erro de leitura ou gravao para o bloco no tem nenhum efeito novo. Porm, note que a cache
pendente deve usar o ciclo de barramento gerado pelo erro de leitura ou gravao para completar o wri-
te-back. Caso contrrio, no haver nenhuma resposta ao erro, pois a cache pendente ainda ter a nica c-
pia do bloco da cache. Ao ver que o endereo de um erro corresponde ao endereo do bloco cujo write-back
est esperando, ele reconhece que o barramento est disponvel, grava os dados e realiza a transio de seu
estado. Isso se aplica a todos os estados pendentes de write-back.
I.1 Questes de implementao para o protocolo de coerncia de espionagem 175
Acerto de leitura da CPU

Erro de gravao
para esse bloco

Barramento
disponvel
Leitura Compartilhado
Leitura da CPU Coloca erro de
Invlido pendente (somente leitura)
leitura no
barramento
Erro de leitura da CPU

Gravao da CPU

Barramento disponvel

l
Bloco de write-back

nve
ack
ispo
e-b
od
writ

PU
ent

da C
de
ram

os
Bar
Dad

ao
Grav
Write-back

el
rite-back
to disponv
pendente 2

Write-back

Bloco de w
pendente 1

Barramen
Barra
mento
dispo
nvel
Write-back
PU

pendente 3 Dados de
da C
Erro de gravao para bloco

write-
itura

back Erro de
o
CP va
de le

gravao pendente
gra
U
Erro

de

el
onv
ro
da

disp men
to
Er

am ento arra
Barr o e b
m
va
e gra
rro d
ca e
Exclusivo Colo
Erro de leitura para bloco Write-back
(leitura/gravao)
pendente 4

Acerto de gravao da CPU


Acerto de leitura da CPU

Figura I.1 Um controlador de estados finitos para um esquema de coerncia de cache simples com uma cache de write-back. O
mecanismo que implementa esse controlador deve ser reentrante, isto , deve manipular vrias solicitaes para as diferentes linhas da ca-
che que esto sobrepostas no tempo. O diagrama pressupe que o processador se desdobrar (ficar paralisado) at se completar uma so-
licitao, mas outras transaes devem ser manipuladas. Esse controlador tambm pressupe que uma transio para um novo estado que
envolve um acesso de barramento no se completa at o acesso ao barramento se completar. Note que, se no exigssemos que um proces-
sador gerasse um erro de gravao ao fazer a transio do estado compartilhado para o estado exclusivo, ele poderia no obter o valor mais
recente de um bloco da cache, pois algum outro processador poderia ter atualizado esse bloco. Em um protocolo que utilizar transies de
propriedade ou atualizao, precisaremos ter a possibilidade de realizar a transio para fora do estado de gravao pendente e reiniciar
um acesso, caso uma gravao conflitante obtenha o barramento primeiro.

n Write-back pendente 2, 3 A cache est eliminando um bloco no estado exclusivo, e assim outro erro para
esse bloco simplesmente permitir que o write-back ocorra imediatamente. Se o erro de leitura ou gravao
no barramento for para o novo bloco que o processador est tentando compartilhar, no haver nenhuma in-
terao, pois o processador ainda no ter uma cpia do bloco.
n Write-back pendente 4 Nesse caso, o processador est entregando um bloco exclusivo e simplesmente
completa o write-back.
n Leitura pendente, erro de gravao pendente O processador ainda no tem uma cpia do bloco que est es-
perando, e assim um erro de leitura ou gravao para esse bloco no tem nenhum efeito. Tendo em vista que
a cache que est espera ainda precisa colocar um erro no barramento e buscar o bloco, ele tem a garantia de
obter uma nova cpia.
Com esses estados adicionais e nossas suposies de que o barramento opera atomicamente, que os erros
sempre causam a atualizao do estado e que o processador bloqueado at um acesso se completar, nossa im-
plementao de coerncia ao mesmo tempo livre de impasses e correta. Se houver alguma garantia de justia
para acesso ao barramento, ento esse controlador tambm estar livre de bloqueio ativo. O bloqueio ativo ocor-
176 Apndice I Implementao de protocolos de coerncia

re quando alguma parte de uma computao no pode progredir, embora outras partes possam ir adiante. Se
fosse possvel negar indefinidamente a um processador o barramento, talvez esse processador nunca progredis-
se em sua computao. Alguma garantia de justia no acesso ao barramento evita esse problema.
Entretanto, ainda existe um detalhe crtico de implementao relacionado s transaes de barramento e ao
que acontece quando um erro processado. A diferena fundamental entre o caso de coerncia de cache e o
caso do monoprocessador padro ocorre quando o bloco exclusivo em alguma cache. Por ser uma cache de
write-back, a cpia na memria est desatualizada. Nesse caso, a unidade de coerncia recuperar o bloco (que
se chama interveno) e gerar um write-back. Tendo em vista que a memria no conhece o estado do bloco,
ela tambm tentar responder solicitao. Como os dados foram atualizados, a cache e o processador tentaro
controlar o barramento com valores diferentes. Para impedir isso, acrescentada uma linha ao barramento (fre-
qentemente chamada linha compartilhada) para coordenar a resposta. Quando o processador detecta que tem
uma cpia no estado exclusivo, ele assinala a memria nessa linha e a memria cancela a transao. Quando
ocorre o write-back, a memria obtm os dados e atualiza sua cpia. Considerando-se que difcil limitar o
tempo de durao da espionagem da cpia da cache local, em geral essa linha implementada como uma opera-
o OR conectada a cada processador que mantm sua entrada baixa at saber que no tem o bloco em estado
exclusivo. A memria espera que a linha seja ativada, indicando que nenhuma cache tem a cpia no estado ex-
clusivo, antes de colocar dados no barramento.
Se o barramento tivesse um recurso de transao dividida, no poderamos supor que ocorreria uma res-
posta imediata. De fato, a implementao de uma transao dividida com coerncia muito mais complexa.
Um complicao surge do fato de que devemos numerar e controlar as transaes de barramento, de forma
que um controlador saiba quando uma ao do barramento uma resposta sua solicitao. Outra complica-
o lidar com a competio que pode surgir, porque duas operaes referentes ao mesmo bloco da cache
podem estar potencialmente pendentes ao mesmo tempo. Um exemplo ilustra melhor essa complicao. O
que acontece quando dois processadores tentam gravar uma palavra no mesmo bloco de cache? Sem transa-
es divididas, uma das operaes alcana o barramento primeiro e a outra tem de mudar o estado do bloco
para invlido e tentar a operao novamente. Apenas uma das transaes fica pendente no barramento em
qualquer instante.

EXEMPLO Vamos supor que temos um barramento de transao dividida e que nenhuma cache tem uma cpia de um blo-
co especfico. Mostre como podemos obter um resultado incorreto usando o protocolo da Figura I.1, quando
tanto P1 quanto P2 tentam gravar uma palavra nesse bloco.
Resposta Com o protocolo da Figura I.1, poderia ocorrer esta seqncia de eventos:

1. P1 coloca no barramento um erro de gravao para o bloco. Como P2 tem os dados no estado invlido,
nada acontece.
2. P2 coloca seu erro de gravao no barramento; mais uma vez, como no existe nenhuma cpia, no ne-
cessria nenhuma mudana de estado.
3. A memria responde solicitao de P1. P1 coloca o bloco no estado exclusivo e grava a palavra no bloco.

4. A memria responde solicitao de P2. P2 coloca o bloco no estado exclusivo e grava a palavra no bloco.

Desastre! Agora as duas caches tm o mesmo bloco no estado exclusivo e a memria ser inconsistente.

Como essa competio pode ser evitada? O modo mais simples usar a capacidade de difuso do barramen-
to. Todos os controladores de coerncia controlam todos os acessos ao barramento. Em um barramento de
transao dividida, as transaes devem ser marcadas com a identidade do processador (ou com um nmero
de transao), para que um processador possa identificar uma resposta sua solicitao. Todo controlador
pode manter o controle do endereo de memria de qualquer solicitao de barramento pendente, pois ele
pode ver a solicitao e a resposta correspondente no barramento. Quando o processador local gera um erro, o
controlador no coloca a solicitao de erro no barramento enquanto houver solicitaes pendentes para o
mesmo bloco de cache. Isso forar P2 no exemplo anterior a esperar que o acesso de P1 se complete, permitin-
I.2 Questes de implementao no protocolo de diretrio distribudo 177

do a P1 colocar os dados no estado exclusivo (e gravar a palavra no bloco). A solicitao de erro de P2 far ento
P1 realizar um write-back e mover o bloco para o estado invlido. Como uma alternativa, poderamos fazer
cada processador colocar no buffer apenas suas prprias solicitaes e controlar as respostas s outras. Se o en-
dereo do bloco solicitado estivesse includo na resposta, o segundo processador a solicitar o bloco poderia ig-
norar a resposta e voltar a emitir sua solicitao.
Essas condies de competio tornam a implementao da coerncia ainda mais complicada medida que
o mecanismo de interconexo fica mais sofisticado. Como veremos na prxima seo, esses problemas so um
pouco piores em um sistema baseado em diretrio que no tem um mecanismo de difuso, como um barramen-
to, que possa ser utilizado para ordenar todos os acessos.

I.2 Questes de implementao no protocolo de diretrio distribudo


Uma fonte adicional de complexidade de um protocolo de diretrio vem da falta de atomicidade nas tran-
saes. Vrias operaes atmicas em um protocolo de espionagem baseado em barramento no podem ser
atmicas em uma mquina baseada em diretrio. Por exemplo, um erro de leitura, que atmico em um
protocolo de espionagem, no pode ser atmico, pois exige que as mensagens sejam enviadas para diretrios
e caches remotos. De fato, se tentarmos implementar essas operaes com uma forma atmica em uma m-
quina de memria distribuda, poderemos ter um impasse. Vimos no Captulo 6 que um impasse significa
que a mquina chegou a um estado em que no pode fazer nenhum progresso. fcil ver isso com um
exemplo.

EXEMPLO Mostre como poder ocorrer um impasse se um n tratar um erro de leitura como atmico e, conseqentemen-
te, for incapaz de responder a outras solicitaes at o erro de leitura ser completado.
Resposta Suponha que cada um dos dois ns P1 e P2 tenha cpias exclusivas dos blocos de cache X1 e X2 que tm diret-
rios locais diferentes. Considere a seqncia de eventos, mostrada na Figura I.2.
Nesse momento, os ns chegam a um impasse e, nesse caso, como as solicitaes se referem a blocos separa-
dos, o impasse pode ser evitado duplicando-se o controlador para cada bloco. Isso permite que os controladores
aceitem uma solicitao para um bloco enquanto uma solicitao para outro bloco est sendo processada. Na pr-
tica, surgem complicaes porque solicitaes para o mesmo bloco podem colidir, como veremos em breve.

A ausncia quase completa de atomicidade em transaes causa da maior parte das complexidades na
converso desses diagramas de transies de estados em controladores de estados finitos reais. Existem duas
suposies sobre a rede de interconexo que simplificam de forma significativa a implementao. Primeiro,
supomos que a rede oferece entrega em ordem de mensagens ponto a ponto. Isso significa que duas mensa-
gens enviadas de um nico n para outro n chegam na ordem que foram enviadas. No feita nenhuma su-
posio sobre mensagens que tm origem em ns diferentes ou que se destinam a ns distintos. Em segundo
lugar, supomos que a rede tem bufferizao ilimitada. Essa segunda suposio significa que uma mensagem
sempre pode ser aceita na rede. Isso reduz a possibilidade de impasse e nos permite tratar algumas aes no-
atmicas, em situaes nas quais precisaramos ter a possibilidade de lidar com um conjunto completo de
buffers de rede, como aes atmicas. claro que tambm supomos que a rede entrega todas as mensagens
dentro de um prazo finito.

Eventos causados pela atividade de P1 Eventos causados pela atividade de P2

Erro de leitura de P1 para X2 Erro de leitura de P2 para X1


O diretrio para X2 recebe o erro de leitura e O diretrio para X1 recebe o erro de leitura e gera
gera uma busca que enviada a P2 uma busca que enviada a P1
A busca chega a P1, espera pela concluso de A busca chega a P2, espera pela concluso de erro
erro de leitura atmica de leitura atmica
Figura I.2 Eventos causados por P1 e P2 que levam a impasse.
178 Apndice I Implementao de protocolos de coerncia

Enquanto a primeira suposio, de transmisso em ordem, bastante razovel e , de fato, verdadeira em


muitas mquinas, a segunda hiptese, de bufferizao ilimitada, no verdadeira. Na realidade, a rede s preci-
sa ser capaz de bufferizar um nmero finito de mensagens, pois ainda supomos que os processadores so blo-
queados ao ocorrerem erros. Na prtica, esse nmero ainda pode ser grande e pouco razovel; assim, discutire-
mos mais adiante na seo o que tem de mudar para se eliminar a suposio de que uma mensagem sempre
pode ser aceita, embora ainda se evite o impasse.
Tambm supomos que o controlador de coerncia duplicado para cada bloco de cache (para evitar ter de li-
dar com transaes sem conexes no relacionadas entre si) e que uma transio de estado s se completa
quando uma mensagem transmitida e uma resposta de valor de dados recebida (quando necessrio). Essa
ltima suposio significa simplesmente que no permitimos que a CPU continue e leia ou grave um bloco de
cache at o erro de leitura ou gravao ser atendido por uma mensagem de resposta de valor de dados. Isso eli-
mina um estado de transio que espera pela chegada do bloco. Como estamos supondo bufferizao ilimitada,
tambm supomos que uma mensagem de sada sempre pode ser transmitida antes de ser aceita a prxima men-
sagem de chegada.
Sob essas suposies, o diagrama de transio de estado da Figura 6.29 pode ser usado para o controlador de
coerncia na cache, com um pequeno acrscimo: o controlador simplesmente descarta quaisquer transaes de
entrada, que no sejam a resposta de valor de dados, enquanto espera por um erro de leitura ou gravao. Va-
mos examinar cada caso possvel que possa surgir enquanto a cache est esperando por uma resposta do diret-
rio. Os casos em que a cache est realizando a transio do bloco para invlido, seja de estado compartilhado ou
exclusivo, no importam, pois quaisquer sinais de entrada para esse bloco no afetam o bloco, uma vez que ele
invlido. Conseqentemente, s precisamos considerar casos em que o processador est realizando a transi-
o para o estado compartilhado ou exclusivo. H dois desses casos:
n Erro de leitura da CPU do estado invlido ou exclusivo O diretrio no responder at o bloco se tornar
disponvel. Alm disso, tendo em vista que qualquer write-back de uma entrada exclusiva para esse bloco
feita, o controlador pode ignorar quaisquer solicitaes.
n Erro de gravao da CPU Qualquer write-back exigido feito primeiro e o processador desdobrado (pa-
ralisado). Como no pode conter um bloco exclusivo em sua entrada de cache, ele pode ignorar solicitaes
para esse bloco at o erro de gravao ser atendido a partir do diretrio.
A explicao do caso de diretrio mais complexa, pois vrios controladores de cache podem enviar uma
mensagem para o mesmo bloco aproximadamente ao mesmo tempo. Essas operaes devem ser serializadas.
Diferente do caso de espionagem, em que todo controlador v toda solicitao no barramento ao mesmo tem-
po, as caches individuais s sabem o que aconteceu quando so notificadas pelo diretrio. Como o diretrio se-
rializa as mensagens ao receb-las e como todos os erros de gravao para um dado bloco da cache vo para o
mesmo diretrio, as gravaes sero serializadas pelo diretrio local.
Desse modo, o principal problema do controlador de diretrio lidar com a representao distribuda do es-
tado da cache. Tendo em vista que o diretrio tem de esperar pela concluso de certas operaes, como o envio
de invalidaes e a busca de um bloco de cache antes de efetuar a transio de estado, a maioria das competi-
es potenciais eliminada. Pelo fato de estarmos supondo bufferizao ilimitada, o diretrio sempre pode
completar uma transao antes de aceitar a prxima mensagem de entrada. Por essa razo, o diagrama de tran-
sio de estado da Figura 6.30 pode ser usado como uma implementao. Para ver por que, devemos considerar
casos em que o diretrio e a cache local no concordam sobre o estado de um bloco. A cache s pode ter um blo-
co em um estado menos restrito do que aquele em que o diretrio acredita que o bloco esteja, porque a realiza-
o da transio para o estado exclusivo a partir do estado invlido ou compartilhado, ou para compartilhado a
partir do estado invlido, exige uma mensagem para o diretrio e uma resposta. Desse modo, os nicos casos a
considerar so:
n O estado da cache local invlido, o estado do diretrio exclusivo O controlador da cache deve ter execu-
tado um write-back de dados do bloco (veja a Figura 6.29). Conseqentemente, o diretrio obter o bloco
em breve. Alm disso, nenhuma invalidao necessria, pois o bloco substitudo.
n O estado da cache local invlido, o estado do diretrio compartilhado (a cache local est substituindo a li-
nha) O diretrio enviar uma invalidao, que pode ser ignorada, pois o bloco substitudo. Alguns proto-
I.2 Questes de implementao no protocolo de diretrio distribudo 179

colos de diretrio enviam uma mensagem de sugesto de substituio quando uma linha compartilhada
substituda. Tais mensagens so usadas para eliminar invalidaes desnecessrias e para reduzir o estado ne-
cessrio no diretrio.
n O estado da cache local compartilhado, o estado do diretrio exclusivo O write-back j foi feito e o blo-
co foi substitudo; assim, uma busca/invalidao, que poderia ser enviada pelo diretrio, pode ser ignorada.
Conseqentemente, o protocolo opera de forma correta com bufferizao infinita.

Como lidar com bufferizao finita


O que acontece quando a rede no tem bufferizao ilimitada? A principal implicao desse limite que um
controlador de cache ou de diretrio pode ser incapaz de completar a transmisso de uma mensagem. Isso pode
levar a um impasse. O exemplo da pgina 177 mostrou um caso desse tipo de impasse. Mesmo se considerar-
mos um controlador separado para cada bloco de cache, de forma que as solicitaes no interfiram no contro-
lador, o exemplo chegar ao impasse se no houver nenhum buffer disponvel para enviar as respostas.
A ocorrncia de tal impasse se baseia em trs propriedades, que caracterizam muitas situaes de impasse:
1. Mais de um recurso exigido para completar uma transao: os buffers so necessrios para gerar solicita-
es, criar respostas e aceitar respostas.
2. Os recursos so retidos at uma transao no-atmica se completar: o buffer usado para criar a resposta
no pode ser liberado at a resposta ser aceita.
3. No existe nenhuma ordem parcial global na aquisio de recursos: os ns podem gerar solicitaes e res-
postas vontade.
Essas caractersticas levam ao impasse, e evitar o impasse exige a quebra de uma dessas propriedades. Impor
uma ordem parcial global, a soluo usada em um sistema de barramento, impraticvel em uma mquina dis-
tribuda de escala maior. Liberar recursos sem completar uma transao difcil, pois a transao deve ser com-
pletamente desfeita e no pode ficar semi-acabada. Conseqentemente, nossa abordagem ser tentar solucio-
nar a necessidade de vrios recursos. No podemos simplesmente eliminar essa necessidade, mas podemos ten-
tar assegurar que os recursos sempre estaro disponveis.
Um modo de assegurar que uma transao sempre poder se completar garantir que sempre haver buffers
para aceitar mensagens. Embora isso seja possvel para uma mquina pequena com processadores que so blo-
queados ao ocorrer um erro de cache, pode no ser muito prtico, pois uma nica gravao poderia gerar mui-
tas mensagens de invalidao. Alm disso, recursos como a pr-busca aumentariam o nvel de bufferizao exi-
gido. Existe uma estratgia alternativa, usada pela maioria dos sistemas e que garante que uma transao no
ser realmente iniciada at podermos assegurar que ela ter os recursos para se completar. A estratgia tem qua-
tro partes:
1. Uma rede separada (fsica ou virtual) usada para solicitaes e respostas, onde uma resposta qualquer
mensagem esperada por um controlador ao efetuar a transio entre estados. Isso assegura que novas soli-
citaes no podero bloquear respostas que liberaro buffers.
2. Toda solicitao que espera uma resposta aloca espao para aceitar a resposta quando a solicitao gera-
da. Se no houver espao disponvel, a solicitao esperar. Isso assegura que um n sempre poder aceitar
uma mensagem de resposta, o que permitir ao n que responder liberar seu buffer.
3. Qualquer controlador pode rejeitar (normalmente com uma mensagem NAK ou confirmao negativa)
qualquer solicitao, mas nunca pode emitir NAK para uma resposta. Isso impede que uma transao se
inicie se o controlador no puder garantir que ela ter espao em buffer para a resposta.
4. Qualquer solicitao que receber uma NAK em resposta ser simplesmente repetida.

Para entender por que isso suficiente para evitar um impasse, vamos considerar primeiro nosso exemplo
anterior. Como um erro de gravao uma solicitao que exige uma resposta, o espao para aceitar a resposta
alocado previamente. Por conseguinte, ambos os ns tero espao para a resposta. Tendo em vista que as re-
des esto separadas, uma resposta pode ser recebida ainda que no exista mais espao disponvel para solicita-
180 Apndice I Implementao de protocolos de coerncia

es. Como as solicitaes se destinam a dois blocos diferentes, os controladores de coerncia separados tratam
as solicitaes. Se os acessos tiverem como destino o mesmo endereo, eles sero serializados no diretrio e no
haver nenhum problema.
Para ver que no existe nenhum impasse de modo mais geral, temos de assegurar que todas as respostas po-
dem ser aceitas, e que toda solicitao eventualmente atendida. Tendo em vista que um controlador de cache
ou controlador de diretrio pode ter no mximo uma solicitao precisando de uma resposta pendente, ele
sempre pode aceitar a resposta ao retornar. Para ver que toda solicitao eventualmente atendida, s precisa-
mos mostrar que qualquer solicitao poderia ser completada. Considerando-se que toda solicitao comea
com um erro de leitura ou gravao em uma cache, suficiente mostrar que qualquer erro de leitura ou grava-
o eventualmente atendido. Tendo em vista que o caso do erro de gravao inclui as aes para um erro de
leitura como um subconjunto, vamos nos concentrar em mostrar que os erros de gravao so atendidos. A si-
tuao mais simples ocorre quando o bloco no est na cache; considerando que esse caso englobado pelo caso
em que o bloco compartilhado, vamos focalizar os casos compartilhado e exclusivo. Examinaremos o caso em
que o bloco compartilhado:

n A CPU tenta efetuar uma gravao e gera um erro de gravao que enviado ao diretrio. Nesse momento, o
processador desdobrado (paralisado).

n O erro de gravao enviado ao controlador de diretrio para esse bloco de memria. Observe que, embora
um controlador de cache manipule todas as solicitaes para um dado bloco de cache, independente de seu
contedo de memria, existe um controlador para cada bloco de memria. Desse modo, o nico conflito no
controlador de diretrio ocorre quando chegam duas solicitaes para o mesmo bloco. Isso crtico para a
operao do controlador livre de impasses e precisa ser tratado em uma implementao que utilize um nico
controlador.

n Agora, considere o que acontece no controlador de diretrio: suponha que o erro de gravao seja o prximo
item a chegar ao controlador de diretrio. O controlador envia as invalidaes, que sempre podem ser acei-
tas se o controlador para esse bloco estiver ocioso. Se o controlador no estiver ocioso, o processador dever
ser desdobrado. Tendo em vista que o processador desdobrado, ele deve ter gerado um erro de leitura ou
gravao. Se gerou um erro de leitura, ento ele substituiu esse bloco ou no tem uma cpia. Se no tem uma
cpia, ento ele enviou um erro de leitura e no pode continuar at o erro de leitura ser processado pelo dire-
trio (o erro de leitura no ser tratado at o erro de gravao ser manipulado). Se o controlador substituiu o
bloco, no precisamos nos preocupar com ele. Se o controlador est ocioso, ento ocorre uma invalidao, e
a cpia eliminada.

O caso em que o bloco exclusivo um pouco mais complicado. Nossa anlise comea quando o erro de
gravao chega ao controlador de diretrio para processamento. Existem dois casos a considerar:

n O controlador de diretrio envia ao processador uma mensagem de busca/invalidao; ao chegar, a mensa-


gem encontra o controlador de cache ocioso e o bloco no estado exclusivo. O controlador de cache envia um
write-back de dados ao diretrio local e torna seu estado invlido. Essa resposta chega ao controlador do di-
retrio local, que sempre pode aceitar a resposta, pois alocou previamente o buffer. O controlador de diret-
rio envia os dados de volta ao processador solicitante, que sempre pode aceitar a resposta; aps a atualizao
da cache, o controlador da cache solicitante reinicia o processador.

n O controlador de diretrio envia uma mensagem de busca/invalidao ao n indicado como proprietrio.


Quando a mensagem chega ao n proprietrio, descobre que esse controlador de cache assumiu um erro de
leitura ou gravao que provocou a substituio do bloco. Nesse caso, o controlador de cache j enviou o
bloco ao diretrio local com um write-back de dados e tornou os dados indisponveis. Tendo em vista que
esse exatamente o efeito da mensagem de busca/invalidao, o protocolo tambm opera corretamente nes-
se caso.

Mostramos que nosso mecanismo de coerncia opera de maneira correta quando os controladores so repli-
cados e quando as respostas podem receber uma NAK e ser repetidas. Essas duas suposies geram alguns pro-
blemas na implementao.
Exerccios 181

Implementao dos controladores de diretrio


Primeiro, vamos considerar de que maneira esses controladores, que supomos serem replicados, podem ser
construdos sem na realidade replic-los. No lado dos controladores de cache, a implementao real muito se-
melhante que foi necessria para o controlador de espionagem, porque os processadores se desdobram. Pode-
mos simplesmente acrescentar os estados transientes, da mesma forma que fizemos no caso de espionagem, e
observar que uma transao para um bloco de cache diferente pode ser tratada enquanto a operao atualmente
gerada pelo processador est pendente. Tendo em vista que um processador bloqueado em uma solicitao,
s necessrio lidar no mximo com uma operao pendente.
No lado do controlador de diretrio, tudo mais complicado. A dificuldade surge a partir do modo como
tratamos a recuperao e o retorno de um bloco. Em particular, durante o tempo em que um diretrio recupera
um bloco exclusivo e o devolve ao ns solicitante, o diretrio deve acomodar outras transaes. Caso contrrio,
a integrao dos controladores de diretrio para diferentes blocos de cache levar possibilidade de impasse.
Devido a essa situao, o controlador de diretrio deve ser reentrante, isto , deve ser capaz de suspender sua
execuo enquanto espera por uma resposta e aceitar outra transao. A nica situao em que isso deve ocor-
rer em resposta a erros de leitura ou gravao, enquanto se espera por uma resposta do proprietrio. Isso nos
leva a trs observaes importantes:
1. O estado do controlador s precisa ser salvo e restaurado enquanto uma operao de busca ou de busca/in-
validao est pendente.
2. A implementao pode limitar o nmero de transaes pendentes que esto sendo tratadas no diretrio,
simplesmente enviando mensagens NAK para solicitaes de erros de leitura ou gravao que poderiam fa-
zer o nmero de solicitaes pendentes ser excedido.
3. Se, em vez de retornar os dados pelo diretrio, o n proprietrio encaminhar os dados diretamente ao soli-
citante (alm de devolv-los ao diretrio), poderemos eliminar a necessidade de o diretrio tratar mais de
uma solicitao pendente. Essa motivao, alm da reduo da latncia, a razo para se utilizar o estilo
de protocolo de encaminhamento. O protocolo no estilo de encaminhamento introduz outro tipo de pro-
blema que discutiremos nos exerccios.
A principal dificuldade de implementao que nos resta tratar as mensagens NAK. Uma alternativa cada
processador controlar suas transaes pendentes, de forma a saber, ao receber a NAK, qual foi a transao soli-
citada. Outra alternativa incluir a solicitao original na NAK, para que o controlador que receber a NAK pos-
sa descobrir qual foi a solicitao original. Como toda solicitao aloca um slot para receber uma resposta e
uma NAK uma resposta, as mensagens NAK sempre podem ser recebidas. De fato, o buffer que contm o slot
de retorno para a solicitao tambm pode conter informaes sobre a solicitao, permitindo ao processador
emitir novamente a solicitao, se receber uma NAK.
Isso completa a implementao do esquema de diretrio. Na prtica, necessrio bastante cuidado para im-
plementar esses protocolos de forma correta e evitar o impasse. As idias fundamentais que vimos nesta seo
lidar com a no-atomicidade e com a bufferizao finita so crticas para assegurar uma implementao corre-
ta. Os projetistas descobriram que tcnicas de verificao formais e informais so teis para garantir implemen-
taes corretas.

Exerccios
I.1 [20] <6.5, I.2> A Convex Exemplar uma mquina coerente de memria compartilhada, organizada como um anel
de clusters de oito processadores. Descreva um protocolo para essa mquina, supondo que o anel pode ser espionado
e que um diretrio se situa na juno do anel e tambm pode ser interrogado a partir do interior do cluster. Quanto
espao de armazenamento de diretrio necessrio? Se os erros de coerncia estiverem uniformemente distribudos
e os erros de capacidade estiverem todos dentro de um cluster, qual ser o tempo mdio de acesso memria para o
Ocean funcionando em 64 processadores?
I.2 [15/20] <6.5, I.2> Conforme discutimos na Seo I.2, muitas mquinas DSM utilizam um protocolo de encaminha-
mento, no qual uma solicitao de erro de gravao para um bloco sujo remoto encaminhada ao n que tem a cpia
do bloco. Ento, o n remoto gera uma operao de write-back e tambm uma resposta de valor de dados.
182 Apndice I Implementao de protocolos de coerncia

a. [15] <6.5> Modifique os diagramas de estado das Figuras 6.29 e 6.30, de forma que os diagramas implementem
um protocolo de encaminhamento.
b. [20] <6.5, I.2> Protocolos de encaminhamento introduzem no protocolo uma condio de competio. Descreva
essa condio de competio. Mostre como as mensagens NAK podem ser usadas para resolver a condio de
competio.
I.3 [20] <6.5, I.2> O suporte para caches livres de bloqueio pode ter implicaes diferentes para protocolos de coerncia.
Mostre que, sem mudanas adicionais, permitir vrios erros pendentes de um n em um DSM pode levar ao impasse
ainda que a bufferizao seja ilimitada.

Potrebbero piacerti anche