Baixe o app para aproveitar ainda mais
Prévia do material em texto
Aula 4 - Classificação de Flynn e Modelos de Programação 1 Taxonomia de Flynn Em 1966, Michael J. Flynn propôs uma taxonomia: o primeiro esquema para classificar computadores em configurações de paralelismo crescente. O esquema consistia de quatro categorias baseadas em tipos diferentes de fluxos usados por processadores. Um processador aceita dois fluxos: um fluxo de instruções e um fluxo de dados. Veja, a seguir, uma tabela que apresenta a classificação de Flynn para os computadores: Trata-se da classificação do tipo mais simples: são os monoprocessadores tradicionais, nos quais um único processador busca uma instrução por vez e a executa sobre um único item de dado. Como exemplos dessa classificação, podemos citar a arquitetura sequencial e a máquina de Von-Neumann. Técnicas como a de pipeline, a da palavra de instrução muito longa - Very Long Instruction Word (VLIW) - e a do projeto superescalar podem introduzir paralelismo em computadores SISD. Além disso, a tecnologia Hyper-Threading da Intel introduz paralelismo, criando dois processadores virtuais por meio de um único processador físico, o que dá a um sistema operacional habilitado a multiprocessador a impressão de que esteja executando em dois processadores (um a um) com pouco menos da metade da velocidade do processador físico. Pipeline - Na técnica de pipeline, o caminho de execução de uma instrução é dividido em estágios discretos, o que permite que o processador processe várias instruções simultaneamente, contanto que, no máximo, uma instrução ocupe cada estágio durante um ciclo de relógio. As técnicas VLIW e superescalar emitem, simultaneamente, várias instruções independentes (de um fluxo de instruções), que executam em diferentes unidades de execução. A VLIW depende de um compilador para determinar quais instruções emitir a qualquer ciclo de relógio, enquanto um projeto superescalar requer que um processador tome essa decisão. 2. Esquemas de interconexão de processadores O esquema de interconexão de um sistema multiprocessador descreve de que modo os componentes do sistema (como, por exemplo, um processador e módulos de memória) são conectados fisicamente. O esquema de interconexão é uma questão fundamental para projetistas de multiprocessadores, porque afeta o desempenho, a confiabilidade e o custo do sistema. Um sistema de interconexão consiste de nós e enlaces. Em muitos sistemas, um único nó pode conter um ou mais processadores, seus caches associados, um módulo de memória e uma chave. Em multiprocessadores de grande escala, às vezes, abstraímos o conceito de nó e indicamos um grupo de nós como um único supernó. Nós – os nós são compostos de componentes do sistema ou de chaves que fazem o roteamento das mensagens entre componentes. Enlaces – o enlace é uma conexão entre dois nós. Uma técnica para medir a tolerância à falha de um esquema de interconexão é contar o número de enlaces de comunicação que devem falhar antes que a rede não possa mais funcionar adequadamente. Isso pode ser quantificado por meio da largura de bisseção (número mínimo de enlaces que precisam ser cortados para dividir a rede em duas metades não conectadas). Sistemas que têm larguras de bisseção maiores são mais tolerantes à falha do que aqueles que têm larguras de bisseção menores, pois mais componentes têm de falhar antes que o sistema inteiro tenha problemas. O desempenho de um esquema de interconexão depende, em grande parte, da latência de comunicação entre nós, que pode ser medida de várias maneiras, como, por exemplo, por meio da latência média. Outra medição de desempenho é o diâmetro da rede (distância mais curta entre os dois nós mais remotos do esquema de interconexão). Para determiná-lo, você deve considerar todos os pares de nós da rede e identificar o caminho de comprimento mais curto para cada par - calculado pela soma do número de enlaces percorridos. Só então, você identificará o maior desses caminhos. Um diâmetro de rede pequeno indica baixa latência de comunicação e desempenho mais alto. Um diâmetro de rede pequeno indica baixa latência de comunicação e desempenho mais alto. 3 Arquiteturas de acesso à memória Veja, a seguir, uma figura que representa a classificação das arquiteturas segundo o acesso à memória: Acesso uniforme à memória - UMA Arquiteturas de multiprocessadores com acesso uniforme à memória - Uniform Memory Access multiprocessor (UMA) - requerem que todos os processadores compartilhem a memória principal do sistema. Arquitetura de memória de um monoprocessador, mas com vários processadores e módulos de memória. Acesso não uniforme à memória - NUMA Arquiteturas de multiprocessador de acesso não uniforme à memória - NonUniform Memory Áccess (NUMA) - mantêm uma memória global compartilhada, que pode ser acessada por todos os processadores. Sem acesso à memória remota - NORMA Multiprocessadores sem acesso à memória remota - No Remote Memory Access (NORMA) - são multiprocessadores fracamente acoplados que não fornecem nenhuma memória global compartilhada. Cada nó mantém sua própria memória local, e multiprocessadores NORMA implementam, frequentemente, uma memória virtual compartilhada comum – Shared Virtual Memory (SVM). NUMA com cache coerente (CC-NUMA) NUMAs com cache coerente - Cache Coherent NUMAs (CC-NUMAs) - são multiprocessadores NUMA que impõem coerência de cache. Em uma arquitetura CC-NUMA típica, cada endereço de memória física está associado a um nó nativo (muitas vezes, o nó nativo é simplesmente determinado pelos bits de ordem mais alta do endereço), responsável por armazenar o item de dado com aquele endereço de memória principal. Arquitetura de memória somente de cache - COMA Em um sistema NUMA, cada nó mantém sua própria memória local, cujo acesso pode ser feito por processadores de outros nós. Muitas vezes, o acesso à memória local é radicalmente mais rápido do que o acesso à memória global (ou seja, o acesso a outro nó da memória local). A latência de falta de cache (cache-miss tatency)(tempo requerido para recuperar dados que não estão no cache) pode ser significativa quando o dado requisitado não estiver presente na memória local. Um modo de reduzir a latência de falta de cache é reduzir o número de requisições de memória atendidas por nós remotos. Os multiprocessadores de arquitetura de memória somente de cache - Cache Only Memory Architecture (COMA) - usam uma ligeira variação da NUMA para abordar essa questão do posicionamento da memória. 4 Programação distribuída A programação distribuída pode ser: Sequencial – conjunto de instruções executadas sequencialmente. Concorrente – execução de tarefas dentro de um mesmo processo ou entre processos que compartilham recursos. Paralela – existência de mais de uma CPU, destinada à execução simultânea de tarefas de um mesmo processo. 5 Execução de uma tarefa Existem três maneiras de executar uma tarefa de forma mais rápida, quais sejam: Aumento da velocidade da CPU Algumas limitações estão associadas à aquisição de CPUs com maior poder de processamento, como o aumento de seu custo e a previsão para a velocidade dos processadores duplicarem a cada 18 meses (Lei de Moore), que tem sido mantida até os dias atuais. Mesmo com o aumento da frequência das CPUs, há a possibilidade de essas não atenderem à solução de alguns problemas. Otimização do Algoritmo Geralmente, conseguimos aumentar o desempenho de um sistema com a melhora do algoritmo. Entretanto, esse sistema pode ser comprometido quando não há uma solução determinística para o problema. Colaboração Quando pensamos em trabalhar com colaboração, devemos atentar para a diferença entre paralelismo e concorrência. Veja: • Paralelismo - Execução de uma tarefa em mais de uma CPU (os processadores colaboram para execução dessa tarefa); • Concorrência – Os processos disputamCPUs (uma ou mais). 6 Aspectos técnicos da programação distribuída Veja alguns aspectos técnicos da programação distribuída: Interação da aplicação e do usuário com o ambiente distribuído em níveis diferentes; Suporte a plataformas heterogêneas através de uma camada de software entre o kernel e a aplicação (middleware); Problemas como custo e carência de produtos de software adequados; Programação paralela, utilizando bibliotecas de troca de mensagem (como, por exemplo, o MPI e o PVM) ou bibliotecas baseadas em memória compartilhada (como, por exemplo, Pthreads). A troca de mensagens (message passing) é o método de comunicação baseada no envio e recebimento de mensagens através de uma rede de computadores, seguindo regras de protocolo de comunicação entre vários processadores que possuam memória própria. Os processos possuem acesso à memória local. As informações, por sua vez, são enviadas da memória local do processo à memória local do processo remoto. Nesse modelo, o programador é responsável pela sincronização de tarefas. CONCLUSÃO
Compartilhar