====== Visão geral ====== A **programação paralela** é uma forma de realizar muitos cálculos em simultâneo, operando com base de que grandes problemas podem ser frequentemente ser divididos em problemas menores e independentes, que são então resolvidos. Há diferentes tipos de computação paralela: bit, instrução, dados ou tarefa. Assim, evita-se a programação sequencial, a qual pode ser muito ineficiente. ====== Principais Marcos ====== Na década de **1950**, começa-se a trabalhar em maneiras de tornar os programas mais eficientes. Diante disso, cria-se o conceito de **"context switching"**: salva-se o contexto (estado) de um processo antigo (suspenso) e o carregando para um novo processo, ou seja, guarda um processo para executá-lo mais tardiamente. Além disso, também foi introduzido a ideia de **"swapping"**: um processo é trocado da memória RAM (rápida) para a memória de disco (lenta), durante essa comutação, muito tempo é perdido só para a transferência da informação (cresce linearmente), isto tudo é um "swap-in", um "swap-out" seria o oposto (do disco para a RAM). Alguns anos depois, na decáda de 60, já havia algumas implementações de ordens hierárquica de processos sequenciais. Assim, tornou-se realizável, a partir da ampliação de sistemas operacionais multi-tarefa, multi-thread e paralelos, como o "THE multiprogramming system" (**1968**). Outrossim, outro grande marco foi 10 anos depois (**1978**), com o surgimento da Lógica de Hoare, a qual, com uma abordagem axiomática, aborda um conjunto de regras lógicas para argumentar rigorosamente pela correção na computação paralela, definindo claramente as interações entre processos concorrentes, possibilita-se, então, a criação de compiladores [[m:multiprocessamento|multi tarefa]]. Por fim, é importante ressaltar que o primeiro processador multi-core (dual-core) para desktop, só foi surgir ao final de **2006**, com a introdução do Pentium D pela intel. Portanto, estes dois núcleos eram responsáveis por dividir as tarefas entre si. ====== Grandes Nomes ====== **[[f:frances_allen|Frances Elizabeth Allen]]** - Liderou o desenvolvimento do **PTRAN**, um projeto que automatizou a execução em paralelo da linguagem FORTRAN, sua equipe PTRAN desenvolveu novos esquemas de detecção de paralelismo e criou o conceito de grafo de dependência de programa, o principal método de estruturação usado pela maioria dos [[c:compiladores|compiladores]] de paralelização. Além disso, Allen foi a primeira IBM Fellow e em 2006 tornou-se a primeira mulher a ganhar o Prêmio Turing. **[[e:edsger_dijkstra|Edsger W. Dijkstra]]** - O principal responsável pela criação da ordem hierárquica de processos sequenciais, sistemas de "garbage collection" em cooperação, além de ser o criador do sistema operacional "THE multiprogramming system". **Gene Myron Amdahl** - Projetista de computadores que formulou a lei de Amdahl, que afirma uma limitação fundamental da computação paralela. ====== Aplicações ====== Na computação paralela pode-se destacar, dentre várias, estas seguintes aplicações: - Na **bioinformática** para o enovelamento de proteínas (algorítmo para visualização do arranjo tridimensional da proteína); - Na velocidade de um algorítmo com **programação dinâmica** (resposta realizada com recursividade); - **Método de Monte Carlo (MMC)**, método estatístico que se baseia em amostragem aleatória em larga escala para obter resultados numéricos. Ou seja, ele usa a aleatoriedade dos dados para gerar resultados determinísticos do problema. ====== Impacto Social ====== A programação paralela principalmente impacta na velocidade de processos que antes seriam inviáveis. Mesmo que dificulte a implementação de determinado programa, quase todas as linguagens de programação, atualmente, possuem algum suporte a esse tipo de cooperação. Sendo assim, com o advento dos processadores multi-core, algumas vantagens como: melhor poder de processamento, mais desempenho, compartilhamento de dados, reutilização de funções, escalabilidade de aplicações, foram concebíveis. Aumentando a velocidade de processamento exponencialmente. ====== Desafios ====== Ainda existem algumas desvantagens nesta área. Softwares paralelos são **mais difíceis de programar** do que programas seriais, porque a simultaneidade introduz bugs em potencial, como condições de corrida. A comunicação e sincronização entre diferentes subtarefas é frequentemente um dos principais obstáculos para alcançar alta eficiência em programas paralelos. Olhando de outro ângulo, também podemos ver que nem todas as linhas paralelas levam a um aumento na velocidade. Como a tarefa é dividida em vários encadeamentos, esses encadeamentos normalmente passam algum tempo comunicando entre si. Em última análise, a sobrecarga de comunicação domina quando se trata do tempo necessário para resolver um problema. Nesse caso, quanto mais paralela for a execução, mais lento será o tempo total de execução. Este é um efeito chamado **lentidão paralela**. ====== Referências ====== 1. Gene M. Amdahl | IEEE Computer Society, disponível em: https://www.computer.org/profiles/gene-amdahl 2. Charles Antony Richard Hoare – Wikipédia, a enciclopédia livre, disponível em: https://pt.wikipedia.org/wiki/Charles_Antony_Richard_Hoare 3. Concorrência e Paralelismo (Parte 1) | Entendendo Back-End para Iniciantes (Parte 3), disponível em: https://www.akitaonrails.com/2019/03/13/akitando-43-concorrencia-e-paralelismo-parte-1-entendendo-back-end-para-iniciantes-parte-3 4. Frances Allen - Wikipedia, disponível em: https://en.wikipedia.org/wiki/Frances_Allen 5. Edsger W. Dijkstra - Wikipedia, disponível em: https://en.wikipedia.org/wiki/Edsger_W._Dijkstra 6. Difference between Swapping and Context Switching, disponível em: https://www.geeksforgeeks.org/difference-between-swapping-and-context-switching 7. INE 5645 Programação Paralela e Distribuída, disponível em: http://www.inf.ufsc.br/~bosco.sobral/ensino/ine5645/Unidade1.pdf 8. Computação paralela – Wikipédia, a enciclopédia livre, disponível em: https://pt.wikipedia.org/wiki/Computa%C3%A7%C3%A3o_paralela