Computação distribuída vs paralela

61

Costumo ouvir pessoas falando sobre computação paralela e computação distribuída , mas tenho a impressão de que não há limites claros entre os 2, e as pessoas tendem a confundir isso com bastante facilidade, enquanto acredito que seja muito diferente:

  • A computação paralela é mais fortemente acoplada ao multi-threading, ou como fazer uso total de uma única CPU.
  • A computação distribuída refere-se à noção de dividir e conquistar, executando subtarefas em máquinas diferentes e depois mesclando os resultados.

No entanto, desde que entramos na era do Big Data , parece que a distinção está realmente derretendo, e a maioria dos sistemas hoje usa uma combinação de computação paralela e distribuída.

Um exemplo que eu uso no meu trabalho cotidiano é o Hadoop com o paradigma Map / Reduce, um sistema claramente distribuído com trabalhadores executando tarefas em máquinas diferentes, mas também aproveitando ao máximo cada máquina com alguma computação paralela.

Gostaria de obter alguns conselhos para entender como fazer exatamente a distinção no mundo de hoje e se ainda podemos falar sobre computação paralela ou se não há mais uma distinção clara. Para mim, parece que a computação distribuída cresceu muito nos últimos anos, enquanto a computação paralela parece estagnada, o que provavelmente poderia explicar por que ouço muito mais falar sobre distribuir cálculos do que paralelizar.

Charles Menguy
fonte
5
Computação paralela não significa necessariamente CPU única: existem sistemas que possuem várias CPUs físicas.
svick
2
Além disso, a computação distribuída não se restringe a dividir e conquistar em si. Tenho mais problemas com pessoas que confundem simultaneidade e paralelismo.
Raphael
11
Se você estiver abordando explicitamente a computação distribuída, precisará lidar com casos de falha muito mais profundos. Muitas coisas são distribuídas apenas por razões geográficas. Alguns sistemas distribuídos têm muito pouco a acontecer em paralelo porque um nó central na rede é um gargalo.
10243 Rob

Respostas:

57

Isso é parcialmente uma questão de terminologia e, como tal, exige apenas que você e a pessoa com quem estiver conversando esclareçam antecipadamente. No entanto, existem diferentes tópicos que estão mais fortemente associados ao paralelismo , simultaneidade ou sistemas distribuídos .

O paralelismo geralmente se preocupa em realizar uma computação específica o mais rápido possível, explorando vários processadores. A escala dos processadores pode variar de várias unidades aritméticas dentro de um único processador, a vários processadores que compartilham memória, até a distribuição da computação em muitos computadores. No lado dos modelos de computação, o paralelismo é geralmente sobre o uso interno de vários threads simultâneos de computação, a fim de calcular um resultado final. O paralelismo também é às vezes usado para sistemas reativos em tempo real , que contêm muitos processadores que compartilham um único relógio mestre; esses sistemas são totalmente determinísticos .

Simultaneidade é o estudo de cálculos com múltiplos threads de cálculo. A simultaneidade tende a vir da arquitetura do software e não da arquitetura do hardware. O software pode ser escrito para usar simultaneidade, a fim de explorar o paralelismo de hardware, mas muitas vezes a necessidade é inerente ao comportamento do software, para reagir a diferentes eventos assíncronos (por exemplo, um encadeamento computacional que funciona independentemente de um encadeamento da interface do usuário ou um programa que reage interrupções de hardware alternando para um encadeamento de manipulador de interrupções).

Os estudos de computação distribuída separam processadores conectados por links de comunicação. Enquanto os modelos de processamento paralelo geralmente (mas nem sempre) assumem memória compartilhada, os sistemas distribuídos dependem fundamentalmente da passagem de mensagens. Os sistemas distribuídos são inerentemente simultâneos. Como a concorrência, a distribuição geralmente faz parte do objetivo, não apenas parte da solução: se os recursos estiverem em locais geograficamente distintos, o sistema será inerentemente distribuído. Os sistemas nos quais são possíveis falhas parciais (de nós do processador ou de links de comunicação) se enquadram nesse domínio.

Gilles 'SO- parar de ser mau'
fonte
2
Boa resposta. Deve-se enfatizar que a computação distribuída é um subconjunto da computação paralela.
Raphael
6
@ Rafael: Eu não acho que isso representa com precisão o foco dos dois campos. De fato, eles são frequentemente considerados campos completamente separados, porque lidam com questões completamente diferentes. Ao programar um computador paralelo usando MPI, não se preocupa realmente com falhas parciais, pois é menos provável que ocorram nesses computadores. Por outro lado, a computação distribuída está mais preocupada com os problemas de distribuição, como falhas parciais, e muito menos preocupada em espremer cada ciclo de CPU das máquinas disponíveis.
Dave Clarke
4
@Raphael Pelo contrário, a computação distribuída é muito independente da computação paralela. No estudo de sistemas distribuídos, a computação paralela é frequentemente o caso chato (sem recursos locais interessantes, sem falhas).
Gilles 'SO- stop be evil'
Eu estava usando as palavras literalmente; muito ruim se os termos foram apropriados e, portanto, divergiram.
Raphael
Obrigado pela sua resposta @Gilles, parece que eu estava um pouco inclinado para a computação distribuída, feliz em ver alguém que se refere a algo pelos termos apropriados!
precisa saber é o seguinte
17

Conforme apontado por @Raphael, a Computação Distribuída é um subconjunto da Computação Paralela; por sua vez, a computação paralela é um subconjunto da computação simultânea.

Simultaneidade refere-se ao compartilhamentode recursos no mesmo período de tempo. Por exemplo, vários processos compartilham a mesma CPU (ou núcleos da CPU) ou compartilham memória ou um dispositivo de E / S. Os sistemas operacionais gerenciam recursos compartilhados. Máquinas multiprocessadoras e sistemas distribuídos são arquiteturas nas quais o controle de simultaneidade desempenha um papel importante. A simultaneidade ocorre no nível do hardware e do software. Vários dispositivos operam ao mesmo tempo, os processadores têm paralelismo interno e trabalham com várias instruções simultaneamente, os sistemas têm múltiplos processadores e os sistemas interagem através da comunicação em rede. A simultaneidade ocorre no nível dos aplicativos no tratamento de sinais, na sobreposição de E / S e processamento, na comunicação e no compartilhamento de recursos entre processos ou entre threads no mesmo processo.

Dois processos (ou threads) em execução no mesmo sistema para que sua execução seja intercalada no tempo são simultâneos: processos (threads) estão compartilhando o recurso da CPU. Gosto da seguinte definição: dois processos (threads) em execução no mesmo sistema são simultâneos se e somente se o segundo processo (thread) iniciar a execução quando o primeiro processo (thread) ainda não tiver terminado sua execução.

A simultaneidade se torna paralelismo quando processos (ou threads) são executados em diferentes CPUs (ou núcleos da mesma CPU). O paralelismo neste caso não é "virtual", mas "real".

Quando essas CPUs pertencem à mesma máquina, nos referimos à computação como "paralela"; quando as CPUs pertencem a máquinas diferentes , podem ser distribuídas geograficamente, nos referimos à computação como "distribuída".

Portanto, a computação distribuída é um subconjunto da computação paralela, que é um subconjunto da computação simultânea.

Obviamente, é verdade que, em geral, a computação paralela e distribuída é considerada diferente. A computação paralela está relacionada a aplicativos fortemente acoplados e é usada para atingir um dos seguintes objetivos:

  1. Resolva problemas de computação intensiva mais rapidamente;
  2. Resolva problemas maiores na mesma quantidade de tempo;
  3. Resolva problemas do mesmo tamanho com maior precisão na mesma quantidade de tempo.

No passado, o primeiro objetivo era o principal motivo da computação paralela: acelerar a solução do problema. Neste momento, e quando possível, os cientistas usam principalmente computação paralela para alcançar tanto o segundo gol (por exemplo, eles estão dispostos a gastar a mesma quantidade de tempo eles passaram na resolução passado em paralelo um problema de tamanho para resolver agora um problema de tamanho ) ou o terceiro (ou seja, eles estão dispostos a gastar a mesma quantidade de tempo que passaram no passado resolvendo em paralelo um problema de tamanho para resolver agora um problema de tamanhox 5 x T x xTx5xTxxmas com maior precisão usando um modelo muito mais complexo, mais equações, variáveis ​​e restrições). A computação paralela pode usar memória compartilhada, passagem de mensagem ou ambas (por exemplo, intra-nó de memória compartilhada usando OpenMP, inter-nó de passagem de mensagem usando MPI); também pode usar aceleradores de GPUs. Como o aplicativo é executado em um supercomputador paralelo, geralmente não levamos em conta questões como falhas, partição de rede etc., pois a probabilidade desses eventos é, para fins práticos, próxima de zero. No entanto, grandes aplicativos paralelos, como simulações de mudanças climáticas, que podem durar vários meses, geralmente se preocupam com falhas e usam o mecanismo de verificação / reinício para evitar iniciar a simulação novamente desde o início, se surgir um problema.

A computação distribuída está relacionada a aplicativos fracamente acoplados, nos quais o objetivo (para supercomputação distribuída ) é resolver problemas muito grandes ou cuja execução pode ser dividida em diferentes componentes que podem se beneficiar da execução em diferentes arquiteturas. Existem vários modelos, incluindo cliente-servidor, ponto a ponto, etc. Os problemas que surgem na computação distribuída, como segurança, falhas, partição de rede etc., devem ser levados em consideração no tempo de design, pois nesse contexto as falhas são a regra e não é a exceção.

Finalmente, a computação em grade e em nuvem é um subconjunto da computação distribuída. O paradigma da computação em grade surgiu como um novo campo distinto da computação distribuída tradicional, devido ao seu foco no compartilhamento de recursos em larga escala e em aplicativos inovadores de alto desempenho. Os recursos compartilhados geralmente pertencem a vários domínios administrativos diferentes (as chamadas Organizações Virtuais ). A computação em grade, embora seja muito usada por cientistas na última década, é tradicionalmente difícil para usuários comuns. A computação em nuvem tenta preencher a lacuna, permitindo que usuários comuns explorem facilmente várias máquinas, localizadas no mesmo datacenter e não distribuídas geograficamente, por meio do uso de máquinas virtuaisque podem ser montados pelos usuários para executar seus aplicativos. Devido ao hardware, em particular a falta habitual de uma interconexão de rede de alto desempenho (como Infiniband etc.), as nuvens não são direcionadas para a execução de aplicativos MPI paralelos. Aplicativos distribuídos em execução nas nuvens geralmente são implementados para explorar o paradigma Map / Reduce. A propósito, muitas pessoas pensam em Mapear / reduzir como um modelo de fluxo de dados paralelo.

Massimo Cafaro
fonte
2
Eu acho que essa resposta é um pouco enganadora; concentra-se na computação distribuída de alto desempenho (que na verdade está intimamente relacionada à computação paralela de alto desempenho), enquanto todo o campo da computação distribuída é muito mais amplo.
Jukka Suomela
Discordo: a resposta também inclui computação distribuída de alto desempenho, que geralmente é deixada de fora da computação distribuída. Na verdade, discuti modelos cliente-servidor e ponto a ponto, segurança, falhas e problemas de partição de rede que são o domínio da computação distribuída.
Massimo Cafaro
+1. Boa resposta! Gostaria de saber se a computação distribuída é usada para outros fins que não a computação paralela? Em outras palavras, a computação distribuída é um subconjunto da computação paralela, ou seja, a computação distribuída pertence à computação paralela? Btw, aqui está a minha pergunta cs.stackexchange.com/questions/20064
Tim
11
@ Tim, a computação distribuída também é usada per se, independentemente da computação paralela. Pensar, por exemplo, algoritmos distribuídos clássicos como eleição do líder, o consenso etc.
Massimo Cafaro
7

Não sei se entendi a pergunta. A distinção entre processamento paralelo e distribuído ainda está lá. O fato de você poder tirar proveito de ambos na mesma computação não muda o significado dos conceitos.

E não sei quais notícias você está acompanhando, mas tenho certeza de que o processamento paralelo não está estagnado, especialmente porque acho que é útil com mais frequência.

Se você precisar processar terabytes de dados, a computação distribuída (possivelmente combinada com a computação paralela) é o caminho a percorrer. Mas se você precisar calcular algo em um desktop ou smartphone, a computação paralela sozinha provavelmente fornecerá os melhores resultados, considerando que a conexão à Internet pode não estar disponível sempre e, quando estiver, pode ser lenta.

svick
fonte
11
-1, pois essa resposta realmente não responde à pergunta (por exemplo, explique os termos).
Jukka Suomela
@JukkaSuomela, a questão não é explicar os termos, mas a distinção entre eles.
Svick
6

Aqui está um artigo recente que vale a pena ler:

Michel Raynal: "Computação Paralela vs. Computação Distribuída: Uma Grande Confusão?" , Proc. Euro-Par 2015 , doi: 10.1007 / 978-3-319-27308-2_4

Abstrato:

Este documento de posição curta discute o fato de que, do ponto de vista do ensino, paralelismo e computação distribuída são frequentemente confundidos, enquanto, ao analisar sua natureza profunda, abordam questões fundamentais distintas. Portanto, currículos apropriados devem ser projetados separadamente para cada um deles. A atitude “tudo está em tudo (e reciprocamente)” não parece ser uma abordagem relevante para ensinar aos alunos os conceitos importantes que caracterizam o paralelismo, por um lado, e a computação distribuída, por outro.

Jukka Suomela
fonte
4

Na seção Introdução do livro [1], os autores fornecem outra perspectiva (diferente da das outras respostas) sobre a comparação entre computação distribuída e computação paralela.

Em termos gerais, o objetivo do processamento paralelo é empregar todos os processadores para executar uma grande tarefa. Por outro lado, cada processador em um sistema distribuído geralmente tem sua própria agenda semi-independente, mas por vários motivos, incluindo compartilhamento de recursos, disponibilidade e tolerância a falhas, os processadores precisam coordenar suas ações.

Nesta perspectiva, o paradigma Map / Reduce cai principalmente no contexto da computação paralela. No entanto, se queremos que os nós envolvidos cheguem a um consenso sobre um líder comum, usando, por exemplo, o algoritmo Paxos (wiki) , estamos considerando um problema típico na computação distribuída.

[1] Computação distribuída. Fundamentos, simulações e tópicos avançados. Hagit Attiya e Jennifer Welch. 2004.

hengxin
fonte
0

a resposta que é mais apropriada aqui. Basicamente, parallelrefere-se ao memory-shared multiprocessorque diz distributedrespeito ao seu private-memory multicomputers. Ou seja, o primeiro é uma única máquina multicore ou superescalar, enquanto o outro é uma rede de computadores geograficamente distribuída. O último implica menos acoplamento e, portanto, mais disponibilidade e tolerância a falhas ao custo de menos desempenho. O desempenho é prejudicado porque você precisa de (des) serialização de dados em todas as viagens de ida e volta e distâncias mais longas, enquanto você pode simplesmente referir um objeto na memória para passá-lo para outra CPU em processador paralelo.

Little Alien
fonte