Curso Livre de Arquitetura de Computadores/Caderno 2: Evolução e Desempenho do Computador

Fonte: Wikiversidade

Breve Histórico dos Computadores[editar | editar código-fonte]

Primeira geração: Válvulas[editar | editar código-fonte]

O ENIAC, foi o primeiro computador digital eletrônico de uso geral. O projeto foi criado para suprir necessidades de solucionar equações de balísticas no período da Segunda Guerra Mundial, porém ele ficou operacional apenas após o fim da mesma.[1]

Como a tarefa de entrar e alterar programas para o ENIAC era extremamente difícil, John von Neumann um dos criadores do conceito de programa armazenado, que consiste em um computador que consegue obter suas instruções lendo-as da memória, e um programa poderia ser criado ou até mesmo alterado definindo-se os valores de uma parte da memória.[1] Com esse conceito foi criado o IAS, que foi o protótipo dos computadores de uso geral.[1]

Estrutural geral do IAS[editar | editar código-fonte]

  • Memória principal: Para armazenar os dados e as instruções;[1]
  • Unidade lógica e Aritmética (ALU): Para operar sobre dados binários;[1]
  • Unidade de controle: Para interpretar as instruções contidas na memória e executa-las;[1]

Segunda geração: Transistores[editar | editar código-fonte]

A primeira mudança importante no computador eletrônico, foi a substituição da válvula pelo transistor.[1] O transistor é um dispositivo feito de silício, com isso ele dissipa menos calor que uma válvula, possui tamanho menor e também é menos custoso.[1]

Cada nova geração é caracterizada por possuir:

  • Maior desempenho de processamento;
  • Maior capacidade de memória;
  • Tamanho reduzido.[1]

Além dessas características, a segunda geração introduziu:

  • Unidades lógicas;
  • Unidades aritméticas;
  • Unidades de controle mais complexas;
  • Uso de linguagens de programação de alto nível;
  • Disponibilidade do software de sistema.[1]

Terceira geração: Circuitos integrados[editar | editar código-fonte]

Os computadores das gerações anteriores utilizavam componentes discretos, que consistiam em transistores, resistores, capacitores, entre outros componentes. Esses componentes eram fabricados separadamente, empacotados em seus próprios invólucros, soldados ou até mesmo ligados em placas de circuito, para serem instaladas em computadores e outros equipamentos eletrônicos. Quando um equipamento eletrônico exigia um componente o processo de manufatura era custoso e complicado de se fazer.[1]
Com esses problemas e o inicio da era da microeletrônica, o circuito integrado foi criado, com a ideia de fabricar um circuito inteiro com apenas um pedaço de silício, ao contrário do que ocorria nas gerações anteriores com os componentes discretos.[1]

Gerações posteriores[editar | editar código-fonte]

Após a terceira geração e a rápida evolução de tecnologias, a classificação por geração se tornou menos clara e significativa.[1]

Memória semicondutora[editar | editar código-fonte]

A primeira aplicação dos circuitos integrados aos computadores, foi na construção do processador em chips de circuito integrado. Também ocorreu que essa mesma tecnologia poderia ser utilizada na construção de memórias.[1]

Microprocessadores[editar | editar código-fonte]

Ao mesmo tempo que a densidade dos elementos nos chips de memória crescia a densidade dos chips de processadores subiam também. Ao longo do tempo, mais elementos eram colocados nos chips, consequentemente menos chips eram necessários para construir um único processador.[1]

Gap Semântico e a mudança de paradigma para Cpu’s multicore entre 2000 e 2006[editar | editar código-fonte]

Esta seção objetiva trazer informações a respeito do denominado “gap semântico” das décadas de 60 e 70. Mostrando como as linguagens de alto nível da época (Fortran, COBOL, LISP, etc) afetaram o projeto das CPUs. Em sequência, também visa explanar sobre a mudança de paradigma para CPUs multicore (multinúcleos) entre 2000 e 2006, apresentando o contexto, as motivações e os resultados, principalmente para o contexto do arquiteto de programas.

Introdução[editar | editar código-fonte]

As Linguagens de programação de alto nível ao passar dos anos se tornaram cada vez mais poderosas e complexas. Nas década de 60 e 70 os projetistas constantemente lutavam para manter o equilíbrio entre as demandas de vazão e processamento dos componentes do processador, visando a eliminação do gap semântico ou buraco semântico, que pode ser descrito como a enorme distância semântica entre as operações disponíveis em linguagens de alto nível e as operações disponibilizadas pelo hardware de computadores. As fabricantes de processadores da época, como DEC e IBM com a intenção de aumentar a complexidade das instruções de máquina em seus processadores, objetivando diminuir o gap semântico, e também facilitando a vida dos compiladores, desenvolveram a arquitetura CISC que é uma sigla para “ Complex Instruction Set Computer ”.[1]

GAP Semântico[editar | editar código-fonte]

CISC[editar | editar código-fonte]

CISC é uma linha de arquitetura de processadores capaz de executar centenas de instruções complexas diferentes sendo, assim, extremamente versátil. As tentativas de incorporar recursos de linguagem de alto nível como (Fortran, COBOL, LISP, etc) no conjunto de instruções levaram os arquitetos a fornecer instruções poderosas com uma ampla flexibilidade. [2] Entretanto, muitas vezes, projetar um recurso de conjunto de instruções de “alto nível” especificamente orientado para aceitar uma estrutura de linguagem de “alto nível” nem sempre é a melhor opção. Essas instruções fazem, muitas vezes mais trabalho do que o necessário, fornecendo, segundo Wulf (1981), conteúdo semântico demais, limitando o uso destas instruções para contextos específicos. Um exemplo de instrução citado por Hennesy (2008) é a CALLS do VAX, que utiliza uma grande quantidade de overhead.

RISC[editar | editar código-fonte]

Os projetistas descobriram que poderia ser igualmente eficaz, se não mais, projetar modelos de Computação com Conjunto de Instruções Reduzidas (RISC). Como as arquiteturas RISC visam Unidades de Controle mais simples, rápidas e baratas, elas geralmente optam por instruções mais simples possível, com pouca variedade e com poucos endereços. A pouca variedade dos tipos de instrução e dos modos de endereçamento, além de demandar uma Unidade de Controle mais simples, também traz outro importante benefício, que é a previsibilidade . Como as intrusões variam pouco de uma para outra, é mais fácil para a Unidade de Controle prever quantos ciclos serão necessários para executa-las. Esta previsibilidade traz benefícios diretos para o ganho de desempenho com o Pipeline . Ao saber quantos ciclos serão necessários para executar um estágio de uma instrução, a Unidade de Controle saberá exatamente quando será possível iniciar o estágio de uma próxima instrução. (UFPB, 201?)

Paradigmas para Cpu Multicore[editar | editar código-fonte]


Durante os primeiros 25 anos o crescimento do desempenho foi de 25% ao ano e era em grande parte controlado pela tecnologia. O aumento no de 52% até por volta dos anos 2000 é atribuído a ideias arquitetônicas e organizacionais mais avançadas. Em 2003, esse crescimento diminuiu para 20 %, e estabilizando em meados de 2005, nessa época idealizou-se a ideia dos múltiplos processadores. A mudança para múltiplos processadores por chip não veio de nenhuma descoberta que simplificou drasticamente a programação paralela ou tornou mais fácil construir computadores multicore. Ela ocorreu porque não havia outra opção, devido aos limites de ILP e de potência, os processadores estavam apenas “fritando ovos”. Nesse contexto a versão popular da lei de Moore — aumentar o desempenho a cada geração da tecnologia — está agora a cargo dos programadores.[2]

Lacuna semantica: RISC x CISC[editar | editar código-fonte]

Em suma, no passado, os engenheiros tentavam preencher a lacuna semântica tornando os microprocessadores mais complexos, como nos modelos CISC (Complex Instruction Set Computing). No entanto, eles descobriram que poderia ser igualmente eficaz, se não mais, projetar modelos de Computação com Conjunto de Instruções Reduzidas (RISC). A filosofia é que os microprocessadores não precisam realizar trabalhos complexos, mas podem dividir as instruções de alto nível em etapas simples. Isso ressoa com as maneiras pelas quais a programação semântica é compilada ou dividida em linguagem de máquina. A lacuna semântica ilustra a diferença entre humanos e computadores e como eles processam dados. Em se tratando dos paradigmas a principal mudança é que o paralelismo se tornou aparente para o programador (ele agora precisar usar esses recursos). Antes, se criava um programa serial e a arquitetura tratava de paralelizar a execução.

Referências

  1. 1,00 1,01 1,02 1,03 1,04 1,05 1,06 1,07 1,08 1,09 1,10 1,11 1,12 1,13 1,14 1,15 1,16 STALLINGS, W. Arquitetura e Organização de Computadores. 8 ed. - https://github.com/xstpl/Livros-1/raw/master/Arquitetura%20e%20Organiza%C3%A7%C3%A3o%20de%20Computadores%20-%208%C2%AA%20Ed.pdf
  2. 2,0 2,1 HENESSY, John L.; PATTERSON, David A. Arquitetura de computadores: uma abordagem quantitativa. 4. ed. Rio de Janeiro: Campus, 2008.