Baixe o app para aproveitar ainda mais
Esta é uma pré-visualização de arquivo. Entre para ver o arquivo original
Programação Paralela Distributed and Parallel Computing (DPC) Christian Rodrigues Moura Universidade Federal de Viçosa – Campus Rio Paranaíba Instituto de Ciências Exatas e Tecnológicas Rio Paranaíba – MG - Brasil christian.moura@ufv.br Jordi Henriques Marques da Silva Universidade Federal de Viçosa – Campus Rio Paranaíba Instituto de Ciências Exatas e Tecnológicas Rio Paranaíba – MG - Brasil jordi.silva@ufv.br Matheus Breguêz Rocha Vieira Universidade Federal de Viçosa – Campus Rio Paranaíba Instituto de Ciências Exatas e Tecnológicas Rio Paranaíba – MG - Brasil matheusrv@email.com I. RESUMO Este artigo tem o intuito de apresentar os conceitos de programação paralela, definições, técnica utilizada e as mais utilizadas arquiteturas até os dias atuais. Como forma de proporcionar um conhecimento suplementar, serão trabalhados os principais conceitos de arquitetura Superescalar, Multithreads, Multi Core e Many Core e como elas funcionam. II. INTRODUÇÃO AO TEMA O Processamento paralelo é apresentado como uma forma de otimizar a capacidade de execução das tarefas, que exigiam abundância de processamento. Um dos problemas dos anos de 50 até 60 era que para conseguir aumentar a velocidade de processamento das aplicações somente era possível fabricando novos processadores mais velozes, ou ter um maior número de processadores agrupados. Em meados dos anos 70 a tecnologia não era capaz de atender a crescente necessidade de capacidade de processamento, o que criou a necessidade de criar arquiteturas de processamento paralelo no qual se torna possível subdividir as aplicações em fragmentos no quais serão executados concorrentemente em cada processador do conjunto. Umas das áreas que se dedica a desenvolver tais melhorias é a High Performace Computing (HPC) no qual suas subáreas são, Linguagens de Programação, compiladores, teoria da computação e computabilidade, arquitetura de computadores, outra área externa que caminha junto a isso é a computação gráfica. No decorrer deste artigo iremos mostrar inúmeros tipos de arquiteturas, tais como: Superescalares, Paralelismo em microchips, Multithread, Multi core e Many core, suas métricas e como cada uma delas funciona. III. REVISÃO BIBLIOGRÁFICA DE TRABALHOS RELACIONADOS AO TEMA Organização organizar a interação entre cada computador é primordial. Visando poder usar o maior número possível de máquinas e tipos de computadores, o protocolo ou canal de comunicação não pode conter ou usar nenhuma informação que possa não ser entendida por certas máquinas. Cuidados especiais também devem ser tomados para que as mensagens sejam entregues corretamente e que as mensagens inválidas sejam rejeitadas, caso contrário, levaria o sistema a cair ou até o resto da rede. Como o aumento da velocidade dos processadores esbarrava no custo e no limite da capacidade tecnológica para obtenção de circuitos rápidos, a solução tendeu para o emprego de vários processadores trabalhando em conjunto na obtenção de uma maior capacidade de processamento. É quando surge o termo Processamento Paralelo para designar técnicas diferentes de concorrência que atendem a essas necessidades. [NAUVAX, Phillipe 2011] [2] Contextualizando o atual cenário da área, a corrida pelo aumento da frequência de clock e aprofundamento de técnicas de paralelismo no nível de instrução (ILP – Instruction Level Paralelism) [Smith and Sohi 1995] [1] nos microprocessadores comerciais (disputada pelos principais fabricantes nas décadas de 1980 e 1990) deu lugar à corrida pelo aumento do paralelismo no nível de threads, com a introdu- ção de uma quantidade elevada de núcleos de processamento em um mesmo circuito integrado [Olukotun et al. 1996] [3], nomeados chips multi-core. Neste sentido, existem diversas pesquisas sobre formas de comunicação entre os diversos núcleos, seja através de uma rede intra- chip [Bjerregaard and Mahadevan 2006] [4] [Freitas et al. 2007] [5] [De Micheli and Benini 2006] [6], ou por memória compartilhada, onde existem pesquisas sobre formas de melhor organizar as memórias cache desses núcleos de processamento [Alves et al. 2009] [7] [Marino 2006] [8], além de possíveis alterações arquiteturais, como no 347 caso das memórias cache de arquitetura não- uniforme (NUCA) [Bardine et al. 2008] [9] [Kim et al. 2002] [10] Com os avanços da ciência, o método científico (observação, teoria e experimentação) ganhou um importante aliado: a simulação numérica. Este por sua vez passou a ser definido como método científico moderno [Quinn 2003] [11]. Ainda segundo Quinn (2003) “a simulação numérica é uma importante ferramenta para os cientistas que às vezes não podem testar suas teorias, seja pelos custos e tempo que isto envolve, por questões éticas ou ainda quando é impossível realizá-las”. Simular eventos naturais como a previsão do tempo, dinâmica de fluídos, sequenciamento genético ou mesmo buscar novas drogas para a cura de doenças requerem modelos mais complexos e com grande poder computacional. Devido a magnitude de tais problemas, estes por sua vez são categorizados como os Grandes Desafios da Ciência [Quinn 2003] [11]. Há fascinantes aplicações e excelentes oportunidades onde a computação paralela pode representar ganhos de desempenho significativos. Pode-se relacionar inúmeros outros casos, porém os exemplos acima são suficientes e motivantes a investir tempo para conhecimento e aprimoramento do assunto. IV. DETALHAMENTO DO TEMA Para aprofundar sobre programação paralela, primeiro é necessário explicar sobre as diversas e mais usadas arquiteturas responsáveis. A forma como são disponibilizadas e utilizadas as estruturas e os componentes de um processador define o seu modelo de arquitetura. A. Arquiteturas Superescalares Rapidamente pode-se definir uma arquitetura superescalar como uma arquitetura que permite iniciar várias instruções ao mesmo tempo e que as mesmas possam ser executadas de forma independente. Esse tipo de arquitetura se difere da técnica pipeline, pois na pipeline é necessário executar as instruções em estágios diferentes (de forma sequencial). Entendendo a técnica Pipeline: Pipeline é uma técnica aplicada a processadores que divide a atividade em várias partes denominadas estágios. Com isso, varias instruções podem ser realizadas ao mesmo tempo, porém em estágios diferentes. Entretanto o pipeline não reduz o tempo de execução de uma tarefa, pois por ser de forma sequencial, um estágio de uma mesma tarefa só é executado assim que o estágio antecessor for concluído. Com tudo a arquitetura superescalar pode realizar a técnica de pipeline, aliás, várias pipelines. A partir de agora serão abordados os estágios da arquitetura superescalar. Verificação de Dependências Este estágio verifica e resolve as dependências do processo. Podem ser elas: dependência de dados, controle e estrutural. Isto é necessário para que o sentido e a integridade da atividade sejam mantidos. Busca de Instruções Estágio com a função de buscar as instruções na memoria cache e inseri-las na fila de instruções. Na arquitetura superescalar, essa função acaba trazendo varias instruções. Detecção de paralelismo e despacho de múltiplas instruções Responsável por identificar se uma ou mais instruções podem ser executadas simultaneamente. Estágio que no qual decodifica as instruções para realizar a análise e julgar quais entrarão simultaneamente. Depois da análise feita, o estágio identifica as instruções, seleciona e as encaminham para as unidades funcionais e desaloca instruções realizadas. Previsão de desvios Subsequente ao despacho de instruções é necessário analisar se podem ser realizados desvios. Necessariamente pode pular instruções que são dependentes para a realização das independentes, e assim posteriormente retomando a instrução que está à espera de algum recurso. Execução de instruções Neste estágio realmente são executadas cada instrução. Nas várias unidades funcionais são realizadas as instruções simultaneamente. B. Arquiteturas Multithreads Antes de aprofundar em Multithreads é necessário definir Thread. Thread é denominado a divisão de um processo principal em vários processos. Porém nem todos os processos são divisíveis. Figura 2 - Processo com Monothread ou Thread Na figura 2 é possível analisar que aos Threads são executados separadaos com seus respectivos endereçamentos, registradores, temporizadores e arquivos. Esse detalhe que muda na arquitetura Multithread. Logo se define que na arquitetura Multithread não existe um conceito de um programa, e sim de Threads. O processo necessita de pelo menos um Thread para execução e pode compartilhar o espaço de endereçamento com vários outros e são executados de forma concorrente quando existem outros processadores. Assim quando um Thread está à espera de um recurso, outro toma o seu lugar. Figura 3 - Processo Multithread Além de compartilharem o mesmo endereçamento, também em conjunto possuem temporizadores e arquivos, mas cada um possui seus próprios registradores. A imagem a seguir exemplifica de forma mais clara. Figura 4 - Processo Multithread Os threads são colocados em prol do hardware e assim ficam aguardando a chance de ganharem o processador e serem executados. Os threads são colocados em prol do hardware e assim ficam aguardando a chance de ganharem o processador e serem executados. Essa arquitetura multithread dividi-se em três tipos diferentes sujeitas a forma que serão exececutados as threads. Multithreading(Interleaver Multi Thread) IMT - Consiste em um método que para cada iteração do ciclo, um novo thread é executado. Então sempre vai gerar uma alternância na execução das instruções. Neste metodo é possível eliminar conflitos e dependências de dados . Figura 1 - Arquitetura Superescalar Multithreading(Blocked Multi Thread) - BMT Método que diferente do IMT, a cada novo ciclo, ele não altera a Thread até mudar de contexto. Uma thread só é interrompida se houver evento de latência. Simultaneous Multi Thread SMT - Método que aceita multiplos threads enviarem várias instruções por iteração do ciclo para as unidades funcionais. A figura abaixo apresenta comparativamente o funcionamento dos tipos diferentes de multithread. Figura 5 - Escalonamento de tarefas nos diferentes tipos de Multithreads. C. Arquitetura Multi Core Esta arquitetura explora a capacidade de realizar multithreading por mais de um processador simultaneamente. Ou seja, mais de uma unidade de processamento. Esse poder trouxe o benefício de executar varias tarefas de processamento complexo ao mesmo tempo. A arquitetura Multicore trouxe até os dias atuais a capacidade de colocar dois ou mais processadores dentro de um mesmo chip e junto, quatro tipos de organização com modelos de memória cache compartilhada. São eles: Primeira Organização: Composta por uma memória cache L1 dedicada para cada núcleo e uma memória cache L2 compartilhada fora do chip. Segunda Organização: Possui memórias cache L1 e L2 para cada processador(núcleo) dentro do chip. Terceira Organização: Composta por uma memória cache L1 dedicada para cada núcleo e uma memória cache L2 compartilhada, porém as duas dentro do chip. Quarta Organização: É composta por três memórias caches L1 e L2 para cada processador e uma L3 compartilhada. Figura 6 - Exemplo da quarta geração. Processador Intel i7 D. Arquitetura Many Core A arquitetura many core é composta por muitos núcleos. Porém por possui esse grande número de processadores gerou um limite de conexão (problema físico). Não foi possível mais realizar a comunicação das cores por meio de memórias caches. Com tudo, a conexão entre os processadores foi desenvolvida por mensagens. Cada núcleo possui um roteador e estes se comunicam durante os processos. A arquitetura distribui a carga de trabalho entre os cores e também possui núcleos reservas para que caso algum falhe este pode ser substituído. Figura 7 - Processador com arquitetura many core. . V. CONCLUSÃO Com o decorrer o tempo é possível notar uma grande evolução de arquiteturas na qual é permitido o paralelismo ser implementado, a motivação de poder contar cada vez mais com máquinas capazes de realizar um maior número de tarefas concluídas por unidade de tempo (throughput), proporcionando outro nível entre as relações de área, consumo de potência e desempenho. É notável que a evolução das arquiteturas esteja resultando em processadores mais potentes, porém na atualidade encontramos barreiras para dobrar o nosso poder de processamento, foi proposto que o tempo necessário para dobrar a capacidade de processamento era um ciclo de 18 meses, isto em 1995 por Gordon Moore, porém em 2016 a Intel notificou que não seria capaz de integrar a metade de chips (transistores) que seria necessário para que a Lei de Moore continuasse em execução. Sabemos que ainda estamos longe da construção de supercomputadores com núcleos compartilhados como se fossem físicos, mas que a computação caminha para construção de uma arquitetura que é capaz de suportar grandes volumes de processamentos distribuindo em um grande número de computadores como é o caso da rede BOINC (Berkeley Open Infrastructure For Network Computing) no qual qualquer um pode instalar um software podendo assim compartilhar recursos do seu computador para processamento de pesquisas científicas. VI. REFERENCIAS BIBLIOGRÁFICAS 1. Smith, J. E. and Sohi, G. S. (1995). The microarchitecture of superscalar processors. IEEE, 83(12):1609–1624 2. TENENBAUM, Andrew S., Distributed Systems: Principles and Paradigms, pg. 2. ISBN 0-13-239227-5, New Jersey, 2006. 3. Olukotun, K., Nayfeh, B. A., Hammond, L., Wilson, K., and Chang, K. (1996). The case for a single-chip multiprocessor. In Proceedings ASPLOS: Int. Symp. on Architectural Support for Programming Languages and Operating Systems, pages 2–11. IEEE 4. Bjerregaard, T. and Mahadevan, S. (2006). A survey of research and practices of networkon-chip. ACM Computing Surveys, 38:1–51. 5. Freitas, H. C., Colombo, D. M., Kastensmidt, F. L., and Navaux, P. O. A. (2007). Evaluating network-on-chip for homogeneous embedded multiprocessors in fpgas. In Proceedings ISCAS: Int. Symp. on Circuits and Systems, pages 3776–3779. 6. De Micheli, G. and Benini, L. (2006). Networks on Chips: Technology and Tools. Morgan Kaufmann. 7. Alves, M. A. Z. (2009). Avaliação do compartilhamento das memórias Cache no desempenho de arquiteturas Multi-Core. PPGC / UFRGS - Programa de Pós-Graduação em Computação da Universidade Federal do Rio Grande do Sul. 8. Marino, M. D. (2006). 32-core cmp with multi-sliced l2: 2 and 4 cores sharing a l2 slice. In Proceedings SBAC-PAD: Int. Symp. on Computer Architecture and High Performance Computing, pages 141–150. IEEE. 9. Bardine, A., Comparetti, M., Foglia, P., Gabrielli, G., Prete, C. A., and Stenströ andm, P. (2008). Leveraging data promotion for low power d- nuca caches. In Digital System 358 Design Architectures, Methods and Tools, 2008. DSD ’08. 11th EUROMICRO Conference on, pages 307– 316 10. Kim, C., Burger, D., and Keckler, S. Q. (2002). An adaptive, non- uniform cache structure for wire-delay dominated on-chip-caches. In Proceedings Int. Conf. on Architectural Support for Programming Languages and Operating Systems, pages 211–222. IEEE. 11. Quinn, Michael J. (2003), Parallel Programming in C with MPI and OpenMP, Mc Graw Hill, 1º edição.
Compartilhar