O que é programação paralela? – paralelismo paradigmas

Pergunta:


Tenho algumas dúvidas em relação a programação paralela:

  • O que é programação paralela?
  • Trata-se de uma técnica ou um paradigma de programação?
  • Existe alguma linguagem específica para programação paralela?
  • Em que casos é melhor de se utilizar programação paralela?
Autor da pergunta Avelino

Miguel Angelo

O que é? Quando usar?

Sempre que dois processamentos forem independentes, por definição, se pode usar paralelização.
Até aqui nenhuma novidade… o difícil mesmo é garantir um ambiente em que a paralelização não cause
um problema maior do que o benefício, e é justamente ai que entram linguagens, estruturas de dados e técnicas
que tornam mais fácil programar de forma paralelizável.

Eu não diria que programação paralela é por si só um paradigma, mas sim um conjunto de elementos que tornam mais fáceis a existência de paralelismo e e a obtenção dos benefícios trazidos por ela.

Linguagens

Linguagens funcionais

São exemplos de linguagens que vão mais na direção da paralelização, principalmente com funções chamadas de puras, ou seja, que não causam efeitos colaterais e que não dependem de nada além daquilo que é explicitamente passado para elas.

A paralelização geralmente ocorre sobre funções puras que devem ser aplicadas a uma coleção de dados.
Como a função é pura, se pode delegar cada elemento da coleção para um processador em paralelo,
seja na mesma máquina ou em máquinas distintas.

Exemplos:

Existe uma lista infindável de linguagens que se aproximam mais da abordagem paralelizável.

Estruturas de dados

Imutabilidade

Existem também arquiteturas de dados que se dão bem com a paralelização, e a mais notável ao meu
ver são estruturas imutáveis. Elas permitem que o programador não se preocupe com efeitos
colaterais ao manipular dados, pois cada vez que o faz, novas instâncias são criadas ao invés
de se modificar o objeto original. As anteriormente apresentadas funções puras se beneficiam muito
de estruturas imutáveis, pois assim fica garantido que não haverá efeitos colaterais através dos
argumentos passados.

Técnicas/Paradigmas

Map/Reduce

Há também técnicas que se valem de paralelização para fazer enormes processamentos de dados (e.g. processamento de Big Data).
Uma notável é a chamada Map/Reduce, que segue o paradigma de dividir para conquistar.
Esse paradigma (ou técnica) se vale de funções puras e também de estruturas imutáveis.

Para quem conhece JavaScript, Map e Reduce estão aqui no mesmo sentido que os métodos map e
reduce disponível em Arrays:

  • Map: para uma coleção de entrada é produzida uma coleção de saída.
  • Reduce: para uma coleção de entrada é produzido um resultado que agregado dos elementos da coleção original.

Eu dou esse exemplo do JavaScript pois é ago que as pessoas possuem mais familiaridade (eu acho),
e assim levo mais para perto delas o que é MapReduce quando elas parecem não entender do que
se trata.

Não diria que há grandes diferenças entre técnica e paradigma, além da do paradigma ser aplicado
como um fundamento, por isso estou apresentando ambos sob o mesmo título.

Exemplos:

No hardware

Renderização de imagens

Programação paralela também existe na camada de hardware. Por exemplo, na sua placa de vídeo. A renderização de imagens é claramente uma das principais aplicações do paralelismo, uma vez que há milhões de pixels a serem renderizados e todos eles podem ser processados de forma independente uns dos outros (falando de forma bem rasteira só pra dar uma ideia).

A programação paralela consiste em dividir uma tarefa computacional em duas ou mais instâncias suficientemente independentes a ponto de poderem ser executadas em paralelo – por exemplo em dois núcleos de processamento diferentes, ou mesmo em duas máquinas diferentes. Nem toda tarefa é paralelizável, isso depende muito das características do problema e das relações de dependência entre as tarefas a serem realizadas.

Um exemplo de problema facilmente paralelizável é “incremente em um todos os valores desse vetor enorme” (divida o vetor em N partes e mande cada processo realizar a tarefa em uma das partes). Um exemplo de problema dificilmente paralelizável é “faça com que cada elemento desse vetor enorme tenha seu valor somado a todos os elementos posteriores a ele”.

A tarefa de paralelizar um programa e as ferramentas e técnicas usadas não são em si um paradigma, e pode-se adotar essa técnica em qualquer linguagem que permita disparar mais de um processo, que suporte multi-threading (desde que os threads sejam implementados de modo que possam ser distribuídos por mais de um processo), ou que suporte comunicação em rede (para distribuição do processamento por mais de uma máquina). Entretanto, pode-se projetar toda uma linguagem ou framework com o paralelismo em mente (ver “programação concorrente”), como por exemplo a linguagem Erlang. Se na “filosofia” da linguagem/plataforma o paralelismo é a norma, e não a exceção, então creio que se pode falar de paradigma nesses casos…

Sobre quando usar, eu diria que sempre que for possível, necessário e vantajoso. Ou seja, se o problema não é paralelizável (ou se o benefício de paralelizar for negligível) não há o que fazer; se uma alternativa sequencial possui um desempenho pra lá de satisfatório, não compensa a complexidade extra de paralelizar (e pode até piorar a performance); e por fim se o overhead da paralelização (seções críticas/locks, separação de memória e comunicação inter-processos, comunicação em rede, etc) for anular a maior parte do benefício, talvez não compense paralelizar por ora (por outro lado, o que não é vantajoso hoje pode o ser no futuro, quando as condições do hardware e das comunicações mudarem).

O que é programação paralela?

Resumidamente, é quando você divide uma computação entre várias máquinas ou processadores que rodam ao mesmo tempo.

Não confunda paralelismo com concorrência. Por exemplo, um sistema operacional vai ter diversos processos rodando concorrentemente mas apenas um deles usa a CPU de cada vez.

Trata-se de uma técnica ou um paradigma de programação?

Acho que está mais pra técnica do que paradigma. Geralmente quando se pensa em paradigma é algo que você pode usar para qualquer programa e programação paralela é algo que é melhor ser usado caso a caso.

Existe alguma linguagem específica para programação paralela?

Programação paralela é um problema muito difícil, especialmente quando os processos paralelos precisam fazer alguma forma de comunicação ou compartilhamento de recursos entre si. Existem diversas linguagens de programação e frameworks que tentam dar suporte a programação paralela mas cada um vai ter seus pontos fortes e fracos. Programação paralela não é como programação orientada a objetos, programação funcional ou programação lógica em que vc pode chegar e falar “olha, a linguagem X é um exemplo do que significa ser uma linguagem de programação paralela”.

Dito isso, um exemplo que posso dar é o CUDA e outras linguagens para escrever programas paralelos que rodam em GPUs.

Em que casos é melhor de se utilizar programação paralela?

Programação paralela é algo que você faz quando você quer aproveitar o fato de que você tem mais de um processador disponível para poder tentar achar mais rápido a resposta para o seu problema. Em situaçÕes que a performance não é importante não vale a pena fazer uma implementação paralela complexa e dependendo do algoritmo que você tem que implementar pode ser mais ou menos difícil criar uma versão paralela.

Um exemplo bom do tipo de coisa que se dá bem com paralelismo é quando você tem computações “obviamente paralelizáveis”. Por exemplo:

  • Para renderizar imagens 3d cada processador pode ser responsável por um pedaço diferente da tela.
  • Em alguns algoritmos numéricos como multiplicação de vetores e matrizes, cada processador pode ficar responsável por um trecho do vetor ou matriz separado e dá pra juntar as contas parciais no final.
  • Para compilar um programa com vários módulos, é poss;ivel usar paralelismo para compilar mais de um módulo ao mesmo tempo (a opção “-j” do make serve pra isso)

Fonte

Related Posts:

Qual a diferença entre AppCompatActivity e Activity? – android android-activity
Pergunta: Qual a diferença da AppCompatActivity para Activity ? A partir de qual versão a AppCompatActivity foi adicionada ao Android? Autor da pergunta Luhhh A diferença reside ...
Como abreviar palavras em PHP? – php string
Pergunta: Possuo informações comuns como nome de pessoas e endereços, e preciso que elas contenham no máximo 30 caracteres sem cortar palavras. Exemplo: 'Avenida Natalino João Brescansin' ...
Qual é a finalidade de um parêntese vazio numa declaração Lambda? – c# expressões-lambda característica-linguagem
Pergunta: Criei um exemplo de uma declaração Lambda sem argumentos, entretanto, estou com duvidas referente a omissão do parêntese vazio () na declaração. Veja o exemplo: class ...
Boas práticas para URI em API RESTful – api rest restful
Pergunta: Estou com dúvida em relação às URIs de alguns recursos da api que estou desenvolvendo. Tenho os recursos projetos e atividades com relação 1-N, ...
Dúvidas sobre a integração do MySQL com Java – java mysql netbeans
Pergunta: Estou criando um sistema no NetBeans, utilizando a linguagem Java e o banco de dados MySQL. Escrevi o seguinte código para realizar a conexão ...
Qual é a finalidade da pasta Model do framework Inphinit? – php inphinit
Pergunta: No Inphinit micro-framework existe a pasta Model que fica dentro da pasta application, e nela é onde ficam as classes, mas eu estou muito ...
Uso do ‘@’ em variáveis – javascript typescript coffeescript
Pergunta: Vejo em algumas linguagens que compilam para javascript, como TypeScript e CoffeeScript, o uso do @ em variáveis, como também, casos em que o ...
Qual tamanho máximo um arquivo JSON pode ter? – json arquivo
Pergunta: Vou dar um exemplo para conseguir explicar minha duvida: Preciso recuperar informação de imagens vindas de uma API, esse banco de imagens me retorna JSON's ...
O que é Teste de Regressão? – terminologia engenharia-de-software testes
Pergunta: Na matéria de Teste de Software o professor abordou um termo chamado Teste de Regressão, isto dentro da disciplina de teste de software. Sendo ...
O que é um construtor da linguagem? – php característica-linguagem
Pergunta: Em PHP, já li e ouvi várias vezes a respeito dos Construtores da Linguagem. Os casos que sempre ouvi falar deles foi em casos ...
Função intrínseca para converter numérico para string – cobol
Pergunta: Estou a tentar saber se existe alguma função intrínseca do COBOL para converter um data numérico para string sem precisar usar a cláusula REDEFINES: ( ...
Porque usar implements? – java android
Pergunta: Qual a diferença entre usar btn.setOnClickListener(new OnClickListener() { e public class MainActivity extends Activity implements OnClickListener{ Estive fazendo um curso de Android e meu professor falou que ...
O que é XHTML e quando deve ser usado? – html xml xhtml
Pergunta: O que eu sei é que o XHTML precisa ser XML válido. Isso implica, por exemplo, que todas as tags precisam ser fechadas. Por ...
Uma placa aceleradora de vídeo pode melhorar o desempenho não-gráfico? [fechada] – desempenho
Pergunta: Para desenvolver em Ruby on Rails, eu utilizo aqui uma máquina virtual do VirtualBox com Ubuntu Server 14.04 sem interface gráfica instalada. Recentemente descobri uma ...
Concat() VS Union() – c# .net
Pergunta: Qual a diferença entre Concat() e Union() ? Quando usar Concat() e quando usar Union() ? Somente pode ser usado em list ? ...

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *