Processador em Sistemas Paralelos
Na década de 80, um processador de propósito especial era popular para fazer multicomputadores chamados Transputer. Um transputador consistia em um processador central, uma pequena memória SRAM, uma interface de memória principal DRAM e quatro canais de comunicação, tudo em um único chip. Para fazer uma comunicação paralela com o computador, canais foram conectados para formar uma rede de Transputadores. Mas ele tem falta de capacidade computacional e, portanto, não pode atender à crescente demanda de aplicativos paralelos. Esse problema foi resolvido com o desenvolvimento de processadores RISC e também era barato.
O computador paralelo moderno usa microprocessadores que usam paralelismo em vários níveis, como paralelismo de nível de instrução e paralelismo de nível de dados.
Processadores de alto desempenho
Os processadores RISC e RISCy dominam o mercado de computadores paralelos de hoje.
As características do RISC tradicional são -
- Possui poucos modos de endereçamento.
- Tem um formato fixo para instruções, geralmente de 32 ou 64 bits.
- Possui instruções de carregamento / armazenamento dedicadas para carregar dados da memória para registrar e armazenar dados do registro para a memória.
- As operações aritméticas são sempre realizadas em registradores.
- Usa pipelining.
A maioria dos microprocessadores hoje em dia é superescalar, ou seja, em um computador paralelo, vários pipelines de instrução são usados. Portanto, os processadores superescalares podem executar mais de uma instrução ao mesmo tempo. A eficácia dos processadores superescalares depende da quantidade de paralelismo de nível de instrução (ILP) disponível nos aplicativos. Para manter os pipelines preenchidos, as instruções no nível do hardware são executadas em uma ordem diferente da ordem do programa.
Muitos microprocessadores modernos usam a abordagem de super pipelining . No super pipelining , para aumentar a frequência do clock, o trabalho realizado em um estágio de pipeline é reduzido e o número de estágios de pipeline é aumentado.
Processadores de palavras de instrução muito grandes (VLIW)
Eles são derivados da microprogramação horizontal e do processamento superescalar. As instruções nos processadores VLIW são muito grandes. As operações em uma única instrução são executadas em paralelo e encaminhadas para as unidades funcionais apropriadas para execução. Então, após buscar uma instrução VLIW, suas operações são decodificadas. Em seguida, as operações são despachadas para as unidades funcionais nas quais são executadas em paralelo.
Processadores Vetoriais
Os processadores vetoriais são coprocessadores para microprocessadores de uso geral. Os processadores vetoriais são geralmente registradores-registradores ou memória-memória. Uma instrução de vetor é buscada e decodificada e, em seguida, uma determinada operação é realizada para cada elemento dos vetores de operando, enquanto em um processador normal uma operação de vetor precisa de uma estrutura de loop no código. Para torná-lo mais eficiente, os processadores vetoriais encadeiam várias operações vetoriais, ou seja, o resultado de uma operação vetorial é encaminhado para outra como operando.
Cache
Caches são elementos importantes de microprocessadores de alto desempenho. Depois de cada 18 meses, a velocidade dos microprocessadores torna-se duas vezes, mas os chips DRAM para a memória principal não podem competir com essa velocidade. Portanto, os caches são introduzidos para preencher a lacuna de velocidade entre o processador e a memória. Um cache é uma memória SRAM rápida e pequena. Muitos mais caches são aplicados em processadores modernos, como caches Translation Look-Side Buffers (TLBs), caches de instrução e de dados, etc.
Cache Mapeado Direto
Em caches mapeados diretamente, uma função 'módulo' é usada para mapeamento um-para-um de endereços na memória principal para localizações de cache. Como a mesma entrada de cache pode ter vários blocos de memória principal mapeados para ela, o processador deve ser capaz de determinar se um bloco de dados no cache é o bloco de dados realmente necessário. Essa identificação é feita armazenando uma tag junto com um bloco de cache.
Cache Totalmente Associativo
Um mapeamento totalmente associativo permite colocar um bloco de cache em qualquer lugar do cache. Usando alguma política de substituição, o cache determina uma entrada de cache na qual armazena um bloco de cache. Caches totalmente associativos têm mapeamento flexível, o que minimiza o número de conflitos de entrada de cache. Como uma implementação totalmente associativa é cara, eles nunca são usados em grande escala.
Cache associativo de conjunto
Um mapeamento associativo de conjunto é uma combinação de um mapeamento direto e um mapeamento totalmente associativo. Nesse caso, as entradas de cache são subdivididas em conjuntos de cache. Como no mapeamento direto, há um mapeamento fixo de blocos de memória para um conjunto no cache. Mas dentro de um conjunto de cache, um bloco de memória é mapeado de maneira totalmente associativa.
Estratégias de cache
Além do mecanismo de mapeamento, os caches também precisam de uma série de estratégias que especificam o que deve acontecer no caso de certos eventos. No caso de caches associativos (set-), o cache deve determinar qual bloco de cache deve ser substituído por um novo bloco entrando no cache.
Algumas estratégias de substituição bem conhecidas são -
- Primeiro a entrar, primeiro a sair (FIFO)
- Menos usado recentemente (LRU)