Há muitos detalhes sobre os carregadores de carregadores de olhais, como Kogge-Stone, Lander-Fischer, etc. nos cursos de CS da faculdade. Eles são descritos como "comuns no setor". No entanto, não consigo encontrar nenhuma evidência (além da cadeia de transporte de Manchester) nos últimos tempos, de que elas são realmente usadas em qualquer lugar especificamente. Uma pesquisa no Google retorna apenas páginas de periódicos e pesquisas acadêmicas. No máximo, implementações hipotéticas são fornecidas.
A minha pergunta é: existem locais / implementações específicas que são usadas para adicionar carregadores de olhais? Ou eles são irrelevantes para o mundo real?
Respostas:
Esta é uma pergunta direta com uma resposta muito complexa.
Primeiro, alguns antecedentes.
O projeto VLSI do mundo real é um campo extremamente técnico que apresenta um equilíbrio de trocas constante de mudanças. O tempo que um circuito leva para calcular uma resposta raramente é o único fator importante. Há também consumo de energia e área física, além de vários fatores que revelam que os circuitos que você está projetando são realmente analógicos (por exemplo, resistência do fio, capacitância parasitária). Tudo isso é importante em um circuito real e pode afetar o design escolhido.
Em segundo lugar, você deve considerar todo o ciclo de vida de um projeto. Um adicionador que é apropriado para uma realização VLSI pode não ser apropriado para uma realização FPGA. Se o projeto passar por uma fase sendo testada em um FPGA ... você entendeu.
Em terceiro lugar, nem todo somador é igual. Em uma CPU típica, existem muitos adicionadores que realizam tarefas diferentes; provavelmente existem várias ALUs inteiras, um somador de mantissa de ponto flutuante, um somador que aborda o cálculo, um somador que calcula alvos de ramificação e assim por diante. Isso não está contando os somadores de carry-save encontrados nas modernas unidades de multiplicação. Cada um tem suas próprias peculiaridades e restrições.
O cálculo da meta de ramificação, por exemplo, normalmente envolve a adição de uma pequena constante a uma palavra completa, o que sugere um design de somador diferente daquele que adiciona duas palavras completas. Da mesma forma, a adição de ponto flutuante requer uma etapa de arredondamento pós-adição que pode levar menos de um ciclo, portanto, não há razão para que você não possa roubar o restante do ciclo para finalizar a adição.
Por fim, e talvez o mais importante, os grandes players (por exemplo, Intel, AMD, NVIDIA) são bastante calados sobre detalhes de implementação de baixo nível por razões óbvias, a menos que pensem que podem obter um documento e / ou patente. Mesmo assim, muitas vezes você não pode ter certeza do que eles realmente fizeram sem a engenharia reversa.
Dito isto, existem algumas coisas que sabemos.
A principal coisa que você precisa entender é que os métodos carry-lookahead são blocos de construção e não necessariamente métodos em si mesmos. Uma analogia pode estar em ordem aqui.
Se você pensa em classes de algoritmos, provavelmente aprendeu vários algoritmos de classificação, como classificação rápida, classificação de mesclagem, classificação de inserção e assim por diante. No mundo real, se a classificação é um gargalo de desempenho, qualquer engenheiro decente pensaria neles como blocos de construção primitivos a partir dos quais uma classificação "real" pode ser construída.
O algoritmo de classificação da biblioteca padrão GNU C ++, por exemplo, usa classificação rápida, usando classificação de inserção quando os intervalos são pequenos o suficiente. No entanto, se após algumas passagens parecer que o particionamento de classificação rápida atingiu o comportamento patológico, ele voltará à classificação de heap. São três algoritmos de classificação diferentes para fazer uma classificação de força industrial.
O mesmo se aplica aos circuitos somadores. Sabe-se, por exemplo, que a unidade inteira Pentium 4 usava um somador Han-Carlson, que é uma mistura de Kogge-Stone e Brent-Kung. (Han-Carlson é especialmente interessante, porque é um "ponto ideal" na troca entre atraso de propagação e área da matriz, o que também é bastante eficiente em termos de energia.) Geralmente vale a pena usar uma mistura de vários métodos.
Os aditivos "puros" para transportadores com olhal ainda são a norma nos circuitos sintetizados (por exemplo, se você alimentar um operador Verilog "+" para a Cadence ou Synopsys), quando se trata de design manual, CPUs modernas de ponta com seus recursos superescalares. Os mecanismos de execução de ordem parecem estar se movendo em direção a um design ligeiramente diferente para suas unidades inteiras.
Adicionadores especulativos são circuitos com atraso de propagação extremamente baixo, mas funcionam corretamente corretamente algumas vezes (95% do tempo é típico), e é possível dizer com muito pouca lógica se o somador especulativo retorna o resultado correto ou não. Portanto, a ideia é fazer uma adição especulativa e metade de uma adição de carry-lookahead em paralelo, em um ciclo. Se o somador especulativo retornou a resposta correta, a instrução está concluída. Caso contrário, interrompa o pipeline e faça a outra metade da adição precisa.
Como você sabe que o caminho lento levará dois ciclos, os projetistas poderiam usar um método com mais espaço e economia de energia, mesmo que fosse muito lento para uso geral.
fonte
Sim, muitos computadores usam adicionadores de carry lookahead. Eu fiz engenharia reversa de alguns microprocessadores antigos e posso dar alguns exemplos.
A ALU no Intel 8008 (seu primeiro processador de 8 bits) incluía um grande circuito carry-lookahead implementado com lógica dinâmica. Esse circuito ocupava tanto espaço no molde quanto a própria ULA. Carry lookahead é mostrado na folha de dados do 8008 , figura 3. Não vi nenhum outro processador dos anos 70 com carry-lookahead para a ALU, portanto o 8008 é um pouco incomum nesse sentido.
O 6502 usa primitivo carry-lookahead para o incrementador de contador de programas (PC). Ele detecta se haverá uma transferência do byte inferior do PC e o usa para incrementar o byte superior. Isso reduz o transporte de ondulação de potencial de 16 a 8 bits. A ALU do 6502 usa transporte de ondulação, embora a lógica de transporte seja invertida para bits alternados, o que corta um inversor para fora do caminho e o torna um pouco mais rápido.
O Z-80 possui um incrementador / decrementador de 16 bits usado para atualizações do PC, instruções inc / dec e um contador de loop. Ele usa uma estrutura carry-skip para que os carry sejam calculados para grupos de dois bits. Além disso, ele usa alguns carry-lookahead para gerar o carry dos bits 0-7, 7-11 e 12-14. Outros carregamentos são calculados com o ripple carry ( detalhes ). A ALU do Z-80, surpreendentemente, é de 4 bits, então cada operação de 8 bits realiza duas passagens pela ALU.
O 8085, por outro lado, usa transporte de ondulação para seu incrementador / decrementador de 16 bits. Mas, como o 6502, ele ganha um pouco de velocidade ao inverter a lógica de transporte em bits alternados.
O ARM-1 possui uma ALU de 32 bits sem cabeça de transporte, apenas transporte de ondulação. Ele também usa o truque de inverter o transporte em bits alternados.
No mundo dos minicomputadores, muitos processadores foram construídos a partir do conhecido chip ALU 74181 de 4 bits, que possuía cabeça de transportar interna. Exemplos incluem o Data General Nova, o Xerox Alto, o VAX-11/780 e o TI-990. (Veja uma lista mais longa da Wikipedia .) Alguns desses tipos de ripple são usados entre cada chip de 4 bits e outros usam o chip de lookahead 74182 para lookahead completo.
Para resumir, diferentes microprocessadores usam uma variedade de técnicas de transporte, dependendo de seus objetivos de desempenho e de quais operações estão no caminho crítico. A ALU pode usar um carregador completo (como o 8008) ou pode até ter a metade do tamanho (como o Z-80). O incrementador pode ser um problema de desempenho, porque normalmente tem 16 bits em um processador de 8 bits, resultando em duas vezes o atraso de ondulação. O incrementador pode ter transporte de ondulação (8085), um visor de transporte (6502) ou vários estágios de transporte (Z-80).
fonte