Processadores - Universo de Tecnologia

U T
Ir para o conteúdo

ProcessadoresProcessor

     O microprocessador, geralmente chamado apenas de processador, é um circuito integrado que realiza as funções de cálculo e tomada de decisão de um computador.  Todos os computadores e equipamentos eletrônicos baseiam-se nele para  executar suas funções, podemos dizer que o processador é o cérebro do  computador por realizar todas estas funções.
     Um microprocessador incorpora as funções de uma unidade central de computação (UCP)  em um único circuito integrado, ou no máximo alguns circuitos  integrados. É um dispositivo multifuncional programável que aceita dados  digitais como entrada, processa de acordo com as instruções armazenadas  em sua memória, e fornece resultados como saída. Microprocessadores  operam com números e símbolos representados no sistema binário.
 
     Arquitetura  interna de um microprocessador dedicado para processamento de imagens  de ressonância magnética, a fotografia foi aumentada 600 vezes, sob luz  ultravioleta para se enxergar os detalhes
 
     Vista inferior de um Athlon XP 1800+ núcleo Palomino, um microprocessador moderno.
     O microprocessador é um circuito integrado formado por uma camada chamada de mesa epitaxial de silício, trabalhada de modo a formar um cristal  de extrema pureza, laminada até uma espessura mínima com grande  precisão, depois cuidadosamente mascarada por um processo fotográfico e  dopada pela exposição a altas temperaturas em fornos que contêm misturas  gasosas de impurezas. Este processo é repetido tantas vezes quanto  necessário à formação da microarquitetura do componente.
     Responsável pela execução das instruções num sistema, o  microprocessador, escolhido entre os disponíveis no mercado, determina,  em certa medida a capacidade de processamento do computador e também o conjunto primário de instruções que ele compreende. O sistema operativo é construído sobre este conjunto.
     O próprio microprocessador subdivide-se em várias unidades, trabalhando em altas freqüências. A ULA (Unidade Lógica e Aritmética), unidade responsável pelos cálculos aritméticos e lógicos e os registradores são parte integrante do microprocessador na família x86, por exemplo.
     Embora seja a essência do computador, o microprocessador diferente do microcontrolador, está longe de ser um computador completo. Para que possa interagir com o utilizador precisa de: memória, dispositivos de entrada/saída, um clock,  controladores e conversores de sinais, entre outros. Cada um desses  circuitos de apoio interage de modo peculiar com os programas e, dessa  forma, ajuda a moldar o funcionamento do computador.

História

     Herman Hollerith,  um inventor de diversas máquinas elétricas para a soma e contagem de  dados que eram representados sob a forma de fitas de papel perfuradas.  Através dessas perfurações, os dados que elas representavam podiam ser  computados de uma forma rápida e automática, através de circuitos  elétricos. Com esse processo, os Estados Unidos puderam acompanhar de  perto o crescimento de sua população. Os resultados do censo de 1890  foram fornecidos três anos depois, economizando-se vários anos de  trabalho.
     Em 1896, Hollerith criou a Tabulating Machine Company e  introduziu inovações em sua descoberta: a fita de papel foi substituída  por cartões. Estes viriam a ser o elemento básico das máquinas IBM de  processamento de dados de algumas décadas atrás. Já em 1911, duas outras  companhias, a Internacional Time Recorde Co.  (de registradores mecânicos de tempo), e a Computing Cale Co. (de  instrumentos de aferição de peso), uniram-se a ela, por sugestão do  negociante e banqueiro Charles R. Flint, formando-se então a Computing Tabulating Recording Co - a CTR.
     Três anos mais tarde, em 1914, Thomas J. Watson  (líder industrial que foi um dos homens mais ricos do seu tempo)  assumiu a presidência da organização e estabeleceu normas de trabalho  absolutamente inovadoras para a época. Naquele tempo, a CTR contava com  menos de 1400 funcionários e as constantes pesquisas de engenharia  resultaram na criação e no aperfeiçoamento de novas máquinas de  contabilidade, exigidas pelo rápido desenvolvimento industrial. Antes do  ano de 1924, aquele pequeno grupo de homens havia aumentado e  diversificado muito sua experiência. Os produtos ganharam maior  qualidade, surgiram novas máquinas e com elas novos escritórios de  vendas e mais vendedores.
     Em fevereiro de 1924 a CTR muda seu nome para INTERNATIONAL BUSINESS MACHINES, hoje mundialmente conhecida pelo seu acrônimo, IBM.
     A sigla IBM passou a ser, desde então, a fórmula para que a  indústria e o comércio continuassem a resolver seus problemas de  desenvolvimento.
     No início do século XX, a IBM era a única empresa do mundo que  dispunha da tecnologia de cartões perfurados, aplicado em quase todas as  áreas que utilizavam máquinas para cadastro, identificação, arquivo e  regulação de informações. O equipamento desenvolvido pela IBM foi também  utilizado para fins menos nobres durante o período da 2ª Guerra  Mundial, quando o Terceiro Reich firmou uma parceria com a empresa para  automatizar o sistema de identificação, controle e transferência de prisioneiros, segundo o jornalista Edwin  Black no seu livro “Nazi Nexus: America's Corporate Connections to  Hitler's Holocaust”, de 2009. Os serviços prestados pela IBM ao  governo alemão rendeu o equivalente a US$ 200 milhões. O número de  identificação tatuado no braço dos prisioneiros do campo de concentração  de Auschwitz relacionava-se ao número de cartão perfurado dos registros  da IBM.
     Em consequência do constante e rápido desenvolvimento, a  International Business Machines Corporation criou em 1949 a IBM World  Trade Corporation, uma subsidiária inteiramente independente, cujo  objetivo era aumentar vendas, serviços e produção fora dos Estados  Unidos.
     As fábricas e laboratórios da IBM funcionam em 15 diferentes  países. Essas fábricas estão integradas aos laboratórios de  desenvolvimento na França, Alemanha, Espanha, Itália, Holanda, Suécia, Inglaterra, Brasil, Argentina, Colômbia, México, Canadá, Austrália e Japão.
     A IBM é uma das principais empresas que investe em pesquisa e  desenvolvimento mantendo-se na liderança do ranking de publicação de  patentes há 16 anos consecutivos - a IBM publicou 4.914 patentes  norte-americanas em 2009, estabelecendo um recorde histórico para a "Big  Blue", mantendo sua liderança contra competidores como a Samsung (3.611 patentes) e a Microsoft (2.906 patentes).
     Nos últimos anos, a IBM transformou completamente seu modelo de  negócio. A empresa se desfez de várias atividades que já tinham se  transformado em "commodities", como os segmentos de PCs  e impressoras, e ampliou os investimentos nas áreas de prestação de  serviços, que possuem um superior valor agregado, como consultoria,  informação sob demanda e serviços. Em 2005, sua divisão de PCs foi vendida para a empresa chinesa Lenovo.

Multicore

     Processador multinúcleo (múltiplos núcleos, do inglês multicore) é o que tem dois ou mais núcleos de processamento (cores) no interior de um único chip. Estes dois ou mais núcleos são responsáveis por dividir as tarefas entre si, ou seja, permitem trabalhar em um ambiente multitarefa.  Em processadores de um só núcleo, as funções de multitarefa podem  ultrapassar a capacidade da CPU, o que resulta em queda no desempenho  enquanto as operações aguardam para serem processadas. Em processadores  de múltiplos núcleos o sistema operacional trata cada um desses núcleos como um processador diferente. Na maioria dos casos, cada unidade possui seu próprio cache  e pode processar várias instruções quase simultaneamente. Adicionar  novos núcleos de processamento a um processador (único encapsulamento)  possibilita que as instruções das aplicações sejam executadas em  paralelo, como se fossem 2 ou mais processadores distintos.
     Os dois núcleos não somam a capacidade de processamento, mas  dividem as tarefas entre si. Por exemplo, um processador de dois núcleos  com clock de 1.8 GHz  não equivale a um processador de um núcleo funcionando com clock de 3.6  Ghz, e sim dois núcleos 1,8GHZ operando em paralelo. O termo multinúcleo ou multicore (como é popularmente conhecido), são  por vezes utilizados para descrever arquiteturas multicore com um número  particularmente elevado de núcleos (dezenas ou centenas).
     O surgimento dos processadores multicore, tornou-se necessário  principalmente devido a missão cada vez mais difícil de resfriar  processadores singlecore (processadores de apenas um núcleo) com clocks  cada vez mais altos; devido a concentração cada vez maior de  transistores cada vez menores em um mesmo circuito integrado. E além  dessa e outras limitações dos processadores singlecore, existe a grande  diferença  entre a  velocidade da memória e do processador, aliada à  estreita banda de dados, que faz com que aproximadamente 75 por cento do  uso do microprocessador seja gasto na espera por resultados dos acessos  à memória.

Descrição

     Na  maioria dos processadores de mais de um núcleo, cada núcleo pode possuir  sua própria cache e alguns casos realizam acesso direto e independente à  memória principal; possibilita-se, assim, que as instruções de  aplicações sejam executadas em paralelo, ou seja, cada processador  realiza os cálculos de que é requisitado concorrentemente com o outro,  ganhando desempenho. Este, porém, depende muito dos algoritmos de  software utilizados e de suas implementações.
Outra vantagem do processamento em paralelo é a capacidade de  cada processador ficar responsável pela execução de um aplicativo, como  por exemplo, quando o usuário está executando algum arquivo de som e ao  mesmo tempo executando a varredura do antivírus.
     A diferença desse processamento paralelo e do até então usado nos  processadores singlecore pode ser visto nas figuras abaixo; observe o  gargalo (bottleneck)  criado pelos aplicativos executados simultaneamente no singlecore, e  como ele desaparece na figura com os dois núcleos (cores).

Surgimento

     Embora  a tecnologia de fabricação tenha melhorado, reduzindo o tamanho de  processadores individuais, limites físicos de semicondutores baseados em  microeletrônica haviam se tornado uma preocupação principal. Estas  limitações físicas poderiam causar dissipação de calor significativa e  problemas de sincronização de dados. Vários métodos foram e estão sendo  usados ​​para melhorar o desempenho da CPU. Alguns paralelismos por  nível de instrução (ILP), métodos como pipelining superescalares são  adequados para muitas aplicações, mas são ineficientes para os que são  difíceis de prever código. Muitas aplicações são mais adequadas para  paralelismo por nível de thread (TLP), métodos e múltiplas CPUs  independentes são comumente usados ​​para aumentar a TLP geral de um  sistema. Uma combinação de espaço disponível aumentou (devido a  processos de fabricação refinados) e a demanda por TLP aumento e levou  ao desenvolvimento de CPUs multi-core.

Incentivos Comerciais

     Vários  negócios impulsionaram o desenvolvimento da arquitetura multicore.  Durante décadas, foi possível melhorar o desempenho de uma CPU,  reduzindo a área do circuito integrado, que diminuiu o custo por  dispositivo. Como alternativa, mais transistores poderiam ser utilizados  no projeto, o que aumentou a funcionalidade, especialmente para as  arquiteturas CISC. Eventualmente, estas técnicas atingiram o seu limite e  não puderam continuar a melhorar o desempenho da CPU. Múltiplos  processadores tiveram que ser empregados para ganhar velocidade no  processamento. Vários núcleos foram usados ​​no mesmo chip para melhorar  o desempenho, o que poderia então levar a melhores vendas de CPUs que  tinham dois ou mais núcleos.

Vantagens

     Uma  das principais vantagens dos processadores multicore é também um dos  principais motivos da sua invenção. Essa vantagem é a sua maior  capacidade - comparado aos singlecores - de resfriamento; o que ainda  possibilitou e ainda possibilita o aumento do poder de processamento.
     Economia no preço de licenciamento de softwares proprietários,  passando a ter um maior poder de processamento sem necessitar de uma  nova máquina.
     Processadores multicore também permitem maior desempenho com  menor energia. Isso pode ser um fator importante em dispositivos móveis  que funcionam com baterias. Uma vez que cada núcleo em multicore é  geralmente mais eficiente em termos energéticos, o chip se torna mais  eficiente do que ter um grande núcleo único e monolítico.
     As outras vantagens quase que por completo relacionam-se com a  capacidade de processamento, principalmente quando se trata da execução  de mais de um aplicativo ao mesmo tempo ou mesmo e aplicativos capazes  de realizar o seu processamento paralelamente, conseguindo assim  trabalhar com dois ou mais núcleos concomitantemente. Nos processadores mais recentemente desenvolvidos existe também uma  melhora no acesso a memória e na troca de dados entre os próprios  núcleos.
     Porém, é importante destacar também que para que a qualidade de  processamento paralelo dos multicores seja utilizada na sua totalidade  os softwares instalados na máquina devem ser escritos para aproveitar  esse recurso; para isso as aplicações devem ser escritas utilizando e  armazenando os conceitos de threads, assim uma única aplicação utilizará o poder de processamentos dos dois ou mais processadores.

Desvantagens

     Processadores  multicore possuem um bom desempenho, performance, disponibilidade e  segurança a um menor custo. Por outro lado, esta tecnologia possui  algumas desvantagens, entre as principais podemos destacar:
     O aumento da utilização dos recursos computacionais fornecidos  por processadores multicore requerem ajustes, tanto para o sistema  operacional de apoio quanto para o software aplicativo já existente.
     A capacidade dos processadores multi-core depende da utilização  de vários segmentos dentro das aplicações para aumentar o desempenho da  aplicação.  

Arquitetura

     Com  o surgimento dos multicores tornou-se necessário algumas adaptações a  nível de arquitetura para o melhor aproveitamento dos seus núcleos, e as  primeiras a serem feitas tem como objetivo melhorar o paralelismo a  nível de threads e assim criar uma arquitetura que propicie o chamado  paralelismo ao nível do chip.
     Algumas vantagens da arquitetura são: a melhor localização dos  dados em se comparando com outras arquiteturas de multiprocessamento; a  melhor comunicação entre as unidades e o número reduzido de quantidade  de espaço e energia necessários.
     A arquitetura é geralmente um SMP, ou seja, um multiprocessamento simétrico; implementado em um circuito VLSI  - Very Large Scale Integration. Essa é uma arquitetura onde dois ou  mais processadores idênticos são ligados a uma única memória principal.  Porém ao SMP existem outras alternativas de se criar uma arquitetura com  variantes para o tratamento da memória ou até mesmo a comunicação entre  os diversos núcleos presentes no processador.
Clock do Processador

     Em eletrônica e especialmente em circuitos digitais síncronos, o sinal de relógio (em inglês, clock signal) é um sinal usado para coordenar as ações de dois ou mais circuitos eletrônicos. Um sinal de clock oscila entre os estados alto e baixo, normalmente usando um ciclo de trabalho (duty cicle) de 50%, e gerando uma onda quadrada. Circuitos que usam o sinal de clock para sincronização podem se tornar ativos no ápice, na queda ou em ambos os momentos do sinal de clock (por exemplo, uma DDR SDRAM).

Circuito Digital

     A maioria dos circuitos integrados complexos o suficiente usa um sinais de clock para sincronizar as diferentes partes do circuito. Em alguns casos, mais do que um ciclo de clock é necessário para executar uma ação previsível. Como os circuitos integrados se tornaram mais complexos, o problema de fornecer sinais de clock precisos e sincronizados para todos os circuitos torna-se cada vez mais difícil. O exemplo mais proeminente das tais circuitos complexos é o microprocessador, o componente central de computadores modernos, que se baseia em um sinal de clock, a partir de um oscilador de cristal. As únicas exceções são os circuitos assíncronos, tais como as CPU assíncronas.
     Um sinal de clock também pode ser fechado, isto é, combinado com um sinal de controle, que ativa ou desativa o sinal de clock em uma determinada parte de um circuito. Esta técnica é frequentemente usada para economizar energia desligando efetivamente partes de um circuito digital quando não estão em uso.

Sinal de Clock monofásico

     A maioria dos circuitos síncronos modernos usam apenas um sinal de clock monofásico. Em outras palavras, eles transmitem todos os sinal de clock em (efetivamente) 1 fio.

Sinal de Clock bifásico

     Em circuitos síncronos, um sinal de clock bifásico refere-se a sinal de clock distribuídos em 2 fios, cada um com pulsos não sobrepostos. Tradicionalmente, um fio é chamado "fase 1", o outro fio transporta o sinal da "fase 2".

Sinal de Clock tetrafásico

     O  sinal de clock tetrafásico tem sinais distribuídos em 4 fios.
     Em alguns microprocessadores primitivos, tais como a família IMP-16 da National Semiconductor, um sinal de clock multifásico foi utilizado. No caso do IMP-16, o sinal de clock tinha quatro fases, cada uma com 90 graus separando-se da outra, a fim de sincronizar as operações do núcleo do processador e dos seus periféricos.  
     No entanto, a maioria dos microprocessadores e microcontroladores modernos usam um sinal de clock monofásico.

Multiplicador de sinais de relógio

     Muitos microcomputadores modernos utilizam um "multiplicador de sinais de clock", que multiplica o sinal de clock externo (com um frequência inferior) à frequência de clock adequada do microprocessador. Isso permite que a CPU opere em uma frequência muito maior do que o resto do computador, o que proporciona ganhos de desempenho em situações que a CPU não precisa esperar por um fator externo (como memória ou entrada / saída).

Mudança de frequência dinâmica

     A grande maioria dos dispositivos digitais não exige um sinal de clock de frequência constante (fixa). Enquanto os tempos mínimos e máximos de sinal de clock são respeitados, o tempo entre os picos pode variar muito de uma ponta a outra e vice-versa. Tais dispositivos digitais funcionam tão bem com um gerador de sinais de clock que modifica sua frequência (como espalhamento espectral, PowerNow!, Cool'n'Quiet, Passorrápido, etc.). Dispositivos que usam a lógica estática nem mesmo têm um tempo máximo de sinal de clock; tais dispositivos podem ser retardados e parados por tempo indeterminado, e em seguida retomar a velocidade de sinal de clock completa em qualquer momento posterior.

Outros Circuitos

     Alguns circuitos integrados híbridos sensíveis, como conversores analógico-digitais de precisão, usam senoides em vez de ondas quadradas como sinal de clock, uma vez que as ondas quadradas possuem harmônicas de alta frequência que podem interferir com circuitos analógicos e causar ruído.

Distribuição

     A maneira mais efetiva de transportar um sinal de clock para todas as partes necessárias de um circuito integrado com a menor inclinação (em inglês clock skew) é uma grade metálica. Num processador de grandes dimensões, a energia usada para transportar o sinal de clock pode ser superior a 30% do total de energia gasto pelo circuito integrado. A estrutura toda com as portas nos finais e todos os amplificadores no meio precisam ser carregados e descarregados a cada ciclo. Para poupar energia, o clock gating desliga temporariamente parte da estrutura.
     Os sinais de clock são tipicamente carregados com o maior fan-out e operam com as maiores velocidades de qualquer sinal dentro do sistema de sincronia. Desde que os sinais de dados são fornecidos com uma referência temporal pelos sinais de clock, as formas de onda do sinal de clock precisam de ser particularmente limpas e nítidas.
Cache do Processador

     Cache do processador (em inglês: CPU cache) é uma memória de acesso rápido. É usada pela Unidade Central de Processamento (CPU,  o processador) com o objetivo de reduzir o tempo médio de acesso aos  dados armazenados na memória. A cache é uma memória de pouco espaço,  porém muito mais rápida e armazena as informações que são usadas com  mais frequência pela CPU.
     Quando a CPU precisa buscar uma informação na memória, ela  busca primeiro pela cache. Se não encontrado, busca-se na Memória  Principal, então devolve a informação para a CPU e armazena esta informação na cache.
     Com os avanços tecnológicos, vários tipos de cache foram  desenvolvidos. Atualmente há cache em processadores, discos rígidos,  sistemas, servidores, nas placas-mãe, clusters  de bancos de dados, entre outros. Qualquer dispositivo que requeira do  usuário uma solicitação/requisição a algum outro recurso, seja de rede  ou local, interno ou externo a essa rede, pode requerer ou possuir de  fábrica o recurso de cache.
     Por ser mais caro, o recurso mais rápido não pode ser usado para  armazenar todas as informações. Sendo assim, usa-se o cache para  armazenar apenas as informações mais frequentemente usadas. Nas unidades  de disco também conhecidas como disco rígido (em inglês: hard drive, HD), também existem chips de cache nas placas eletrônicas que os acompanham.

Funcionamento

     Cache  (do inglês, escondido) é uma memória interna ao processador usada para  armazenamento temporário de dados que são usados com mais frequência  pelo processador.
     Outra definição mais precisa poderia ser: uma área de  armazenamento temporária dentro do processador onde os dados  frequentemente usados são acessados de forma mais rápida, sem  necessidade de acesso à memória principal.
     Quando a CPU necessita de um determinado endereço que está  armazenado na memória, o primeiro lugar a buscar este endereço é na  memória cache. Se o conteúdo está na cache, ocorre o acerto na cache,  chamado de cache hit (quando o conteúdo requisitado pelo CPU é  encontrado na cache), fazendo a informação ser acessada pela CPU sem  necessidade de acesso à memória principal. Se o conteúdo não está na  cache, ocorre uma falta de cache, chamado de cache miss (quando o  conteúdo requisitado pela CPU não esta presente na cache), o que leva a  CPU a buscar essa informação na memória principal. Como provavelmente  essa informação será requisitada novamente (localidade temporal) o dado  que foi buscado na RAM é copiado na cache.
     Como a cache possui capacidade de armazenamento extremamente  limitada (algo comum de acontecer devido ao seu custo), os novos dados  que chegam da memória principal precisam ocupar o lugar de dados já  presentes na cache provocando assim a evasão de dados menos recentes. A  forma (heurística) utilizada para selecionar o elemento a ser retirado é  conhecida como política de troca (replacement policy). Uma política de troca muito popular é a LRU (least recently used), que significa algo como “elemento menos usado recentemente”.
     Quando um dado é escrito no cache, ele deve ser gravado no local  de armazenamento em algum momento. O momento da escrita é controlado  pela política de escrita (write policy). Existem diferentes políticas. A  política de write-through (algo como “escrita através”) funciona da  seguinte forma: a cada vez que um elemento é colocado no cache, ele  também é gravado no local de armazenamento original. Alternativamente,  pode ser utilizada a política de write-back (escrever de volta), onde as  escritas não são directamente espelhadas no armazenamento. Ao invés, o  mecanismo de cache identifica quais de seus elementos foram sobrepostos  (marcados como sujos) e somente essas posições são colocadas de volta  nos locais de armazenamento quando o elemento for retirado do cache. Por  essa razão, quando ocorre um cache miss (falta de acesso ao cache pelo  fato de um elemento não existir nele) em um cache com a política  write-back, são necessários dois acessos à memória: um para recuperar o  dado necessário e outro para gravar o dado que foi modificado no cache.
     O mecanismo de write-back pode ser accionado por outras políticas  também. O cliente pode primeiro realizar diversas mudanças nos dados do  cache e depois solicitar ao cache para gravar os dados no dispositivo  de uma única vez.
     Os dados disponíveis nos locais de armazenamento original podem  ser modificados por outras entidades diferentes, além do próprio cache.  Nesse caso, a cópia existente no cache pode se tornar inválida. Da mesma  forma, quando um cliente atualiza os dados no cache, as cópias do dado  que estejam presentes em outros caches se tornarão inválidas. Protocolos  de comunicação entre gerentes de cache são responsáveis por manter os  dados consistentes e são conhecidos por protocolos de coerência.

Princípio da localidade de referência

     Podemos  definir resumidamente localidade de referência como o método em que os  dados são escritos/levados ate a memória cache consequentemente até a  CPU. Existem dois tipos de localidade de Referência:

 Localidade Temporal

     O  processador, ao longo de sua execução poderá requisitar uma informação  que não esteja na cache. Isso faz com que esta informação seja buscada  na memória Principal. Como a há uma grande probabilidade de essa  informação ser executada novamente em um tempo próximo, ela é guardada  (uma cópia) na memória cache. Desta maneira essa informação não  precisará mais ser buscada na MP por um tempo.

 Localidade Espacial

     Quando  uma informação é buscada na MP, a localidade temporal faz com que esta  informação seja copiada para a cache, porém, também haverá uma grande  possibilidade de suas informações vizinhas serem requisitadas em um  futuro próximo. Deste modo, junto com a informação requisitada, os  vizinhos também serão copiados para a cache. As duas localidades temporal e espacial ocorrem juntas quando a informação é requisitada da MP.

Organizações de Memória Cache

     Memórias cache são fisicamente organizadas através de linhas ou blocos de dados que podem ser organizados em conjuntos (sets). Essas formas de organização são descritas abaixo

 Mapeamento Direto

     No mapeamento direto, cada bloco da memória principal é mapeado para uma linha do cache, cada linha da cache possui 3 campos, índice (ou linha), tag e o endereço da palavra. O tag é usado para validar se a linha procurada é a mesma que esta na cache.
     O índice serve como um endereço da cache, apontado onde pode estar a linha procurada.
     O endereço da palavra são os bits menos significativos que identificam uma palavra dentro de um bloco da memória Principal.
     No início do mapeamento, cada bloco da memória principal tem sua  linha exclusiva mapeada na cache. Este mapeamento é facilmente  implementado. Tudo começa com o endereço da memória Principal. Através  deste endereço, para o acesso a cache, deve se identificar os três  campos citados acima.
     Para achar o End. da palavra, é necessário fazer uma simples  conta de logaritmo, tendo em base a quantidade de bytes por linha da  cache. LOG2 Nr bytes. Para achar o índice, deve levar em conta o número de linhas que possui a cache, fazendo o mesmo cálculo de logaritmo: LOG2 Nr Linhas O restante será designado a tag.
     Suponhamos, em um exemplo que o endereço da linha seja de 32 bits, e a cache possui 1024 linhas com 64 Bytes cada linha. Log2 64 = 6 bits para End.
Log2 1024 = 10 bits para índice. 32- (10+6)=16 bits para tag.
     Na operação de leitura, a CPU envia um endereço de 32 bits para o  circuito de controle da cache que já identifica os campos para começar a  pesquisa nas linhas. Inicialmente começando pelo índice, onde a busca  ocorre para tentar achar a linha desejada. Após, o próximo passo é  comparar os valores da tag do endereço com o valor da tag da linha. Se  forem iguais, em seguida, a palavra que esta na linha (6 últimos bits) é  transferida pra CPU. Caso os valores das tags não forem iguais, isso significa que a linha  desejada pela CPU não esta na cache, portanto é buscada na MP e  transferida para a mesma linha, substituindo-a.

Totalmente Associativa

     No  mapeamento direto, cada linha da memória principal tinha um lugar  exclusivo na memória cache. Já no mapeamento associativo não, aqui, cada  linha da MP pode ser carregada em qualquer lugar da cache.
     Neste modo haverá apenas dois campos. A tag e o end. da palavra.
     Estes dois campos têm as mesmas funções dos dois campos do  mapeamento direto. Porem o campo tag terá uma quantidade de bits maior.
     No mapeamento associativo, para verificar se a linha esta na  cache, é comparado a tag de cada linha na cache com a tag do endereço  apresentado pela CPU. Se achou, então os bytes da palavra são  transferidos para a CPU, caso contrario, busca-se o endereço na MP e  guarda na cache.

Associatividade por Conjunto (N-Way)

     Este  tipo de organização intercala as vantagens dos outros dois mapeamentos  citados acima, acabando com a comparação exaustiva dos campos tag  (causado no mapeamento totalmente associativo)e o problema de conflito  de endereços por uma mesma linha na cache (causado no mapeamento  direto). Neste caso, a cache nada mais é do que uma série de conjuntos,  constituídos por uma série de linhas em cada conjunto. A sigla N-Way  significa o tamanho dos conjuntos da cache, onde N é a quantidade de  palavras em um conjunto.
     Cada linha da memória principal pode ser armazenada em qualquer  linha de um conjunto específico. O conjunto é determinado pelo endereço,  que é dividido em 3 campos: TAG, Nr do conjunto e o End da palavra.  Dado um endereço a cache para leitura, ela separa os endereços nesses  três campos. O primeiro campo a ser analisado é o Nr do conjunto, que  define em qual conjunto a linha vai ser pesquisada. Apos, o campo TAG é  comparado com todas as linhas deste conjunto para achar a linha  desejada.

Algoritmos de substituição de dados

     Ai  podemos se perguntar. Mas e quando a cache encher? É aqui que entra o  papel dos algoritmos de substituição. Eles tem a função de definir quais  linhas com informações atualmente armazenadas vão ser retiradas para  dar lugar a uma novas linhas com informações.
     Alguns algoritmos são citados abaixo:
     Least Recently Used (LRU): Este algoritmo escolhe a linha que esta a mais tempo sem uso pela CPU e substitui pela nova linha.
     First Input, First Output (FIFO): FIFO se resume a  uma fila qualquer. Um exemplo prático seria uma fila de banco, o  primeiro a entrar será o primeiro a ser atendido. No caso da cache, a  linha que a mais tempos esta armazenada na cache sera substituída,  independentemente se a CPU estiver usando ou não.
     Least Frequently Used (LFU): O algoritmo escolhe a  linha de acordo com a sua referência, ou seja, a linha que tiver menos  acessos por parte da CPU vai ser a escolhida para substituição.

Modelos de cache

Estes modelos consideram uma hierarquia de memória que possua cache de dados L1 com mapeamento direto.

 Cache de Vítimas

     A cache vítima  ou CV é uma pequena cache, localizada entre a L1 e os níveis inferiores  da cache, usado para armazenar blocos/linhas que foram "expulsos" da  cache principal durante a substituição. O cache de vítima geralmente é  totalmente associativo e destina-se a reduzir o número de erros de  conflito. Na verdade, apenas uma pequena fração dos acessos memória do  programa exigem alta associatividade. O cache de vítima explora essa  propriedade fornecendo alta associatividade para apenas esses acessos. A  política de troca de blocos na CV é LRU. Foi introduzida por Norman Jouppi na década de 90.

 Stream Buffer

     Stream  Buffer (SB) é uma simples estrutura dentro da cache, que faz buscas  para a cache antecipadamente. Esta estrutura reduz o numero de faltas  compulsórias. Esta falta ocorre quando um bloco foi pela primeira vez  referenciado pela CPU. Isso porque quando ocorre esta falta, o SB pega o  endereço desta referência e busca os blocos subsequentes e armazena em  uma fila, enquanto a fila não encher, a busca continua.
     Em uma requisição da CPU, a referência requisitada é buscada  tanto na cache como na SB. Caso ocorra um acerto na fila da SB, o  bloco/linha é entregue pra CPU e armazenado na cache. Se ocorrer uma  falta na fila e na cache também, os blocos que estão na fila são  "expulsos" e o processo de busca retorna a partir do endereço da  referência que ocorreu a falta.

 Cache em níveis

     Com  a evolução na velocidade dos dispositivos, em particular nos  processadores, o cache foi dividido em níveis, já que a demanda de  velocidade a memória é tão grande que são necessários caches grandes com  velocidades altíssimas de transferência e baixas latências. Sendo muito  difícil e caro construir memórias caches com essas características,  elas são construídas em níveis que se diferem na relação tamanho X  desempenho.

 Cache L1

     Uma pequena porção de memória estática. Ela pode estar dentro do chip  da CPU ou fora dele, existe um ganho de velocidade mais desejável com a  cache dentro do chip, pois a comunicação ocorre melhor dentro do chip  do que entre chips, o que vem fazendo, atualmente, os chips conterem  essa pequena parte da cache (L1) dentro do chip. Mas não termina por aí,  para intercalar essas duas partes (dentro e fora), ela foi dividida em 2  níveis: a parte dentro do chip (L1) e a parte de fora do chip (L2).
     Em alguns tipos de processador, como o Pentium 2, o L1 é dividido  em dois níveis: dados e instruções (que "dizem" o que fazer com os  dados). O primeiro processador da Intel a ter o cache L1 foi o i486 com  8KB. Geralmente tem entre 16KB e 128KB; hoje já encontramos  processadores com até 16MB de cache.  

 Cache L2

     Possuindo o Cache L1 um tamanho reduzido e não apresentando uma  solução ideal, foi desenvolvido o cache L2, que contém muito mais  memória que o cache L1. Ela é mais um caminho para que a informação  requisitada não tenha que ser procurada na lenta memória principal.  Alguns processadores colocam esse cache fora do processador, por  questões econômicas, pois um cache grande implica num custo grande, mas  há exceções, como no Pentium II, por exemplo, cujas caches L1 e L2 estão  no mesmo cartucho que está o processador. A memória cache L2 é,  sobretudo, um dos elementos essenciais para um bom rendimento do  processador mesmo que tenha um clock baixo. Um exemplo prático é o caso  do Intel Itanium 9152M (para servidores) que tem apenas 1.6 GHz de clock  interno e ganha de longe do atual Intel Extreme, pelo fato de possuir  uma memória cache de 24MB. Quanto mais alto é o clock do processador,  mais este aquece e mais instável se torna. Os processadores Intel  Celeron tem um fraco desempenho por possuir menos memória cache L2. Um  Pentium M 730 de 1.6 GHz de clock interno, 533 MHz FSB e 2 MB de cache  L2, tem rendimento semelhante a um Intel Pentium 4 2.4 GHz, aquece muito  menos e torna-se muito mais estável e bem mais rentável do que o Intel  Celeron M 440 de 1.86 GHz de clock interno, 533 MHz FSB e 1 MB de cache  L2.

 Cache L3

     Terceiro nível de cache de memória. Inicialmente utilizado pelo AMD  K6-III (por apresentar o cache L2 integrado ao seu núcleo) utilizava o  cache externo presente na placa-mãe como uma memória de cache adicional.  Ainda é um tipo de cache raro devido à complexidade dos processadores  atuais, com suas áreas chegando a milhões de transístores por  micrómetros ou nanómetros de área. Ela será muito útil, é possível a  necessidade futura de níveis ainda mais elevados de cache, como L4 e  assim por diante.

Smart Cache
 
     Smart Cache é um método de cache de nível 2 ou nível 3 para núcleos de execução múltipla, desenvolvido pela Intel. O Smart Cache compartilha a memória cache real entre os núcleos de um processador multi-core.  Em comparação com um cache per-core dedicado, a taxa geral de falta de  cache diminui quando nem todos os núcleos precisam de partes iguais do  espaço do cache. Conseqüentemente, um único núcleo pode usar o cache de  nível 2 ou nível 3, se os outros núcleos estiverem inativos. Além disso, o cache compartilhado torna mais rápido a partilha de memória entre diferentes núcleos de execução.

Caches unificadas/Caches separadas

     Quando  o nível L1 da cache começou a aparecer dentro do chip da CPU, apenas  uma cache inteira era usada para armazenar dados e instruções, porem  tornou-se comum separar a cache em duas partes, 1 dedicada a armazenar  dados e a outra dedicada a instruções. Assim, quando o processador busca  um dado, ele busca na cache de dados, e quando busca uma instrução, ele  busca na cache de instrução.
     Ate um certo tamanho, a vantagem fica com a cache unificada, pois  a cache tende a equilibrar as buscas por instruções dados, ou seja, se o  processador tende a buscar mais instruções, a cache vai armazenar mais  instruções. A mesma coisa acontece se o processador busca mais dados.  Além disso, somente uma cache precisa ser projetada e implementada.
     Mas o futuro tende a continuar com a cache separada,  principalmente em computadores superescalares por ex. o PowerPC. Pois  esses processadores escalares, executam instruções paralelas e fazem a  pré-busca de instruções futuras previstas. Na cache separada o  processador busca antecipadamente as instruções e guarda em um buffer  com instruções a serem armazenadas. A cache separada ainda não precisa  de políticas de escrita, e tem barramentos independentes, onde cada  cache se liga ao CPU.

Caches inclusivos e exclusivos

     Caches  Multi-level introduzem novos aspectos na sua implementação. Por  exemplo, em alguns processadores, todos os dados no cache L1 devem  também estar em algum lugar no cache L2. Estes caches são estritamente  chamados de inclusivos. Outros processadores (como o AMD Athlon) têm  caches exclusivos — os dados podem estar no cache L1 ou L2, nunca em  ambos. Ainda outros processadores (como o Pentium II, III, e 4 de  Intel), não requerem que os dados no cache L1 residam também no cache  L2, embora possam frequentemente fazê-lo. Não há nenhum nome universal  aceitado para esta política intermediária, embora o termo inclusivo seja  usado.
     A vantagem de caches exclusivos é que são capazes de armazenarem  mais dados. Esta vantagem é maior quando o cache L1 exclusivo é de  tamanho próximo ao cache L2, e diminui se o cache L2 for muitas vezes  maior do que o cache L1. Quando o L1 falha e o L2 acerta acesso, a linha  correta do cache L2 é trocada com uma linha no L1. Esta troca é um  problema, uma vez que a quantidade de tempo para tal troca ser realizada  é relativamente alta.
     Uma das vantagens de caches estritamente inclusivos é que quando  os dispositivos externos ou outros processadores em um sistema  multiprocessado desejam remover uma linha do cache do processador,  necessitam somente mandar o processador verificar o cache L2. Nas  hierarquias de cache exclusiva, o cache L1 deve ser verificado também.
     Uma outra vantagem de caches inclusivos é que um cache maior pode  usar linhas maiores do cache, que reduz o tamanho das Tags do cache L2.  (Os caches exclusivos requerem ambos os caches teres linhas do mesmo  tamanho, de modo que as linhas do cache possam ser trocadas em uma falha  no L1 e um acerto no L2).
Técnicas de escrita de dados do cache

Política de escrita

     Quando  a CPU necessita fazer uma operação de escrita na memória, esta ocorre  diretamente na cache. Mas como a cache não é uma memória principal, em  algum momento a MP precisa ser atualizada, para manter a integridade.  Isso deve acontecer, pois quando uma linha vai ser substituída na cache,  antes de isso acontecer, é preciso verificar se essa linha não foi  alterada na cache e também não foi alterada na MP. Caso ela tenha sido  alterada em algum dos dois casos, isto significa que a linha da cache  esta diferente da linha da MP. Isto não pode acontecer, pois a MP  precisa estar tão mantida corretamente quanto a cache.
Hoje são encontradas algumas políticas de escritas que resolvem este problema, cada uma com suas vantagens e desvantagens.

 Write-Back Cache

     Usando  esta técnica a CPU escreve dados diretamente no cache, cabendo ao  sistema a escrita posterior da informação na memória principal. Como  resultado, o CPU fica livre mais rapidamente para executar outras  operações. Em contrapartida, a latência do controlador pode induzir  problemas de consistência de dados na memória principal, em sistemas  multiprocessados com memória compartilhada. Esses problemas são tratados  por protocolos de consistência do cache.
     Exemplo:
     A escrita de um endereço é feita inicialmente numa linha do  cache, e somente no cache. Quando mais tarde algum novo endereço  precisar desta linha do cache, estando esta já ocupada, então o endereço  inicial é guardado na memória e o novo endereço ocupa-lhe o lugar na  respectiva linha do cache.
     Para reduzir a frequência de escrita de blocos de endereços na memória aquando da substituição é usado um "dirty bit",  este é um bit de estado (atualização), ou seja, quando o endereço é  instanciado inicialmente numa linha do cache, estando essa linha vazia, o  valor inicial é implicitamente '0', quando o bloco do endereço é  modificado (quando ocorre uma substituição) o valor inicial passa a '1' e  diz-se que o bloco do endereço está "dirty".

Vantagens

  • a escrita ocorre à velocidade do cache;
  • escritas múltiplas de um endereço requerem apenas uma escrita na memória;
  • consome menos largura de banda.

Desvantagens

  • difícil de implementar;
  • nem sempre existe consistência entre os dados existentes no cache e na memória;
  • leituras de blocos de endereços no cache podem resultar em escritas de blocos de endereços "dirty" na memória.

 Write-Through Cache

     É  a técnica mais simples usada. As operações de escrita são feitas tanto  na memória Principal como na cache, garantindo que a memória principal  esteja sempre valida. Este tipo de política providencia pior desempenho  do que Write-Back Cache, pois ela gera um grande trafego na memória  principal, podendo formar gargalos, mas é mais simples de implementar e  tem a vantagem da consistência interna, porque o cache nunca está  dessincronizada com a memória como acontece com a técnica Write-Back  Cache.

Vantagens

  • fácil de implementar;
  • um "cache-miss" nunca resulta em escritas na memória;
  • a memória tem sempre a informação mais recente.

Desvantagens

  • a escrita é lenta;
  • cada escrita necessita de um acesso à memória;
  • consequentemente usa mais largura de banda da memória;
  • alto uso do barramento da memória.

Técnicas de "Write Miss"

 Write Allocate

     O  bloco de endereço é carregado na ocorrência seguindo-se uma acção de  "write hit". O "Write Allocate" é usado com frequência em caches de  "Write Back".

 No Write Allocate

     O  bloco de endereço é diretamente modificado na memória, não é carregado  no cache. O "No Write Allocate" é usado frequentemente em caches de  "Write Through".
O que é Litografia?

     Bem, voltando ao assunto inicial, a litografia serve para o controle  de medida dos transistores, tudo bem, mas, porque a litografia sempre  vai diminuindo?
     Para que a capacidade do chip seja maior, é preciso que o número de  transistores seja cada vez maior em seu interior, e para isso, você  precisa diminuir cada vez mais o tamanho do circuito como um todo. Pois  como seria possível inserir milhares de transistores no núcleo de um  processador sem aumentar seu tamanho físico?
     É aí que entra a litografia, que é parte do processo de como esses  circuitos são construídos. Não é possível manusear transistores de  tamanho microscópico, e é por isso que eles são diretamente esculpidos  sobre o silício, esse processo de construção de um processador é algo  realmente complexo, pode levar muitos e muitos dias para ser concluído,  isso, sem falar nos projetos dos circuitos que já tem que estar prontos  muito antes de a construção do processador começar. Esse árduo trabalho  de projetar os circuitos é feito pelos engenheiros que definem em quais  áreas do chip as diferentes partes (cache, controlador de memória,  vídeo, entre outros) que o compõem devem ficar e como elas vão ser  interligadas. Tudo isso tem uma importância extrema, já que se existe  apenas um erro, pode deixar milhares de processadores inutilizáveis. Ao  final do projeto vem a parte da construção em si, a parte de esculpir os  transistores no silício, mas o fato é, como fazer com que o projeto  feito em tamanho grande possa ser impresso microscopicamente no wafer de  silício? A litografia também está aqui. Antes do início da construção, o  silício é coberto com um material fotorresistente e em seguida é  aplicada luz ultravioleta para realizar a transferência do diagrama de  circuitos para a superfície do disco. Nesse momento a luz passa por uma  matriz do circuito construído em tamanho grande, e logo após, por uma  lente que estará reduzindo essa matriz até que ela seja pequena o  suficiente para ser escrita no disco, centenas de vezes, uma ao lado da  outra.
     Depois de todo esse processo, as partes que foram expostas a luz, se  tornam solúveis. Após o processo um banho de produtos químicos remove  essas partes, e também o líquido fotorresistente, e desse modo, o  circuito pode ser visto na superfície do wafer de silício.
     Vale lembrar que o silício é semicondutor, então, é preciso revestir  toda sua superfície com uma camada de proteção, que vai evitar os curtos  circuitos quando o cobre for aplicado. Logo após, é feito o processo de  galvanoplastia, no qual os íons de cobre são transferidos para o wafer  de silício. O excesso de cobre é removido e os contatos dos transistores  e demais componentes do chip são expostos. Nessa fase o processador já  está quase pronto e parte para a fase de testes.
     O disco, finalmente, é cortado e todos os núcleos recém criados são  preparados para o encapsulamento final, onde são conectados aos  terminais definitivos que os ajudará a proteger e, também, dissipar o  calor gerado pela CPU.
     Então, a litografia nada mais é que a redução de tamanho dos  transistores e o circuito dentro dos processadores. Apenas para uma  ideia, se o tamanho dos transistores continuassem os mesmos, um core i7  novo seria 450 vezes maior que o primeiro Pentium, algo impensável para  um computador doméstico. Outra vantagem também é a redução do consumo de  energia e da geração de calor, então, sempre quando ver o termo  “litografia XX nm”, lembre-se que trata do processo de construção e  tamanho dos transistores de um processador. Abaixo há alguns exemplos de  litografia de alguns processadores:

Intel Pentium 60MHz (1993) — 3,1 milhões de transistores — 800nm
Intel Core i7-4790k 4.0GHz (2014) — 1,4 bilhão de transistores — 22nm
AMD Ryzen 7 1800X (2017) — 4,8 bilhões de transistores — 14nm
AMD Ryzen 7 3800X (2019) 19 bilhões de transistores — 7nm


Estamos Chegando no Fim da Lei de Moore?

     Se 4 ou 5 anos já pode ser considerado um tempo enorme quando falamos  de tecnologia, o fato de que a Lei de Moore tenha funcionado por mais  de 50 anos chega a ser surpreendente. Não se trata de uma Lei,  propriamente, mas sim uma espécie de guia (“profecia auto-realizável”  seria um termo mais correto) seguido pelos principais fabricantes de  semicondutores na hora de projetar seus chips, e tem funcionado muito  bem até hoje. Já exploramos o que é a Lei de Moore em um artigo dedicado  ao tema, já que ela praticamente moldou a forma como nossos  computadores, tablets e até mesmo smartphones funcionam.

 
O que é a Lei de Moore?

     Mas  parece que essa Lei está chegando ao fim; e por vários motivos, o que  acabará resultando em um foco maior em eficiência energética em vez de  poder de processamento, além de uma mudança na relação entre software e  hardware como conhecemos hoje. Vamos entender melhor isso nas próximas  linhas.
Limites físicos e econômicos
     Resumidamente, a  Lei de Moore diz que a capacidade de transistores dos processadores  dobra a cada 18 meses. Geralmente, mais transistores significa mais  desempenho e, até um certo momento, menos calor dissipado. É uma forma  bem reducionista de explicá-la, mas nos serve como um bom ponto de  partida. Porém, essa miniaturização de transistores já demonstra sinais  de estar chegando ao fim, já que o silício, principal componente, começa  a perder suas propriedades físicas. Mais do que isso, reduzir  progressivamente a litografia está se mostrando exponencialmente mais  caro. E complicado.
     Participe do nosso Grupo de Cupons e Descontos no Whatsapp e garanta sempre o menor preço em suas compras de produtos de tecnologia. Na  data de publicação deste artigo, a geração Skylake de processadores  Intel é a família mais recente, representando o que há de melhor e mais  moderno na indústria. São construídos em um processo de fabricação de 14  nanômetros, assim como a geração imediatamente anterior (Broadwell) e  trazem embarcado as principais tecnologias da empresa, como o SpeedStep.  Para chegar até aqui, a Intel  enfrentou algumas dificuldades, como a necessidade de adotar  “transistores 3D” e diversos atrasos para anunciar o Broadwell,  mostrando que a redução de 22 nanômetros para 14 nanômetros foi mais  difícil do que a empresa previu inicialmente.


Oque é Instruções e Extenções?



Streaming SIMD Extensions

      SSE (Streaming SIMD Extensions, inicialmente chamado ISSE, de Internet Streaming SIMD Extensions) é um conjunto de instruções do tipo SIMD projetado pela Intel. O nome completo significa "Extensões SIMD para streaming". O SSE traz 70 novas instruções em relação ao conjunto de instruções anterior, do Pentium MMX.
     O SSE foi primeiro conhecido como KNI, de Katmai New Instructions, onde  Katmai  era o apelido do primeiro Pentium III com núcleo revisto. Durante o  projeto Katmai a Intel procurava distingui-lo da sua linha anterior de  produtos, particularmente do projeto Pentium II.  
     O SSE foi uma resposta à tecnologia 3DNow! da AMD,  lançada um ano antes. Mas a AMD rapidamente contra-atacou, aproveitando  do projeto da Intel e adicionou suporte às instruções SSE, começando  assim a era do famoso processador Athlon XP.
     A Intel ficou desapontada com o MMX, sua primeira iniciativa de desenvolvimento SIMD para IA-32. O MMX tinha dois grandes problemas: ele reusava registradores de ponto flutuante, o que fazia com que a CPU  ficasse impossibilitada de trabalhar simultaneamente com instruções de  ponto flutuante e SIMD. Por isso, o paralelismo só era conseguido com  instruções de aritmética com inteiros.  
     O SSE adiciona oito novos registradores 128-bits, conhecidos como XMM0 até XMM7. Cada registro pode armazenar quatro   números 32-bit de ponto flutuante ao mesmo tempo (single-precision). As extensões de 64 bits, tanto na Intel quanto da AMD, acrescentam mais 8 registros XMM8 até XMM15. Além deles foi também adicionado um novo registrador, de controle e de status, chamado MXCSR.
     Como esses novos registradores de 128 bits são estados de programa adicionais que o sistema operacional  (SO) deve preservar entre mudanças de contexto de tarefas, eles devem  permanecer desabilitados até que o sistema operacional os habilite  explicitamente. Isto significa que o SO deve saber como usar as  instruções FXSAVE e FXRSTR, que são o par de instruções estendidas que  podem, respectivamente, salvar e restaurar todos os estados dos  registradores x87 e SSE, de uma única vez. Este suporte foi rapidamente estendido para todos os principais sistemas operacionais para IA-32.
     Como o SSE inclui suporte a ponto flutuante, ele tem mais usos do que o MMX, pois atualmemente as  placas de vídeo  podem tratar internamente todos os cálculos com inteiros. As operações  SIMD inteiras ainda podem ser realizadas com 8 registradores de 64 bits  do MMX. Como se sabe, os registradores MMX são obtidos renomeando-se (ou  aliasing) os 8 registradores da FPU. Posteriormente, no SSE2,  a Intel complementou o SSE com suporte a cálculos inteiros. Apesar de  redundantes, as operações MMX podem ser executadas com as operações SSE,  o que oferece maior desempenho em situações limitadas.
     O primeiro CPU a ter suporte ao SSE foi o Pentium III, que compartilhava recursos entre o SSE e o FPU.  As aplicações eram compiladas de forma a utilizar instruções FPU e SSE em paralelo, mas os processadores   Pentium III não eram capazes de operar estes dois tipos de instruções  simultaneamente (num mesmo ciclo).  Estas limitações reduziram a  eficiência do chamado pipelining, embora os registros isolados XMM permitiam instruções SIMD e operações escalares de ponto flutuante serem misturadas mas não tão eficientes quanto o modo MMX/floating point.

Versões posteriores

  • SSE2 foi introduzida com os processadores Pentium 4, e trouxeram melhorias significativas ao SSE (que alguns programadores passaram a chamar de "SSE1").  SSE2 adds new math instructions for double-precision  (64-bit) floating point and 8/16/32-bit integer data types, all  operating on the same 128-bit XMM vector register-file previously  introduced with SSE.  SSE2 enables the programmer to perform SIMD math  of virtually any type (from 8-bit integer to 64-bit float) entirely with  the XMM vector-register file, without the need to touch the (legacy)  MMX/FPU registers.  Many programmers consider SSE2 to be "everything SSE  should have been", as SSE2 offers an orthogonal set of instructions for  dealing with common datatypes.
  • SSE3 chamado de Prescott New Instructions, é um upgrade incremental ao SSE2, adicionando instruções matemáticas orientadas à DSP (DSP-oriented) e algumas instruções de manipulação de processos (thread).
  • SSSE3 é um upgrade ao SSE3, adicionando 16 novos códigos (opcode).
  • SSE4 é uma melhoria do padrão antecessor e adiciona um ponto de instrução do produto, diversas instruções adicionais (do tipo integer), uma instrução do tipo popcnt, entre outras.


Intel Advanced Vector Extensions (AVX)

     O Advanced Vector Extension (AVX), também conhecido como Sandy Bridge New Extensions, são extensões da arquitetura do conjunto de instruções x86 para microprocessadores da Intel e da AMD, propostas pela Intel em março de 2008 e primeiramente suportada pela Intel com o processador Sandy Bridge[2] no início de 2011, e mais tarde então pela AMD, com o processador Bulldozer, lançado no final do mesmo ano. O AVX fornece novos recursos, instruções e um novo esquema de codificação.
     O AVX2 expande a maioria dos comandos inteiros para 256 bits  e apresenta operações de multiplicação acumulada fundidas (FMA). O  AVX-512 expande o AVX para o suporte de 512 bits usando uma nova  codificação de prefixo EVEX, proposta pela Intel em julho de 2013 e suportada pela primeira vez por ela, com o processador Knights Landing, lançado em 2016.

Índice

  • 1 AVX
    • 1.1 Características
    • 1.2 Novas Instruções
    • 1.3 CPUs com AVX
    • 1.4 Suporte ao sistema operacional
  • 2 AVX2
    • 2.1 Características
    • 2.2 Novas Instruções
    • 2.3 CPUs com AVX2
  • 3 AVX-512
    • 3.1 CPUs com AVX-512
  • 4 Aplicações
    • 4.1 Softwares
  • 5 Referências
 

AVX

 Características

     O AVX utiliza dezesseis registradores YMM. Cada registrador YMM contém:

  • Oito números de ponto flutuante de precisão única de 32 bits ou
  • Quatro números de ponto flutuante de precisão dupla de 64 bits.

     A largura do arquivo de registro SIMD  é aumentada de 128 bits para 256 bits e renomeada de XMM0 – XMM7 para  YMM0 – YMM7 (no modo x86-64, YMM0 – YMM15). Em processadores com o  suporte a AVX, as instruções SSE (anteriormente operavam em  registradores XMM de 128 bits) podem ser estendidas usando o prefixo VEX  para operar nos 128 bits mais baixos dos registradores YMM.
 
     Os registros YMM comparados aos registros XMM.
     Ele introduz um formato de instrução SIMD de três operandos, em que o  registrador de destino é distinto dos dois operandos de origem. Por  exemplo, uma instrução SSE usando a forma convencional de dois operandos  a = a + b agora pode usar uma forma não destrutiva de três operandos c =  a + b, preservando ambos os operandos fonte. O formato de três  operandos do AVX é limitado às instruções com operandos SIMD (YMM) e não  inclui instruções com registradores de propósito geral (por exemplo,  EAX) (esse suporte aparecerá pela primeira vez no AVX2).  O novo esquema de codificação VEX introduz um novo conjunto de prefixos  de código que estende o espaço do opcode, permitindo que as instruções  tenham mais de dois operandos e que os registradores vetoriais SIMD  sejam maiores que 128 bits. O prefixo VEX também pode ser usado nas  instruções herdadas do SSE, dando-lhes um formato de três operandos, e  fazendo com que eles interajam mais eficientemente com as instruções do  AVX, sem a necessidade de VZEROUPPER e ZEROALL.
     As instruções do AVX suportam o SIMD de 128 bits e 256 bits. As  versões de 128 bits podem ser úteis para melhorar o código antigo sem a  necessidade de ampliar a vetorização, evitando assim a penalidade de ir  do SSE para o AVX. Elas são mais rápidas em algumas implementações  iniciais do AMD do AVX (este modo é conhecido como AVX-128).

Novas Instruções

     Estas instruções são adicionais às que são extensões de 256 bits das instruções SSE de 128 bits e a maioria é utilizável em operandos de 128 e 256 bits.

Instrução
Descrição
VBROADCASTSS, VBROADCASTSD, VBROADCASTF128
Copia um operando de memória de 32 bits, 64 bits ou 128 bits para todos os elementos de um registrador vetorial XMM ou YMM.
VINSERTF128
Substitui a metade inferior ou a metade superior de um registrador YMM de 256 bits pelo valor de um operando de origem de 128 bits. A outra metade do destino não é alterada.
VEXTRACTF128
Extrai a metade inferior ou a metade superior de um registrador YMM de 256 bits e copia o valor para um operando de destino de 128 bits.
VMASKMOVPS, VMASKMOVPD
Lê qualquer número de elementos de um operando de memória vetorial SIMD em um registrador de destino, deixando os elementos vetoriais restantes não lidos e definindo os elementos correspondentes no registrador de destino para zero. Grava qualquer número de elementos de um operando de registrador vetorial SIMD em um operando de memória de vetores, deixando os demais elementos do operando de memória inalterados.
VPERMILPS, VPERMILPD
Embaralha os elementos vetoriais de 32 bits ou 64 bits de um operando de entrada. Estas são instruções de 256 bits em pista, o que significa que elas operam em todos os 256 bits com dois shuffles de 128 bits separados, de modo que não podem ser reproduzidos aleatoriamente nas pistas de 128 bits.
VPERM2F128
Embaralha os quatro elementos de vetor de 128 bits de dois operandos de fonte de 256 bits em um operando de destino de 256 bits, com uma constante imediata como seletor
VZEROALL
Define todos os registradores YMM para zero e marca-os como não utilizados. Usado ao alternar entre o uso de 128 bits e o uso de 256 bits.
VZEROUPPER
Ajusta a metade superior de todos os registradores YMM para zero. Utilizado ao alternar entre o uso de 128 bits e o uso de 256 bits.

CPUs com AVX

Intel:
  • Processador Sandy Bridge (2011)
  • Processador Sandy Bridge E (2011)
  • Processador Ivy Bridge (2012)
  • Processador Ivy Bridge E (2013)
  • Processador Haswell (2013)
  • Processador Haswell E (2014)
  • Processador Broadwell (2014)
  • Processador Broadwell E (2016)
  • Processador Skylake (2015)
  • Processador Kaby Lake (ULV mobile - 2016) (desktop/mobile - 2017)
  • Processador Skylake-X (2017)
  • Processador Coffee Lake (2017)
  • Processador do Cannon Lake (microarquitetura), esperado para 2018
  • Processador Cascade Lake, esperado em 2018
  • Processador Ice Lake, esperado em 2018

     Nem todas as CPUs das famílias listadas acima suportam o AVX. Geralmente, CPUs com a denominação "Core i3/i5/i7" as suportam, já as CPUs "Pentium" e "Celeron" não.

AMD:

  • Processadores baseados em Jaguar e mais recentes
  • Processadores baseados em Puma e mais recentes
  • Processadores "Equipamentos Pesados"
    • Processadores baseados em Bulldozer (2011)
    • Processadores baseados em Piledriver (2012)
    • Processadores baseados em Steamroller (2014)
    • Processadores baseados em Excavator e mais novos (2015)
  • Processadores baseados em Zen (2017)
  • Processadores baseados em Zen+ (2018)

Suporte ao sistema operacional

     O AVX adiciona um novo estado de registro através do arquivo de registro YMM de 256 bits, portanto, é necessário suporte explícito ao sistema operacional para salvar e restaurar adequadamente os registros expandidos do AVX entre os comutadores de contexto. As seguintes versões dos sistemas operacionais suportam o AVX:
  • Apple OS X: Suporte para AVX adicionado na atualização 10.6.8 (Snow Leopard), lançado em 23 de junho de 2011.
  • O DragonFly BSD adicionou suporte no início de 2013.
  • FreeBSD em um patch enviado em 21 de janeiro de 2012, incluído na versão 9.1.
  • Linux: suportado desde a versão do kernel 2.6.30, lançado em 9 de junho de 2009.
  • O OpenBSD adicionou suporte em 21 de março de 2015.
  • Solaris 10 Update 10 e Solaris 11.
  • Windows: suportado no Windows 7 SP1 e no Windows Server 2008 R2 SP1, Windows 8, Windows 10.

AVX2

 Características

     O Advanced Vector Extensions 2 (AVX2), também conhecido como Haswell New Instructions, é uma expansão do conjunto de instruções AVX introduzido na microarquitetura Haswell da Intel. O AVX2 faz as seguintes adições:
  • Expansão da maioria das instruções SSE e AVX inteiras de vetores para 256 bits.
  • Manipulação de bits de uso geral de três operandos e multiplicação.
  • Reúne o suporte, permitindo que elementos vetoriais sejam carregados de locais  de memória não contíguos.
  • DWORD- e QWORD-
  • Troca de vetores.
  • Suporte de multiplexação acumulada de três operandos (FMA3).

Novas Instruções

Instrução
Descrição
VBROADCASTSS, VBROADCASTSD
Copia um operando de registrador de 32 bits ou 64 bits para todos os elementos de um registrador vetorial XMM ou YMM. Estas são versões de registradores das mesmas instruções no AVX1. No entanto, não existe uma versão de 128 bits, mas o mesmo efeito pode ser alcançado simplesmente usando o VINSERTF128.
VPBROADCASTB, VPBROADCASTW, VPBROADCASTD, VPBROADCASTQ
Copia um registrador inteiro de 8, 16, 32 ou 64 bits ou um operando de memória para todos os elementos de um registrador vetorial XMM ou YMM.
VBROADCASTI128
Copia um operando de memória de 128 bits para todos os elementos de um registrador vetorial YMM.
VINSERTI128
Substitui a metade inferior ou a metade superior de um registrador YMM de 256 bits pelo valor de um operando de origem de 128 bits. A outra metade do destino não é alterada.
VEXTRACTI128
Extrai a metade inferior ou a metade superior de um registro YMM de 256 bits e copia o valor para um operando de destino de 128 bits.
VGATHERDPD, VGATHERQPD, VGATHERDPS, VGATHERQPS
Reúne valores de ponto flutuante de precisão simples ou dupla usando índices e escala de 32 ou 64 bits.
VPGATHERDD, VPGATHERDQ, VPGATHERQD, VPGATHERQQ
Reúne valores inteiros de 32 ou 64 bits usando índices e escala de 32 ou 64 bits.
VPMASKMOVD, VPMASKMOVQ
Lê qualquer número de elementos de um operando de memória vetorial SIMD em um registrador de destino, deixando os elementos vetoriais restantes não lidos e definindo os elementos correspondentes no registrador de destino para zero. Grava qualquer número de elementos de um operando de registrador vetorial SIMD em um operando de memória de vetores, deixando os demais elementos do operando de memória inalterados.
VPERMPS, VPERMD
Embaralha os oito elementos vetoriais de 32 bits de um operando fonte de 256 bits em um operando de destino de 256 bits, com um registrador ou operando memória como seletor.
VPERMPD, VPERMQ
Embaralha os quatro elementos de vetor de 64 bits de um operando de fonte de 256 bits em um operando de destino de 256 bits, com um operando de registro ou memória como seletor.
VPERM2I128
Embaralha os quatro elementos de vetor de 128 bits de dois operandos de fonte de 256 bits em um operando de destino de 256 bits, com uma constante imediata como seletor.
VPBLENDD
Versão imediata da palavra dupla das instruções PBLEND do SSE4.
VPSLLVD, VPSLLVQ
Troca lógica. Permite deslocamentos variáveis em que cada elemento é deslocado de acordo com a entrada compactada.
VPSRLVD, VPSRLVQ
Troca lógica. Permite deslocamentos variáveis em que cada elemento é deslocado de acordo com a entrada compactada.
VPSRAVD
Troca lógica aritmética. Permite deslocamentos variáveis em que cada elemento é deslocado de acordo com a entrada compactada.

CPUs com AVX2

Intel:
  • Processador Haswell (2013)
  • Processador Haswell E (2014)
  • Processador Broadwell (2014)
  • Processador Broadwell E (2016)
  • Processador Skylake (2015)
  • Processador Kaby Lake, (ULV mobile - 2016) (desktop/mobile - 2017)
  • Processador Skylake-X (2017)
  • Processador Coffee Lake (2017)
  • Processador Cannon Lake, esperado em 2018
  • Processador Cascade Lake, esperado em 2018
  • Processador Ice Lake, esperado em 2018
AMD:
  • Processador Excavator e mais novos (2015)
  • Processador Zen (2017)

AVX-512

     O AVX-512 são extensões de 512 bits para as instruções SIMD de extensões de vetor avançadas de 256 bits para a arquitetura de conjunto de instruções x86 propostas pela Intel em julho de 2013 e programadas para serem suportadas em 2015 com o processador Knights Landing da Intel.
     A instrução AVX-512 é codificada com o novo prefixo EVEX. Ele permite 4 operandos, 7 novos registros opmask de 64 bits, modo de memória escalar com transmissão automática, controle de arredondamento explícito e modo de endereçamento de memória de deslocamento comprimido. A largura do arquivo de registro é aumentada para 512 bits e a contagem total de registros aumentada para 32 (registra ZMM0-ZMM31) no modo x86-64.

CPUs com AVX-512

  • Processadores Knights Landing (2016)
  • Processadores Knights Mill (2017)
  • Processadores Skylake-SP, Skylake-X (2017)
  • Processadores Cannon Lake (2018)
  • Processadores Ice Lake (2019)

Aplicações

     O AVX é adequado para cálculos de ponto flutuante intensivo em aplicações multimídia, científicas e financeiras (o AVX2 adiciona suporte para operações inteiras).
     Aumenta o paralelismo e o rendimento em cálculos SIMD de ponto flutuante, reduz a carga do registrador devido às instruções não destrutivas e melhora o desempenho do software Linux RAID (AVX2).

Softwares

  • Blender - usa o AVX2 nos ciclos do mecanismo de renderização.
  • OpenSSL - usa funções criptográficas otimizadas para AVX e AVX2 desde a versão 1.0.2.
  • Prime95 / MPrime, software usado para o GIMPS - começou a usar as instruções AVX desde a versão 27.x.
  • O dnetc, o software usado pela distributed.net, tem um núcleo AVX2 disponível para seu projeto RC5 e lançará em breve um para seu projeto OGR-28.
  • Einstein @ Home - usa o AVX em alguns de seus aplicativos distribuídos que buscam ondas gravitacionais.
  • RPCS3, emulador de código aberto para o PlayStation 3 - usa as instruções AVX2 e AVX-512 para emular jogos PS3.
  • Network Device Interface, um protocolo de vídeo / áudio IP desenvolvido pela NewTek para produção de transmissão ao vivo - usa AVX e AVX2 para aumentar o desempenho.

3DNow!

     3DNow! é uma extensão multimídia criada pela AMD para seus processadores, que teve início com o K6-2 em 1998.  Em termos mais técnicos, é um acréscimo de instruções SIMD ao tradicional conjunto de instruções x86, com o objetivo de melhor atender aos requisitos de processamento vetorial de muitas aplicações predominantemente gráficas. Foi originalmente desenvolvido como um aperfeiçoamento do conjunto de instruções MMX, de modo a estender sua capacidade limitada a números inteiros também para ponto flutuante. Posteriormente, a Intel incorporaria instruções similares (porém incompatíveis) ao Pentium III, chamadas de SSE.
     A AMD aperfeiçoou o conjunto de instruções ao longo do tempo. A primeira melhoria foi chamada simplesmente de Enhanced 3DNow! (3DNow! Aperfeiçoado), algumas vezes Extended 3DNow! (3DNow! Estendido), introduzida com os Athlons de primeira geração, que acrescentou cerca de 19 novas instruções, a maioria das quais para lidar com previsão de instrução, etc. Um fato pouco conhecido é que essas novas adições continham uma implementação parcial do SSE1. A segunda melhoria foi chamada de 3DNow! Profissional, que foi introduzida com os processadores Athlon XP;  essa versão  basicamente integrava por completo a tecnologia SSE1 da Intel, combinando-a com a sua própria 3DNow!
     Uma vantagem da 3DNow! é poder somar ou mutiplicar os dois números que estão armazenados no mesmo registro. Com a SSE, cada número só pode ser combinado com um número na mesma posição em outro registro. Essa habilidade, denominada horizontal pela Intel, é o principal acréscimo ao recém-lançado conjunto de instruções SSE3.
     Uma desvantagem da 3DNow! relativamente à SSE é que ela somente armazena dois números num registro, diferentemente dos quatro na SSE. Entretanto, as intruções 3DNow! podem ser geralmente executadas em menos tempo que as instruções SSE.
     3DNow! também compartilha os mesmos registros físicos do MMX, enquanto que o SSE tem seus próprios registros independentes. Como esses registros MMX e 3DNow! são também utilizados pelo padrão x87 FPU, as instruções 3DNow! e x87 não podem ser utilizadas simultaneamente. Todavia, por estarem referenciados ao FPU x87, os estados dos registros da 3DNow! e MMX  podem ser salvos e restaurados pelas tradicionais instruções x87 FNSAVE e FRSTR. O uso das tradicionais instruções x87 significou que não foram necessárias quaisquer modificações no sistema operacional para dar suporte ao 3DNow!
     Em contraste, para salvar e restaurar o estado dos registros SSE, foi necessário o uso das recém-introduzidas instruções FXSAVE e FXRSTR; as instruções FX* são uma atualização das instruções Salva e Restaura do antigo x87, porque estas poderiam salvar não apenas os estados do registro SSE, como também os estados do registro x87 (o que significa, portanto, que poderiam salvar também registros MMX e 3DNow!).
     O uso das instruções FX* exigiram que o processador entrasse numa versão ligeiramente modificada do modo Protegido, chamada modo Aperfeiçoado ("Enhanced mode"); a única diferença entre esses dois modos foi que este último permitiu o uso de SSE (e, portanto, das instruções FX*) e aquele desabilitou seu uso. Sistemas operacionais que dão suporte à SSE entrariam no modo Aperfeiçoado, enquanto que aqueles desconhecedores de sua existência entrariam somente no tradicional modo Protegido.


MMX

     MMX é uma tecnologia lançada como marca registrada pela Intel para os seus processadores Pentium MMX em 1997.
     Esta tecnologia oferece um modelo de execução SIMD simples, capaz de efectuar processamentos de dados inteiros, empacotados em registros de 64 bits. Para isso, foram criados 8 novos registros de 64 bits, mapeados sobre os registros de 80 bits já existentes na unidade de ponto flutuante.
     As 47 novas instruções MMX permitem o tratamento em paralelo de diversos itens de dados do tipo inteiro de 8, 16 ou 32 bits, empacotados em grupos de 8, 4 ou 2 elementos. Para além desta possibilidade de processamento em paralelo, a tecnologia MMX disponibiliza funcionalidades orientadas para o processamento de dados multimédia, como por exemplo a aritmética com saturação.

Instruções MMX

     As 47 novas instruções MMX podem ser agrupadas em:

  • instruções aritméticas
  • instruções de comparação
  • instruções de conversão
  • instruções lógicas
  • instruções de deslocamento
  • instruções de transferência de dados
  • instrução de inicialização (EMMS)

     Todas as mnemónicas de instruções MMX (excepto a instrução EMMS) começam pela letra P que indica processamento de dados empacotados. Seguem-se caracteres que identificam a operação, o tipo de saturação e o tipo de dados utilizado, como se indica na figura seguinte.

O que é FSB?

     FSB é a sigla para Front Side Bus, que significa barramento frontal, o responsável pela comunicação e transferência de dados entre a CPU e a North Bridge da placa-mãe. Refere-se basicamente ao caminho de comunicação do processador com o chipset da placa-mãe, sendo que geralmente é utilizado quando existe menção ao clock externo do processador.
     Este barramento, juntamente com a memória cache, pode ser acessado de maneira muito mais rápida do que a RAM do sistema. Sendo assim, a largura de banda, ou o throughput teórico máximo do barramento frontal, é especificado pelo produto da largura da vida de dados, além da frequência de clock e a quantidade de transferências de dados realizadas por ciclo de clock.
     É a frequência do clock FSB que irá determinar como será o desempenho da placa-mãe e do processador de uma máquina. Isso, consequentemente, define se o desempenho de todo o computador será bom ou se apresentará problemas. O motivo disso é que o processamento precisa passar por várias etapas.
     Participe do nosso Grupo de Cupons e Descontos no Whatsapp e garanta sempre o menor preço em suas compras de produtos de tecnologia.
     A quantidade de transferências realizadas por ciclo de clock é determinada pela tecnologia utilizada. Na GTL+, por exemplo, é possível notar uma transferência/ciclo, enquanto que na EV6 é possível duas transferências/ciclo e a AGTL+ tem capacidade de realizar quatro transferências/ciclo. Esta última é denominada pela Intel de Quad Pumping.
     Muitos fabricantes atualmente não anunciam a capacidade do FSB em megahertz (MHz) na frequência do clock, mas sim em megatransfers por segundo (na sigla MT/s). O motivo disso é que a frequência real é especificada pela quantidade de transferências que podem ser feitas em cada ciclo de clock.
     O ajuste da frequência do FSB é associado diretamente a frequência de funcionamento da memória utilizada em um sistema. Por meio do barramento de memoria, a RAM é conectada a North Bridge, assim como o barramento frontal conecta a CPU e o North Bridge. Visto que frequentemente ambos trabalham na mesma frequência, o aumento da frequência do barramento frontal significa, na maioria dos casos, um aumento de frequência da memória. Levando isso em consideração, é importante notar que qualquer megahert acrescido no FSB terá um valor muito alto para o processador e a memória RAM.
     Nos sistemas atuais é possível verificar a memória em 4:5 e em proporções idênticas. Isso significa que a memória irá funcionar 4 ou 5 vezes mais veloz do que o FSB. Um barramento de 133 MHz, por exemplo, pode operar a memória em 166 MHz, fazendo parte de um processo denominado de sistema "assíncrono".
     Configurar o Front Side Bus em níveis elevados demais pode significar uma ameaça para o seu processador, pois a placa-mãe é quem controla o FSB e ela possui um valor máximo estimado em 10% do que o FSB suporta.


O que é Hyper-threading ou SMT?



       O multithreading simultâneo ( SMT ) é uma técnica para melhorar a eficiência geral de CPUs superescalares com multithreading de hardware .  O SMT permite vários encadeamentos independentes de execução para melhor utilizar os recursos fornecidos pelas arquiteturas de processador modernas.
     O nome multithreading é ambíguo, porque não apenas múltiplos threads podem ser executados simultaneamente em um núcleo de CPU, mas também múltiplas tarefas (com diferentes tabelas de páginas , diferentes segmentos de estados de tarefas , diferentes anéis de proteção , diferentes permissões de E / S , etc.).  Embora rodando no mesmo núcleo, eles estão completamente separados um do outro.  O multithreading é similar em conceito à multitarefa preemptiva, mas é implementado no nível de thread de execução em processadores superescalares modernos.
     O multithread simultâneo (SMT) é uma das duas principais implementações de multithreading, a outra forma sendo multithreading temporal (também conhecida como super-threading).  Em multithreading temporal, apenas um thread de instruções pode ser executado em qualquer estágio de pipeline de cada vez.  Em multithreading simultâneo, instruções de mais de um thread podem ser executadas em qualquer estágio de pipeline de cada vez. Isso é feito sem grandes alterações na arquitetura básica do processador: as principais adições necessárias são a capacidade de buscar instruções de vários threads em um ciclo e um arquivo de registro maior para armazenar dados de vários threads.  O número de threads simultâneos pode ser decidido pelos projetistas de chips. Dois encadeamentos simultâneos por núcleo de CPU são comuns, mas alguns processadores suportam até oito encadeamentos simultâneos por núcleo.
Porque é realmente uma técnica de eficiência que inevitavelmente aumenta o conflito em recursos compartilhados, medir ou concordar com sua eficácia pode ser difícil. No entanto, a eficiência energética medida do SMT com cargas de trabalho paralelas nativas e gerenciadas em implementações históricas de 130 nm a 32 nm Intel SMT ( hyper-threading ) descobriu que em implementações de 45 nm e 32 nm, o SMT é extremamente eficiente em energia, mesmo com processadores Atom inorder. Em sistemas modernos, o SMT explora de forma eficaz a simultaneidade com muito pouco poder dinâmico adicional.  Ou seja, mesmo quando os ganhos de desempenho são mínimos, a economia no consumo de energia pode ser considerável.
     Alguns pesquisadores mostraram que os encadeamentos extras podem ser usados ​​para propagar de forma proativa um recurso compartilhado como um cache, para melhorar o desempenho de outro encadeamento único, e afirmar que isso mostra que o SMT não apenas aumenta a eficiência.  Outros usam o SMT para fornecer computação redundante, para algum nível de detecção e recuperação de erros.
     No entanto, na maioria dos casos atuais, o SMT envolve ocultar a latência de memória, aumentar a eficiência e aumentar o rendimento de cálculos por quantidade de hardware usado.

 Taxonomia  

     No design do processador, há duas maneiras de aumentar o paralelismo no chip com menos requisitos de recursos: um é a técnica superescalar que tenta explorar o paralelismo no nível de instrução (ILP);  o outro é a abordagem multithreading que explora o TLP (thread level parallelism).
     Superscalar significa executar várias instruções ao mesmo tempo, enquanto o TLP (Thread-Level Parallelism) executa instruções de vários threads dentro de um chip ao mesmo tempo.  Há muitas maneiras de suportar mais de um thread dentro de um chip, a saber:

  •  Multithreading Interleaved: problema intercalado de várias instruções de threads diferentes, também conhecido como multithreading temporal . Ele pode ser dividido em multithreading refinado ou multithreading de granulação grossa, dependendo da freqüência de problemas intercalados.  Multithreading refinado - como em um processador barril - fornece instruções para threads diferentes após cada ciclo, enquanto o multithreading de granulação grosseira só alterna para emitir instruções de outro thread quando o thread em execução atual causa alguns eventos de latência longos (como falha de página etc. ).  Multithreading de grão grosso é mais comum para menos alternância de contexto entre threads.  Por exemplo, o processador Montecito da Intel usa multithreading de granulação grossa, enquanto o UltraSPARC T1 da Sun usa multithreading refinado. Para os processadores que têm apenas um pipeline por núcleo, o multithreading intercalado é a única maneira possível, pois pode emitir no máximo uma instrução por ciclo.
  •  Multithreading simultâneo (SMT): Emita várias instruções de vários segmentos em um ciclo.  O processador deve ser superescalar para fazer isso.
  •  Multiprocessamento no nível de chip (CMP ou multicore ): integra dois ou mais processadores em um único chip, cada um executando threads de forma independente.
  •  Qualquer combinação de multithread / SMT / CMP.

     O fator-chave para distingui-las é observar quantas instruções o processador pode emitir em um ciclo e quantos encadeamentos de onde vêm as instruções. Por exemplo, o UltraSPARC T1 da Sun Microsystems (conhecido como "Niagara" até sua versão de 14 de novembro de 2005) é um processador multicore combinado com multithreading fino em vez de multithreading simultâneo porque cada núcleo só pode emitir uma instrução por vez.

 Implementações históricas

     Embora as CPUs com multithreads existam desde os anos 50, o multithreading simultâneo foi pesquisado pela IBM em 1968 como parte do projeto ACS-360. O primeiro grande microprocessador comercial desenvolvido com SMT foi o Alpha 21464 (EV8).  Este microprocessador foi desenvolvido pela DEC em coordenação com Dean Tullsen, da Universidade da Califórnia, em San Diego, e Susan Eggers e Henry Levy, da Universidade de Washington.  O microprocessador nunca foi lançado, uma vez que a linha Alpha de microprocessadores foi descontinuada pouco antes de a HP adquirir a Compaq, que por sua vez adquiriu a DEC . O trabalho de Dean Tullsen também foi usado para desenvolver as versões Hyper-threading (Hyper-threading technology ou HTT) dos microprocessadores Intel Pentium 4, como o "Northwood" e o "Prescott".

 Implementações comerciais modernas

     O Intel Pentium 4 foi o primeiro processador de desktop moderno a implementar multithreading simultâneo, a partir do modelo 3.06 GHz lançado em 2002, e desde então introduzido em vários de seus processadores.  A Intel chama a funcionalidade Hyper-threading e fornece um mecanismo SMT básico de dois segmentos.  A Intel alega até 30% de melhoria de velocidade em comparação com um Pentium 4 não SMT idêntico. A melhoria de desempenho observada é muito dependente da aplicação; no entanto, ao executar dois programas que exigem atenção total do processador, pode parecer que um ou ambos os programas diminuem um pouco quando o Hyper-threading está ativado. Isso se deve ao sistema de reprodução do Pentium 4 que prendia valiosos recursos de execução, aumentando a contenção de recursos como largura de banda, caches, TLBs , entradas de buffers de reordenação , equalização dos recursos do processador entre os dois programas, o que adiciona uma variação. quantidade de tempo de execução.  O núcleo do Pentium 4 Prescott ganhou uma fila de replay, o que reduz o tempo de execução necessário para o sistema de replay.  Isso é suficiente para superar completamente o impacto no desempenho.
     Os mais recentes projetos de arquitetura MIPS da Imagination Technologies incluem um sistema SMT conhecido como "MIPS MT". O MIPS MT fornece elementos de processamento virtuais pesados ​​e microtemas de hardware mais leves.  A RMI , uma startup baseada em Cupertino, é o primeiro fornecedor de MIPS a fornecer um SOC de processador baseado em oito núcleos, cada um dos quais executa quatro threads.  Os encadeamentos podem ser executados no modo granular fino, onde um encadeamento diferente pode ser executado em cada ciclo.  Os segmentos também podem receber prioridades.  As CPUs MIPS da Imagination Technologies possuem dois threads SMT por núcleo.
     O Blue Gene / Q da IBM tem SMT de 4 vias.
     O IBM POWER5 , anunciado em maio de 2004, vem como um módulo dual-chip (DCM) de dois núcleos ou MCM (quad-core ou oct-core multi-chip module), com cada núcleo incluindo um mecanismo SMT de dois segmentos. A implementação da IBM é mais sofisticada do que as anteriores, porque pode atribuir uma prioridade diferente aos vários encadeamentos, é mais refinada e o mecanismo SMT pode ser ativado e desativado dinamicamente, para melhor executar essas cargas de trabalho onde um processador SMT não aumenta o desempenho.  Esta é a segunda implementação da IBM de multithreading de hardware geralmente disponível. Em 2010, a IBM lançou sistemas baseados no processador POWER7 com oito núcleos, cada um com quatro Threads Inteligentes Simultâneos. Isso alterna o modo de encadeamento entre um encadeamento, dois encadeamentos ou quatro encadeamentos, dependendo do número de encadeamentos do processo que estão sendo agendados no momento.  Isso otimiza o uso do núcleo para tempo de resposta mínimo ou throughput máximo.  O IBM POWER8 possui 8 encadeamentos simultâneos inteligentes por núcleo (SMT8).
     O IBM z13 possui dois encadeamentos por núcleo (SMT-2).
     Embora muitas pessoas tenham informado que o UltraSPARC T1 da Sun Microsystems (conhecido como "Niagara" até 14 de novembro de 2005) e o agora extinto processador " Rock " (originalmente anunciado em 2005, mas após muitos atrasos cancelados em 2009) são implementações do SPARC focado quase inteiramente na exploração de técnicas SMT e CMP, o Niagara não está realmente usando o SMT.  A Sun se refere a essas abordagens combinadas como "CMT" e o conceito geral como "Throughput Computing".  O Niagara tem oito núcleos, mas cada núcleo tem apenas um pipeline, então, na verdade, ele usa multithreading refinado. Ao contrário do SMT, onde as instruções de vários threads compartilham a janela do problema a cada ciclo, o processador usa uma política de round robin para emitir instruções a partir do próximo thread ativo em cada ciclo.  Isso faz com que seja mais semelhante a um processador barril.  O processador Rock da Sun Microsystems é diferente, tem núcleos mais complexos que possuem mais de um pipeline.
     O Oracle Corporation Sparc T3 possui oito threads finos por núcleo, o Sparc T4, o Sparc T5, o Sparc M5, o M6 e o ​​M7 possuem oito threads finos por núcleo, dos quais dois podem ser executados simultaneamente.
     O Fujitsu Sparc64 VI possui Sparc VII vertical multirrescrito de granulação grossa e o mais novo possui SMT bidirecional.
     O Intel Itanium Montecito usou multithreading de granulação grossa e Tukwila e mais recentes usam o 2-way SMT (com multithreading de domínio dual).
     O Intel Xeon Phi possui um SMT de 4 vias (com multiplexação multiplexada no tempo) com encadeamentos baseados em hardware que não podem ser desativados, ao contrário do Hyperthreading normal. O Intel Atom , lançado em 2008, é o primeiro produto da Intel a apresentar o SMT bidirecional (comercializado como Hyper-Threading) sem suportar reordenamento de instruções, execução especulativa ou renomeação de registradores.  A Intel reintroduziu o Hyper-Threading com a microarquitetura Nehalem , após sua ausência na microarquitetura Core.
     A microarquitetura AMD Bulldozer FlexFPU e o cache compartilhado L2 são multithreaded, mas os núcleos inteiros no módulo são de thread único, portanto, é apenas uma implementação parcial do SMT.
     A microarquitetura AMD Zen possui 2 vias SMT.
     A arquitetura VISC usa a Virtual Software Layer (camada de tradução) para enviar um único encadeamento de instruções para o Global Front End, que divide instruções em encadeamentos de hardware virtual que são então despachados para separar núcleos virtuais.  Esses núcleos virtuais podem, então, enviá-los para os recursos disponíveis em qualquer um dos núcleos físicos. Diversos núcleos virtuais podem enviar encadeamentos para o buffer de reordenamento de um único núcleo físico, que pode dividir instruções e dados parciais de vários encadeamentos por meio das portas de execução ao mesmo tempo.  Cada núcleo virtual acompanha a posição da saída relativa. Essa forma de multithreading pode aumentar o desempenho de thread único, permitindo que um único thread use todos os recursos da CPU. A alocação de recursos é dinâmica em um nível de latência de ciclo quase único (1-4 ciclos dependendo da mudança na alocação dependendo das necessidades individuais da aplicação. Portanto, se dois núcleos virtuais estiverem competindo por recursos, existem algoritmos apropriados para determinar quais recursos devem ser alocados onde.

 Desvantagens  

     Dependendo do design e da arquitetura do processador, o multithread simultâneo pode diminuir o desempenho se qualquer um dos recursos compartilhados forem gargalos de desempenho. Os críticos argumentam que é um fardo considerável colocar os desenvolvedores de software para testar se o multithreading simultâneo é bom ou ruim para sua aplicação em várias situações e inserir uma lógica extra para desligá-lo se ele diminuir o desempenho.  Os sistemas operacionais atuais não possuem chamadas API convenientes para essa finalidade e para impedir que processos com prioridades diferentes obtenham recursos uns dos outros.
     Há também uma preocupação de segurança com certas implementações simultâneas de multithreading.  O hyperthreading da Intel em processadores baseados em NetBurst tem uma vulnerabilidade através da qual é possível que um aplicativo roube uma chave criptográfica de outro aplicativo em execução no mesmo processador, monitorando seu uso de cache. Há também sofisticadas explorações de aprendizado de máquina para implementação de HT que foram explicadas no Black Hat 2018.


Voltar para o conteúdo