Pergunta

Eu estou trabalhando em um cluster de baixo acoplamento para um processamento de dados. O código de código de rede e processamento é no lugar, mas estamos avaliando diferentes metodologias na nossa abordagem. Agora, como nós devemos ser, nós somos I / O ligado em questões de desempenho, e nós estamos tentando diminuir esse gargalo. Obviamente, mais rápido muda como Infiniband seria fantástico, mas não podemos dar ao luxo de simplesmente jogar fora o que temos e recebendo novos equipamentos.

A minha pergunta que se coloca é esta. Todos os aplicativos HPC tradicionais e sério feito em clusters é tipicamente implementado com a passagem de mensagens contra o envio de mais de soquetes diretamente. Quais são os benefícios de desempenho para isso? Que se ver um aumento de velocidade se mudado de soquetes?

Foi útil?

Solução

MPI uso poderia soquetes. Mas há também a implementação MPI para ser usado com SAN (rede de área de sistema) que usam memória compartilhada distribuída direta. Isso, claro, se você tem o hardware para isso. Então MPI permite que você use esses recursos no futuro. Naquele caso, você pode obter melhorias de desempenho maciços (na minha experiência com clusters de backup em tempo de universidade, você pode alcançar ganhos de algumas ordens de magnitude). Então, se você está escrevendo código que pode ser portado para conjuntos mais sofisticados, utilizando MPI é uma idéia muito boa.

Mesmo descartando problemas de desempenho, utilizando MPI pode poupar muito tempo, que você pode usar para melhorar o desempenho de outras partes de seu sistema ou simplesmente salvar sua sanidade.

Outras dicas

Eu recomendaria usar MPI, em vez de rolar seus próprios, a menos que você é muito bom nesse tipo de coisa. Tendo escreveu algumas aplicações de computação-esque distribuídos usando meus próprios protocolos, eu sempre encontrar-me reproduzir (e mal reproduzindo) características encontradas dentro MPI.

Em termos de desempenho Eu não esperaria MPI para lhe dar qualquer speedups rede tangíveis - ele usa soquetes assim como você. MPI vai, porém, fornecer-lhe muito a funcionalidade que você precisa para gerenciar muitos nós, sincronização ou seja, entre os nós.

O desempenho não é a única consideração neste caso, mesmo em clusters de alto desempenho. MPI oferece uma API padrão, e é "portátil". É relativamente trivial para mudar uma aplicação entre as diferentes versões do MPI.

implementações

A maioria MPI usar soquetes de comunicação baseado em TCP. Há boas chances de que qualquer implementação MPI será melhor otimizado e fornecer passagem de mensagens mais rápido, do que uma aplicação cultivado em casa usando soquetes diretamente.

Além disso, você deve sempre ter a chance de executar seu código em um cluster que tem InfiniBand, a camada MPI vai abstract qualquer uma dessas alterações no código. Esta não é uma vantagem trivial - codificação de um aplicativo para usar diretamente OFED (ou outro IB Verbos) implementação é muito difícil.

aplicações

A maioria MPI incluem pequenos aplicativos de teste que podem ser usados ??para verificar a regularidade da configuração de rede independente de sua aplicação. Esta é uma grande vantagem quando se trata tempo para depurar seu aplicativo. O padrão MPI inclui as interfaces "PMPI", para perfilar as chamadas MPI. Esta interface também permite que você facilmente adicionar somas de verificação, ou outra verificação de dados para todas as rotinas de passagem de mensagens.

MPI tem a vantagem de que você pode fazer comunicações coletivas. Fazendo transmissões / reduções em O (log p) / * p é o número de processadores * / em vez de O (p) é uma grande vantagem.

Eu vou ter que concordar com OldMan e freespace. A menos que você sabe de um específico e melhoria para alguns útil métrica (desempenho, facilidade de manutenção, etc.) sobre MPI, por que reinventar a roda. MPI representa uma grande quantidade de conhecimento compartilhado sobre o problema que você está tentando resolver.

Há um grande número de questões que você precisa para o endereço que está além de apenas o envio de dados. configuração e manutenção da conexão vai todos se tornam sua responsabilidade. Se MPI é a abstração exato (que soa como ele é) que você precisa, usá-lo.

No mínimo, usando MPI e mais tarde refatoração-lo para fora com o seu próprio sistema é uma abordagem boa custando a instalação ea dependência de MPI.

Eu gosto especialmente o ponto de OldMan que MPI lhe dá muito mais além da comunicação de soquete simples. Você começa uma série de paralelos e distribuídos implementação de computação com uma abstração transparente.

Message Passing é um paradigma não é uma tecnologia. Na instalação mais geral, MPI vai usar soquetes para se comunicar. Você podia ver uma velocidade de até mudando para MPI, mas apenas na medida em que você não tem otimizado a sua comunicação socket.

Como é a sua aplicação I / O ligado? É obrigado a transferir os blocos de dados para os nós de trabalho, ou é ligado por causa da comunicação durante a computação?

Se a resposta é "por causa da comunicação", então o problema é que você está escrevendo um aplicativo firmemente acoplado e tentar executá-lo em um cluster projetado para tarefas de baixo acoplamento. A única maneira de desempenho ganho será para ficar melhor hardware (mais rápido muda, infiniband, etc.) ... talvez você poderia pedir tempo em alguém é HPC?

Se a resposta for "bloco de dados" transferências em seguida, considerar a atribuição de trabalhadores vários blocos de dados (para que fiquem ocupados mais tempo) e comprimir os blocos de dados antes da transferência. Esta é uma estratégia que pode ajudar em uma aplicação de baixo acoplamento.

Eu não usei MPI, mas eu usei soquetes um pouco. Há algumas coisas a considerar em soquetes de alto desempenho. Você está fazendo muitos pequenos pacotes, ou grandes pacotes? Se você está fazendo muitos pequenos pacotes considerar desligar o algoritmo Nagle para uma resposta mais rápida:

setsockopt (m_socket, IPPROTO_TCP, TCP_NODELAY, ...);

Além disso, usando sinais podem realmente ser muito mais lento ao tentar obter um grande volume de dados através de. Há muito tempo eu fiz um programa de teste onde o leitor iria esperar por um sinal, e ler um pacote - que se daria um ataque 100 pacotes / seg. Então eu apenas fiz o bloqueio lê, e tem 10000 leituras / seg.

O ponto é olhar para todas estas opções, e realmente testá-los. Diferentes condições fará com que diferentes técnicas mais rápido / mais lento. É importante não apenas obter opiniões, mas para colocá-los à prova. Steve Maguire fala sobre isso em "Escrever Sólidos Code". Ele usa muitos exemplos que são contra-intuitivo, e testes-los a descobrir o que faz melhor / mais rápido do código.

MPI usa soquetes embaixo, então realmente a única diferença deve ser a API que suas interfaces de código com. Você pode ajustar o protocolo se você estiver usando soquetes diretamente, mas é sobre ele. O que exatamente você está fazendo com os dados?

MPI usa soquetes, e se você sabe o que você está fazendo, você provavelmente pode obter mais largura de banda fora de tomadas, porque você não precisa enviar como meta dados muito.

Mas você tem que saber o que está fazendo e é provável que seja mais propenso a erros. essencialmente você estaria substituindo MPI com seu próprio protocolo de mensagens.

Para alto volume, baixo overhead negócios Mensagens que você pode querer verificar para fora OAMQ com vários produtos. O código aberto variante OpenAMQ supostamente corre o comercial do JP Morgan, por isso deve ser confiável, não deveria?

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