Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
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.
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.
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.
31 29 24 18 13 12 4 0
31 25 20 15 0
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
31 29 18 12 1 0
31 25 20 0
31 29 20 15 12 1 0
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.
Formato: categoria de instruo Alpha MIPS64 PA-RISC 2.0 PowerPC SPARC v.9
Transferncia de dados
(formatos de instrues) R-I R-I R-I, R-R R-I, R-R R-I, R-R
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
Controle (formatos
de instrues) B, J/C B, J/C B, J/C B, J/C B, J/C
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
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.
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
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
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.
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
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
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.
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
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.
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]
R2 J O H N R4 J O H N
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.
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
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.
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.
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.
00 (R7)
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.
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
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.
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.
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
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.
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.
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 801
1975 Cray 1 1975
1976
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
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.
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
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).
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.
16 12 4 16 16 16 32
16
24 32
20
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.
Instruo Funo
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.
Instruo Significado
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.
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}
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:
Como mencionamos anteriormente, SSE2 apresenta ainda outro modelo de registradores de ponto flutuante
do IEEE.
Repetio
Bloqueio
Anulao de end.
Anulao de tamanho
Opcode
Opcode
Ext. de opcode
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.
reg w=0 16b 32b r/m 16b 32b 16b 32b 16b 32b mod = 3
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.
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
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%
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.
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
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.
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
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.
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.
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.
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.
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.
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.
Comprimento do
Nome do modo de especificador de
endereamento Sintaxe Exemplo Significado endereo em bytes
Como um exemplo especfico, vamos mostrar a codificao da instruo de adio do exemplo da pgi-
na 55:
addl3 r1,737(r2),(r3)[r4]
Cdigo de
Endereo de byte Contedo em cada byte mquina
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
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:
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):
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.
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.
O cdigo VAX para esses procedimentos se baseia no cdigo produzido pelo compilador VMS C usando oti-
mizao.
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
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
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:
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.
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:
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!
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.
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:
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:
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 :
subl3 r4,r6,#1 ;j = i 1
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):
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:
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:
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
calls #2,swap
Passagem de parmetros
O compilador C repassa variveis para a pilha; assim, repassamos os parmetros para swap com estas duas ins-
trues:
Tendo em vista que ret ir desfazer todas as operaes, simplesmente a inclumos no fim do procedimento.
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
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
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.).
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.
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.
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.
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
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:
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;
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
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.
1. Arquitetura de 32 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.
Instruo Descrio
Instruo Descrio
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
Instruo Descrio
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
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
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
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.
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.
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.
Y = a X + Y
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.
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
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.
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.
EXEMPLO Mostre como a seqncia de cdigo a seguir est disposta em comboios, supondo-se uma nica cpia de cada
unidade funcional vetorial:
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:
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.
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.
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
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.
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
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
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
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:
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
Tincio = 12 + 7 + 12 = 31
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.
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:
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.
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:
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:
Tempo1 = 5(n)
Tempo2 = 4n + 4fn
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[1] B[1] A[4] B[4] A[5] B[5] A[6] B[6] A[7] B[7]
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]).
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.
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.
Completamente
Processador Compilador vetorizado Parcialmente vetorizado No-vetorizado
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.
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.
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).
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!
Agora, podemos obter uma estimativa precisa do desempenho de DAXPY, usando um comprimento de ve-
tor igual a 66.
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:
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).
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?
T
lim (Ciclos de clock por iterao) = lim n
n n n
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:
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.
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
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.
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
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
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
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
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
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].
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.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
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.
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:
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)
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.
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
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:
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
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.
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.
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.
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.
( s1 2 el ) ( s 2 2 e 2 ) = ( s1 s 2 ) 2 el + e 2
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.
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.
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. . .
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.
P A
Produto x0 x1 . x2 x3 x4 x5 g r s s s s
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:
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
- +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.
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
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
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.
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.
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.
8. Ambos os sinais so negativos; assim, o sinal do resultado negativo. Resposta final: S 2exp = 1.0012 21.
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
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.
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.
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
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 )
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
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.
3. Defina x 0 = ab e y 0 = bb .
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.
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.
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).
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.
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:
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:
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.
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
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.
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.
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
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.
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.
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.
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].
Pads
Input registers
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
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.
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.
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
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
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
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.
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.
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.
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:
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
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.