Por que é MPI considerada mais difícil do que a memória compartilhada e Erlang considerado mais fácil, quando ambos estão passando-mensagem?

StackOverflow https://stackoverflow.com/questions/185444

Pergunta

Há um grande interesse nestes dias em Erlang como uma linguagem para escrever programas paralelos em multicore. Já ouvi pessoas argumentam que o modelo de passagem de mensagens de Erlang é mais fácil de programa do que os modelos de memória compartilhada dominantes tais como threads.

Por outro lado, na comunidade de computação de alto desempenho do modelo de programação paralela dominante tem sido MPI, que também implementa um modelo de passagem de mensagens. Mas no mundo do HPC, este modelo de passagem de mensagens é geralmente considerado muito difícil de programa, e as pessoas argumentam que os modelos de memória compartilhada, como OpenMP ou UPC são mais fáceis de programa.

Alguém sabe por que há tanta diferença na percepção de de passagem de mensagens vs. memória compartilhada nas TI e HPC mundos? É devido a alguma diferença fundamental na forma como Erlang e MPI implementar passagem de mensagens que faz Erlang-style mensagem de passagem de muito mais fácil do MPI? Ou tem alguma outra razão?

Foi útil?

Solução

Eu concordo com todas as respostas anteriores, mas acho que um ponto-chave que não é feito totalmente claro é que uma das razões que MPI pode ser considerado duro e Erlang fácil é a combinação de modelo para o domínio.

Erlang é baseado em um conceito de memória local, passagem de mensagens assíncrono e estado compartilhado resolvido usando alguma forma de banco de dados global que todos os segmentos podem chegar. Ele é projetado para aplicações que não se movem um monte de dados ao redor, e que não é suposto a explodir para fora a um 100k nós separados que a coordenação necessidade.

MPI se baseia na memória local e passagem de mensagens, e destina-se a problemas onde a movimentação de dados ao redor é uma parte fundamental do domínio. computação de alto desempenho é muito sobre tomando o conjunto de dados para um problema, e dividindo-se entre uma série de recursos de computação. E isso é um trabalho muito difícil em um sistema de transmissão de mensagens como dados tem de ser explicitamente distribuído com equilíbrio em mente. Essencialmente, MPI pode ser visto como uma admissão relutante que a memória compartilhada não escala. E é alvo de alto desempenho computação espalhados por 100k processadores ou mais.

Erlang não está a tentar alcançar o melhor desempenho possível, em vez de decompor um problema naturalmente paralela em seus fios naturais. Ele foi projetado com um tipo totalmente diferente de tarefas em mente em relação a MPI programação.

Assim, Erlang é melhor em comparação com pthreads e outras soluções de rosca heterogêneos, em vez locais, ao invés de MPI que é realmente destinadas a um muito diferente (e até certo ponto inerentemente mais difícil) conjunto de problemas.

Outras dicas

O paralelismo em Erlang é ainda muito difícil de implementar. Por isso quero dizer que você ainda tem que descobrir como dividir o seu problema, mas há algumas pequenas coisas que facilitam essa dificuldade quando comparado com alguma biblioteca MPI em C ou C ++.

Em primeiro lugar, uma vez passagem de mensagens de Erlang é um recurso de linguagem de primeira classe, o açúcar sintático faz sentir mais fácil.

Além disso, bibliotecas Erlang são todos construídos em torno de passar a mensagem de Erlang. Esta estrutura de apoio ajuda a dar-lhe um impulso para a terra-processling paralelo. Dê uma olhada nas de OTP como gen_server, gen_fsm, gen_event. Estes são muito fáceis de usar estruturas que podem ajudar seu programa paralelo tornou.

Eu acho que é mais a robustez da biblioteca padrão disponíveis que diferencia Erlang de passagem de mensagens de outras implementações MPI, não realmente qualquer característica específica da linguagem em si.

Normalmente simultaneidade em meio HPC trabalhando em grandes quantidades de dados. Este tipo de paralelismo é chamado paralelismo de dados e é realmente mais fácil de implementar usando uma abordagem de memória compartilhada como OpenMP , porque o sistema operacional cuida de coisas como programação e colocação de tarefas, que seria preciso implementar a si mesmo se estiver usando uma passagem de mensagens paradigma.

Em contraste, Erlang foi projetado para lidar com paralelismo de tarefas encontrado em sistemas de telefonia, caso sejam diferentes pedaços de código devem ser executados simultaneamente com apenas uma quantidade limitada de comunicação e requisitos fortes para a tolerância e recuperação de falhas.

Este modelo é semelhante ao que a maioria das pessoas usam PThreads para. Ele se encaixa aplicações como servidores web, onde cada pedido pode ser manipulado por um segmento diferente, enquanto as aplicações HPC fazer praticamente a mesma coisa em enormes quantidades de dados que também devem ser trocadas entre os trabalhadores.

Eu acho que tem algo a ver com a mentalidade quando você estiver programação com MPI e quando estiver programação com Erlang. Por exemplo, MPI não está embutido no idioma enquanto Erlang foi construído com suporte para a passagem de mensagens. Outra possível razão é a desconexão entre meramente enviar / receber mensagens e particionamento soluções em unidades simultâneos de execução.

Com Erlang você é forçado a pensar em um quadro de programação funcional, onde os dados realmente fecha por de chamada de função para chamada de função - e receber é um ato ativo que se parece com uma construção normal no idioma. Isto dá-lhe uma ligação mais estreita entre o cálculo que você está realmente realizando e o ato de envio / recebimento de mensagens.

Com MPI, por outro lado você é forçado a pensar apenas sobre a passagem mensagem real, mas não é realmente a decomposição de trabalho. Este quadro de pensamento requer um pouco de uma troca de contexto entre escrever a solução ea infra-estrutura de mensagens em seu código.

A discussão pode continuar, mas a opinião comum é que se o construto para a passagem de mensagens é realmente construído para a linguagem de programação e paradigma de que você está usando, normalmente isso é um melhor meio de expressar a solução em comparação com qualquer outra coisa que é "pregado" ou existe como um add-on para um idioma (na forma de uma biblioteca ou extensão).

Alguém sabe por que há tanta diferença na percepção de de passagem de mensagens vs. memória compartilhada nas TI e HPC mundos? É devido a alguma diferença fundamental na forma como Erlang e MPI implementar passagem de mensagens que faz Erlang-style mensagem de passagem de muito mais fácil do MPI? Ou há alguma outra razão?

A razão é simplesmente paralelismo vs concorrência. Erlang é criado para programação concorrente. HPC é tudo sobre programação paralela. Estes estão relacionados, mas diferentes objectivos.

A programação simultânea é muito complicado por fluxo de controle fortemente não-determinista e latência é muitas vezes um objectivo importante. uso de estruturas de dados imutáveis ??de Erlang simplifica muito a programação concorrente.

A programação paralela tem fluxo de controle muito mais simples e o objetivo é tudo sobre total de máximo rendimento e não latência. uso de cache eficiente é muito mais importante aqui, o que torna tanto estruturas de dados imutáveis ??Erlang e em grande parte inadequados. Mutação memória compartilhada é tanto tratável e substancialmente melhor neste contexto. Com efeito, cache de coerência está fornecendo mensagem acelerados por hardware passar para você.

Finalmente, para além destas diferenças técnicas, há também uma questão política. Os caras Erlang está tentando montar o hype multicore fingindo que Erlang é relevante para multicore quando não é. Em particular, eles estão divulgando grande escalabilidade, por isso é essencial considerar o desempenho absoluto também. Erlang escalas facilmente de mau desempenho absoluto em um núcleo ao mau desempenho absoluto em qualquer número de núcleos. Como você pode imaginar, isso não impressionar a comunidade HPC (mas é adequado para um monte de código fortemente concorrente).

Em relação MPI vs OpenMP / UPC: forças MPI-lo a cortar o problema em pedaços pequenos e assumir a responsabilidade de mover os dados ao redor. Com OpenMP / UPC "todos os dados estão lá", você só tem que excluir a referência um ponteiro. A vantagem MPI é que 32-512 conjuntos de CPU são muito mais barato do que máquinas individuais 32-512 CPU. Além disso, com MPI a despesa é adiantado, quando você projetar o algoritmo. OpenMP / UPC pode esconder as latências que você vai ter em tempo de execução, se seu sistema usa NUMA (e todos os grandes sistemas de fazer.) - o seu programa não será ampliado e vai demorar um tempo para descobrir o porquê

Este artigo realmente explaines-lo bem, Erlang é melhor quando estamos enviando pequenos pedaços de dados arround e MPI faz muito melhor em coisas mais complexas. Também o modelo de Erlang é fácil de entender: -)

Erlang Versus MPI - Resultados Finais e Código Fonte

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top