Loading presentation...

Present Remotely

Send the link below via email or IM

Copy

Present to your audience

Start remote presentation

  • Invited audience members will follow you as you navigate and present
  • People invited to a presentation do not need a Prezi account
  • This link expires 10 minutes after you close the presentation
  • A maximum of 30 users can follow your presentation
  • Learn more about this feature in our knowledge base article

Do you really want to delete this prezi?

Neither you, nor the coeditors you shared it with will be able to recover it again.

DeleteCancel

Make your likes visible on Facebook?

Connect your Facebook account to Prezi and let your likes appear on your timeline.
You can change this under Settings & Account at any time.

No, thanks

Organização e Arquitetura de Computadores (Unidade 04: O Processador)

Prof. Dr. Eng. Rafael Luiz Cancian - Organização e Arquitetura de Computadores (Unidade 04: O Processador) - Universidade Federal de Santa Catarina
by

Rafael Luiz Cancian

on 22 April 2013

Comments (0)

Please log in to add your comment.

Report abuse

Transcript of Organização e Arquitetura de Computadores (Unidade 04: O Processador)

Universidade Federal de Santa Catarina Organização e Arquitetura de Computadores Professor Dr. Eng. Rafael Luiz Cancian 4. O Processador (CPU) 4.1 - Introdução 4.2 - Funções Básicas email, msn: cancian@lisha.ufsc.br
web: www.inf.ufsc.br/~cancian 2013.1
v0.80 4.3 - Componentes Principais 4.4 - Classificação e Organização 4.5 - Mecanismos de Aceleração e Paralelismo Introdução Funções Básicas Componentes
Principais Classificação e
Organização Mecanismos de
Aceleração O Processador, ou Unidade Central de Processamento, é o componente de hardware do computador responsável pela execução de instruções de máquina. Um processador é, na verdade, um sistema digital programável, cujo bloco controle recebe comandos externos que deve obedecer, exatamente como uma máquina de Turing. O processaor é encapsulado 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 binárias de máquina armazenadas em sua memória, e fornece resultados como saída. O processador, escolhido entre as centenas de opções disponíveis no mercado, determina (em certa medida) a capacidade de processamento ou desempenho do computador e também o conjunto de instruções que ele compreende. Não se deve confundir processador com controlador, ou microprocessador com microcontrolador. Um microcontrolador (também denominado MCU) é um computador-num-chip, ou sistema-num-chip (SoC), contendo um processador, memória e periféricos de entrada/saída. O processador especifica em parte qual o desempenho do computador que o contém, de modo que microcomputadores possuem microprocessadores, computadores possuem processadores e supercomputadores possuem muitos processadores paralelos de alto desempenho. A Evolução dos computadores Atmel
Atmel AT91 series (Arquitetura ARM THUMB), AT90 series – AVR (Atmel Norway design),
ATMega series – AVR (Flash de MegaBytes ),
ATTiny series – AVR (Tamanho e Consumo Reduzido )
Freescale Semiconductor
8-bit
68HC05, 68HC08, 68HC11
16-bit
68HC12, 68HC16, Freescale DSP56800
32-bit
Freescale 683XX, MPC500, MPC 860, MPC 8240/8250, MPC 8540/8555/8560
Fujitsu
F²MC Family (8/16 bit), FR Family (32/64 bit)
Intel
8-bit
8XC42, MCS48, MCS51 (8051), 8xC251
16-bit
MCS96, MXS296
32-bit
i960
Microchip Technology
instruções de 14bits: PIC16F628, PIC16F84, PIC16F877
instruções de 16 bits: PIC18F452
NXP - Antiga Philips Semiconductors
LPC2000, LPC900, LPC700
NEC
78K
Parallax, Inc.
BASIC Stamp
STMicroelectronics
ST 62, ST 7
Texas Instruments
TMS370, MSP430
ZiLOG
Z80, Z86E02 Processadores variam conforme sua área de aplicação, operações realizadas, organização interna, frequência de operação, mecanismos de aceleração e outras características. A principal função de qualquer processador é a de executar instruções de máquinas. Porém, para executar instruções de máquina, é necessário buscá-las de algum endereço da memória principal, decodificá-las e então executá-las. A sequência básica de funcionamento da CPU corresponde a esse ciclo básico de "Busca, Decodificação e Execução", que é denominado ciclo de máquina. Mais especificamente, é necessário (1) buscar a instrução a partir de um endereço e copiá-la num registrador da CPU, (2) incrementar o endereço da próxima instrução, (3) decodificar a instrução, (4) buscar os operandos necessários à execução do comando especificado na instrução, (5) executar a instrução, (6) salvar os resultados da instrução no operando correto, (7) verificar se há requisições para atender e então (8) voltar ao passo 1. Um registrador é um conjunto de n elementos básicos de memória, cada um capaz de armazenar um único bit. Um registrador é o primeiro nível de memória disponível no processador. Entre as dezenas de registradores que existem numa CPU, destacam-se: IP (Instruction Pointer), IR (Instruction Register), RA (Return Address) e registradores de propósito geral. Além da execução de instruções, o processador também é responsável por atender interrupções e normalmente também é o árbitro do barramento. Para atender uma interrupção, o processador verifica se há uma requisição pendente de interrupção e, se houver, salva o endereço da próxima instrução (IP) em algum registrador e então coloca no registrador IP o endereço de memória onde começa a rotina de tratamento de interrupções (que pertence ao sistema operacional). Após o término do tratamento da interrupção, uma instrução de máquina especial restaura o valor de IP previamente salvo e o programa original continua a ser executado normalmente. O processador também precisa se comunicar com a memória e com outros dispositivos periféricos. Assim, ele precisa de sinais (pinos) de comunicação que transmitam dados, endereço e controle. O processador também é responsável (em parte) pela proteção e segurança do sistema. Para isso, os processadores possuem diferentes níveis de privilégio, ou modos de execução, para os programas. Pelo menos dois níveis/modos devem estar presentes: modo "sistema operacional" e modo "usuário". No modo "sistema operacional" é permitido executar todas as instruções de máquina reconhecidas pelo processador, incluindo instruções privilegiadas. No modo "usuário" o processador não permite a execução de instruções privilegiadas, e gera uma exceção de proteção quando isso ocorre. Mas o que há dentro do processador que o permite fazer udo isso Embora existem outros componentes, pode-se dizer que os dois principais de um processador são o bloco de controle e o bloco operativo. unidade de controle,
controle unidade de processamento,
caminho de dados O bloco de controle é responsável por decodificar instruções, analisar o status da execução das instruções e enviar sinais de controle para o bloco operativo. O bloco operativo é responsável por executar à risca os sinais de controle recebidos do bloco de controle e enviar sinais de status da execução de volta ao bloco de controle. Enquanto o bloco operativo costuma ser um circuito digital, o bloco de controle pode ser implementado como um circuito digital, ou como uma máquina de estados ou como uma ROM sequenciando um microprograma. Essas diferentes possíveis implementações têm forte impacto na arquitetura e desempenho do processador, que pode se tornar RISC ou CISC, monociclo, multiciclo ou com pipeline. O bloco operativo costuma conter ainda muitos componentes importantes, como os registradores da CPU, que especificam seu estado, e uma ou mais unidades de execução, responsáveis por executar a operação especificada numa instrução. Um dos elementos mais "famosos" da unidade de execução é a Unidade Lógica e Aritmética (ULA). O bloco operativo, e mais comumente as unidades de execução, são responsáveis por executar principalmente operações de transferência de dados, operações aritméticas inteiras e em ponto flutuante, operações lógicas e de deslocamento, e operações de desvio do fluxo de execução. Por questões de desempenho, os processadores também "encapsulam" outros componentes, dos quais destacam-se a Unidade de Gerenciamento de Memória e pelo menos o primeiro nível de memória cache. A MMU (Memory Management Unit) é responsável por fazer tradução de endereços, o que é indispensável para a relocação de código e para a memória virtual.
A memória cache, que existe em vários níveis, armazena pequenas quantidades de dados e instruções recentemente utilizados, para possam ser acessados mais rapidamente do que se fossem buscados na memória principal. Por fim, os processadores podem ainda ter muitos outros componentes que funcionam como mecanismos de aceleração, e os componentes já vistos podem variar tanto na estrutura interna quanto em sua quantidade, dependendo da classificação do processador e da arquitetura. Então, como os processadores
são classificados A proximidade com os limites da física tem levado os desenvolvedores de computadores a novos desafios e paradigmas. A impossibilidade tecnológica atual em aumentar a frequência de operação de sistemas síncronos, por exemplo, impulsionou o paralelismo e a exploração dos multi-cores, por exemplo. Processadores podem ser classificados sob diferentes critérios. A classficação mais comum foi feita por Michael J. Flynn há décadas e classifica "arquiteturas" conforme a quantidade de fluxos de instruções e fluxos de dados. Essa classificação é bem antiga e não muito adequada; e aquilo que ela chama de "arquitetura", podemos chamar de "organização interna do processador" ou "organização dos processadores no computador". Contudo, vamos conhecê-la... Organizações SISD (Single Instruction Stream Single Data Stream) correspondem a máquinas sequenciais, com um único processador, e são tipicamente conhecidas como arquiteturas de Von Neumann. Organizações SISD tipicamente buscam uma instrução e executam uma instrução por vez (Single Instruction Stream), e cada instrução opera sobre um ou dois dados --escalares-- (Single Data Stream). Apesar de serem tipicamente seriais, vários mecanismos de aceleração podem ser incluídos, como buffers de pré-busca e pipelines para aumentar seu desempenho. Assim, instruções tipicamente executadas por uma máquina SISD correspondem a algo como "add r1, r2, r3" (em linguagem de montagem), que pode significar "r1 = r2+r3" numa linguagem de alto nível. Organizações SIMD (Single Instruction Stream Multiple Data Stream) são máquinas com um único processador que é capaz de executar a mesma instrução --operação-- (Single Instruction Stream) sobre um grande conjunto de dados --vetor ou matriz-- (Multiple Data Stream). Para executar um comando de alto nível como "for (int i=0; i<128; i++) var[i]=5", essas máquinas fariam algo do tipo (em linguagem de montagem):
add ri, 0, 0 # i=0
for: comp rs, i, 128 # i<128 ?
jmpeq rs, fim_for # se !(i<128) jump fim_for
add var[i], 0, 5 # var[i]=5
add ri, ri, 1 # i++
jump for # jump for:
fim_for: Para executar um comando de alto nível como "for (int i=0; i<128; i++) var[i]=5", essas máquinas fariam algo do tipo (em linguagem de montagem):
fetchmv var, 128
add var, 0, 5 Sua organização é muito boa para programas que operam sobre vetores ou matrizes, como é o caso de computação científica ou processamento de imagens ou vídeo, por exemplo. Essa organização teve seu auge na década de 1980 com os computadores Cray, mas hoje eles caíram em desuso (atualmente há apenas um SIMD no Top500) Os microcomputadores de hoje ainda são baseados nessa organização, mas incluem vários mecanismos de aceleração e incluem mais de um processador com acesso uniforme à memória. Organizações MIMD (Multiple Instruction Stream Single Data Stream) são máquinas com um único processador que é capaz de executar várias instruções diferentes --operações-- (Multiple Instruction Stream) sobre o mesmo dado (Single Data Stream). São máquinas que fariam algo do tipo (em linguagem de montagem):
add, sub, or, move r1, r2, r3 Ou seja, realizariam diferentes operações sobre os mesmos dados, o que é útil para... para... hãã... Organizações MIMD (Multiple Instruction Stream Multiple Data Stream) são máquinas com um mais de um processador (ou core) que é capaz de executar diferentes instruções --operações-- (Multiple Instruction Stream) sobre diferentes conjuntos de dados (Multiple Data Stream). Entre os MIMD, os diferentes tipos de multiprocessadores e os diferentes tipos de multicore são todos caracterizados por terem memória compartilhada, e são também chamados de fortemente acoplados. O fato de terem (ou não) memória compartilhada tem forte impacto na forma de programação das máquinas com essas organizações. Os computadores pessoais atuais são todos exemplos de organizações desse tipo. Cabe lembrar que os MIMD multicores dos PCs são compostos por processadores (cores) homogêneos com organização SISD. Podemos ter multiprocessadores de multicores com cores SIMD, por exemplo. Máquinas com essa organização são capazes de executar instruções do tipo: Processador 1
add ri, 0, 0 # i=0
for: comp rs, i, 128 # i<128 ?
jmpeq rs, fim_for # se !(i<128) jump fim_for
add var[i], 0, 5 # var[i]=5
add ri, ri, 1 # i++
jump for # jump for:
fim_for: Processador 2
add rj, 0, 0
add var[j], rj, 1
while: comp rs, j, 256
jmpeq rs, fim_for
mult var[j], rj, 10
add rj, rj, 1
jump for
fim_while: thread 1 thread 2 No caso dos multiprocessadores, podemos classifcá-los quanto à forma de acesso à memória (ou memórias), já que é comum termos diferentes níveis de memória (local e global), e também quanto ao acesso aos dispositivos periféricos. Numa organização MIMD multiprocessador UMA (Uniform Memory Access), a memória física é uniformemente compartilhada entre os processadores. Todos os processadores têm tempo de acesso igual a todos os endereços de memória, o que é chamado de acesso uniforme à memória. Cada processador pode usar uma cache privada. Periféricos são compartilhados do mesmo modo. A maioria dos fabricantes têm extensões multiprocessadas dos seus produtos uniprocessados. O modelo UMA é adequado para computação de propósito geral e aplicações de tempo compartilhado por múltiplos usuários. Em multiprocessadores fortemente acoplados, para coordenar o paralelismo, sincronização e comunicação entre processadores, usa-se variáveis compartilhadas na memória principal. Quando todos os processadores têm acesso igual a todos os dispositivos periféricos, o sistema também é chamado de multiprocessador simétrico (symmetric multiprocessor -- SMP). Nesse caso, todos os processadores são igualmente capazes de executar qualquer programa, como o sistema operacional e rotinas de E/S. A principal distinção entre multiprocessadores UMA refere-se à forma de interconexão entre os elementos processadores (Processor Elements -- PE) e os elementos de memória (Memory Elements -- ME). As opções mais comuns são o barramento (Bus) e o barramento cruzado (Crossbar), embora as redes comutadas (Switched Network) estejam ganhando muito espaço. O barramento é a rede de interconexão mais simples que pode existir; é barata e simples; porém, permite que apenas um processador use o barramento por vez. Assim, é viável apenas quando a quantidade de processadores é pequena. O barramento cruzado (crossbar) é uma rede de interconexão mais elaborada, no qual a interconexão de cada barramento pode ser configurada para "fechar" ou abrir", permitindo até n conexões simultâneas entre processadores e memórias. A principal característica de uma organização NUMA (Non-Uniform Memory Access) é o acesso não uniforme à memória, ou seja, embora todos os processadores possam acessar todas as posições de memória, os tempos de acesso variam de acordo com o endereço acessado. O acesso a uma posição de memória local (memória no mesmo nó do processador que está realizando o acesso) é mais rápido do que o acesso a uma posição de uma memória remota. Assim, o sistema operacional de uma máquina NUMA deveria, sempre que possível, escalonar as threads de um processo entre os processadores do nó da memória usada pelo processo. Qualquer sistema multiprocessador (ou multicore) precisa implementar coerência de cache (Cache Coherence -- CC), ou então não usar caches (No Cache -- NC). Existem vários protocolos para realizar a coerência de cache, mas não abordaremos esse assunto em mais profundidade. Entre os MIMD, os diferentes tipos de multicomputadores, ou clusters, são todos caracterizados por terem memória distribuída (e não compartilhada), e são também chamados de fracamente acoplados. Em multicomputadores fracamente acoplados, para coordenar o paralelismo, sincronização e comunicação entre processadores, usa-se troca de mensagens pela rede de interconexão, já que não existe memória compartilhada para poder compartilhar variáveis. Basicamente, são um agrupamento (cluster) de computadores interconectados através de uma alguma rede de alto desempenho e que "trabalham juntos", como se fossem uma única máquina com maior capacidade de processamento. São bastante usados como servidores de alto desempenho e disponibilidade, pois costumam apresentar maior robustez, disponibilidade e escalabilidade que multiprocessadores. Pode-se agrupar diferentes computadores ou estações de trabalho (Cluster of Workstatios -- COW) e obter uma máquina de maior capacidade de processamento, ou mesmo agrupar muitos milhares de processadores, e criar uma única máquina massivamente paralela (Massively Parallel Processor --MPP), que é normalmente chamada de supercomputador. A classificação, ou taxonomia de Flynn fornece uma boa base para classificarmos organizações de computadores, e é importante. Contudo, há muitas variações, pequenos elementos e mecanismos de aceleração, fontes, níveis e formas de paralelismo que precisam ser entendidos separadamente. Então, quais são os mecanismos
de aceleração e de aumento do paralelismo existentes nos processadores de hoje? Computadores modernos teriam um desempenho dezenas de vezes pior se não incluíssem mecanismos de aceleração de desempenho para tirar proveito de determinadas características dos programas e aumentar o paralelismo em sua execução. Há várias fontes em que é possível explorar o paralelismo, e em diferentes níveis da execução de programas de computador. Pode-se explorar o paralelismo:
Em nível de execução de diferentes programas.
Em nível de fluxos de execução (threads) de instruções de um único programa;
Em nível de instruções de máquina (ILP) de um único programa; Granularidade mais fina Nos níveis mais altos o paralelismo é provido pelo software (aplicação, sistema operacional, compilador), enquanto nos níveis mais baixos o paralelismo pode ser provido pelo próprio processador. Para entendermos um pouco melhor como as arquiteturas modernas funcionam, vamos começar compreendendo alguns mecanismos utilizados pelo software, incluindo aplicação, sistema operacional e compiladores. Um computador moderno pode ter vários programas armazenados na memória ao mesmo tempo (multiprogramação). Esses programas podem utilizar a troca de contexto e também o compartilhamento de tempo (time sharing) providos pelo sistema operacional para aparentar a execução paralela num único processador. Troca de contexto é a capacidade de salvar o contexto ou estado de execução de um programa (tudo o que ele precisa para continuar sua execução), possivelmente colocar outro programa para executar, e então restaurar o contexto (estado de execução) desse programa, que continua exatamente de onde tinha parado. O compartilhamento de tempo nada mais é do que a troca rápida de contexto. A cada alguns milissegundos ocorre uma interrupção periódica do timer e o sistema operacional é invocado. Num escalonador com compartilhamento de tempo, uma nova thread é escalonada após algumas interrupções do timer, dando a impressão que todas executam em paralelo. Essa forma de paralelismo provido pelo sistema operacional permite que diferentes programas possam compartilhar o tempo do processador e também usá-lo quando outro programa não o está usando, e sem que o programador precise fazer qualquer coisa. Os programas armazenanos na memória podem estar relacionados ou não, mas se esperarmos que um deles execute completamente até o fim para iniciarmos a execução de outro, o desempenho será muito ruim e o processador ficará ocioso boa parte do tempo. O programador de aplicações também pode criar fluxos de execução (threads) explicitamente em seus programas, paralelizando sua execução, usando os mecanismos existentes nas linguagens de programação para paralelismo (ex: fork, thread), sincronização (ex: semáforos) e comunicação (ex: send, receive). Também existem alguns compiladores paralelizantes e meta-compiladores que são capazes de extrair parte do paralelismo diretamente a partir do código sequencial de um programa, facilitando o trabalho do programador. Assim, diferentes fluxos de execução do software podem ser provenientes de diferentes aplicações independentes, e de programas paralelos com mais de uma thread, criadas pelo programador ou pelo compilador. Todas são gerenciadas e escalonadas pelo sistema operacional em enviadas ao processador para serem executadas. O processador possui mecanismos de aceleração tanto em nível de instruções (ILP) quanto em nível de threads. O paralelismo em nível de instruções (ILP) permite executar várias instruções em cada ciclo de relógio, o que exige modificações na microarquitetura do processador para possibilitar a execução paralela de instruções. As principais alternativas no ILP incluem:
Paralelismo temporal: encadeamento no fluxo de execução das instruções (pipeline, buffer de pré-busca, escalonamento de instruções, execução especulativa).
Paralelismo na emissão de instruções: submissão de várias instruções para execução (VLIW e superescalaridade).
Paralelismo de dados: Permite executar várias instâncias da mesma instruções para um conjunto de dados (SIMD ou vetorial). Paralelismo em Nível de Instruções O mecanismo de pipeline (linha de montagem) divide o ciclo de máquina (a execução de uma instrução) em etapas distintas no tempo, cada uma realizada por um estágio do pipeline, de forma que todos os estágios podem trabalhar paralelamente na execução de diferentes instruções. Entretanto, o pipeline não é perfeito e nem sempre todos os estágios podem estar ocupados executando uma etapa da execução de uma instrução. Existem um conjunto de conflitos no pipeline que reduzem seu desempenho. Os principais conflitos do pipeline são:
Conflito de dados: quando um dado necessário para a execução de uma instrução ainda não está disponível.
Conflito estrutural: quando o mesmo recurso de hardware é necessário simultaneamente por mais de um estágio do pipeline
Conflito de controle: quando há mudanças no fluxo de controle que causam o desvio da execução de instuções. Muitos desenvolvimentos nos processadores correspondem exatamente a soluções para esses conflitos no pipeline, e que também são mecanismos de aceleração. Os principais incluem: Para evitar que o processador fique esperando cada instrução ser trazida da memória, várias instruções são buscadas antecipadamente da memória e mantidos num buffer de pré-busca (reorder buffer) no processador. Analisando um conjunto de "próximas instruções a executar", o processador pode escolher fazer uma reordenação do código, ou escalonamento dinâmico de instruções, executando as instruções numa ordem que mantenha a semântica do programa, mas também reduza os conflitos no pipeline. O processador também pode tentar predizer os desvios, "advinhando" se o desvio ocorrerá ou não, e assim já buscar a instrução correta e iniciar sua execução. Podemos ter previsão estática de desvio e também a predição dinâmica de desvio. Podemos ter o reordenamento estático de instruções, feito pelo compilador, mas também, e principalmente, o reordenamento dinâmico de instruções, feito pelo processador (em hardwares específicos, como o de Tomasulo). Alguns compiladores até enviam "juntas" todas as instruções que podem ser executas em paralelo, no que chamamos de máquinas com instruções muito longas (Very Large Instruction Words -- VLIW). Na predição estática, o processador sempre "chuta" no mesmo resultado (aquele que não exge esperas pelo pipeline). Na predição dinâmica, o processador "aprende" os últimos resultados e "chuta" no resultado mais provável. Boa parte dos mecanismos de aceleração para melhorar o desempenho do pipeline ficam escondidos na microarquitetura do processador e não são visíveis ao software, que é o caso do reordenamento dinâmico de instruções, previsão de salto e adiantamento (forwarding). Entretanto, técnicas como o uso de caches separadas (para conflito estrutural), salto retardado e desenrolamento de laço (loop unrolling) (para conflito de controle), e reordenamento estático de instruções (para conflito de dados) são todas visíveis ao software e implementadas em bons compiladores. Paralelismo em Nível de Thread Processadores também pode replicar alguns estágios do pipeline (ex: unidades de execução) ou replicar pipelines inteiros, permitindo a execução de manis de uma instrução no mesmo estágio ao mesmo tempo. Processadores com essa organização são chamados superescalares. Um computador pode ter mais de um programa em execução (processo), e cada processo pode ter várias threads. Num processador convencional, apenas uma thread é executada por vez. Cada vez que ocorre uma parada na execução de uma thread (ex: chamada de sistema), realiza-se uma troca de contexto para outra thread, mantendo o processador ocupado. Em processadores multithreading, mais de uma thread pode estar ativa ao mesmo tempo. Esses processadores possuem mais de um conjunto de registradores de estado. Quando ocorre uma parada numa thread, outra é colocada em execução imediatamente (não é necessário fazer troca de contexto). Se uma thread não usar uma unidade de execução, outra pode usá-la. Um processador multithread não melhora o desempenho ou paralelismo de uma única thread, mas aumenta o desempenho geral do sistema (se houver mais de uma thread que precisa executar). A existência de vários conjuntos de registradores de estado é interpretada pelos sistemas operacionais como se houvesse mais de um processador onde os processos podem ser escalonados. Uma forma de haver vários conjuntos de registradores é a virtualização de processadores, ou Simultaneous Multithreading (SMT). Processadores com Simultaneous Multithreading permitem executar instruções de threads de vários processos simultaneamente sem a necessidade de troca de contexto. Outra possibilidade de um processador executar simulteamente mais de uma thread é ele possuir mais de um núcleo (core). A Intel implementa SMT em seus processadores com o nome comercial "Hyperthreading" (HT), permitindo 2 threads por core. Outros exemplos incluem o IBM Power 7, que permite 4 threads por core e o Sun UltraSparc T2, que permite 8 threads por core. O que recai no caso dos computadores MIMD, onde é "fácil" executar mais de uma thread simultaneamente, mas relembraremos os multicore e sua relação com SMT.
Intel Core I7 950 3.06GHz Quad Core
Intel Core i7-2600K
UltraSparc T2 Assim, para executarmos simultaneamente 4 threads num único processador (chip), temos algumas opções...
...mas não necessariamente com o mesmo desempenho. Atualmente os processadores possuem grande capacidade computacional, implementam muitas otimizações e mecanismos para execução paralela, são lindos e maravilhosos, MAS...
...os programas existentes não foram escritos para utilizar muitos desses recursos. Assim, o desempenho atual dos programas é razoavelmente menor do poderia ser se os programadores conhecessem a organização do processador e explorassem os recursos existentes. Muitos avanços estão acontecendo e irão continuar acontecendo, e é importante que os desenvolvedores de software saibam que conhecer o hardware e tirar proveito dele é sua responsabilidade também. Revisão do Conteúdo
Full transcript