Computação paralela e distribuída

15

Qual é (são) as diferenças entre computação paralela e distribuída? Quando se trata de escalabilidade e eficiência, é muito comum ver soluções que lidam com cálculos em clusters de máquinas e, às vezes, é chamado de processamento paralelo ou processamento distribuído.

De certa maneira, o cálculo parece sempre paralelo, pois há coisas em execução simultaneamente. Mas a computação distribuída está simplesmente relacionada ao uso de mais de uma máquina, ou existem outras especificidades que distinguem esses dois tipos de processamento? Não seria redundante dizer, por exemplo, que um cálculo é paralelo E distribuído ?

Rubens
fonte

Respostas:

16

Simplificando, 'paralelo' significa executar simultaneamente em recursos distintos (CPUs), enquanto 'distribuído' significa executar em computadores distintos, envolvendo problemas relacionados às redes.

A computação paralela usando, por exemplo, OpenMP não é distribuída, enquanto a computação paralela com o Message Passing é frequentemente distribuída.

Estar em uma configuração 'distribuída, mas não paralela' significa subutilizar os recursos, por isso raramente é encontrado, mas é conceitualmente possível.

damienfrancois
fonte
4

Os termos "computação paralela" e "computação distribuída" certamente apresentam uma grande sobreposição, mas podem ser diferenciados ainda mais. Na verdade, você já fez isso na sua pergunta, perguntando posteriormente sobre "processamento paralelo" e "processamento distribuído".

Pode-se considerar "computação distribuída" como o termo mais geral que envolve "processamento distribuído", bem como, por exemplo, "armazenamento distribuído". O termo comum, "distribuído", geralmente se refere a algum tipo de Mensagem Passando por uma rede, entre máquinas fisicamente separadas.

O termo "computação paralela" também está em processo de definição mais detalhada, por exemplo, diferenciando explicitamente os termos "paralelo" e "simultâneo", onde - aproximadamente - o primeiro refere-se ao paralelismo de dados e o segundo ao paralelismo de tarefas , embora exista dificilmente são definições realmente rigorosas e vinculativas.

Então alguém poderia dizer que

  • "processamento distribuído" geralmente (embora não necessariamente) significa que também é "processamento paralelo"
  • "computação distribuída" é mais geral e também abrange aspectos que não estão relacionados ao paralelismo
  • e, obviamente, "computação paralela" / "processamento paralelo" não implica que seja "distribuído"
Marco13
fonte
3

As respostas apresentadas até agora são muito boas, mas eu também esperava uma ênfase em uma diferença específica entre processamento paralelo e distribuído: o código executado. Considerando os processos paralelos, o código executado é o mesmo, independentemente do nível de paralelismo (instrução, dados, tarefa). Você escreve um único código e ele será executado por diferentes threads / processadores, por exemplo, ao computar produtos de matrizes ou gerar permutações.

Por outro lado, a computação distribuída envolve a execução de diferentes algoritmos / programas ao mesmo tempo em diferentes processadores (de uma ou mais máquinas). Esses cálculos são posteriormente mesclados em resultados intermediários / finais, usando os meios disponíveis de comunicação / sincronização de dados (memória compartilhada, rede). Além disso, a computação distribuída é muito atraente para o processamento do BigData, pois permite explorar o paralelismo do disco (geralmente o gargalo de grandes bancos de dados).

Finalmente, para o nível de paralelismo, pode ser tomado como uma restrição à sincronização. Por exemplo, no GPGPU, que é um dado múltiplo de instrução única (SIMD), o paralelismo ocorre tendo entradas diferentes para uma única instrução, cada par (dado_i, instrução) sendo executado por um encadeamento diferente. Essa é a restrição de que, no caso de ramificações divergentes, é necessário descartar muitos cálculos desnecessários, até que os encadeamentos reconvergam. Para os threads da CPU, porém, eles geralmente divergem; ainda, pode-se usar estruturas de sincronização para conceder execução simultânea de seções específicas do código.

Rubens
fonte