Pergunta

Estou desenvolvendo uma aplicação científica utilizada para realizar simulações físicas. Os algoritmos utilizados são O (N3), assim, para um grande conjunto de dados que ele demora muito tempo a ser processado. O aplicativo executa uma simulação em cerca de 17 minutos, e eu tenho que correr cerca de 25.000 simulações. Isso é cerca de um ano de tempo de processamento.

A boa notícia é que as simulações são completamente independentes um do outro, para que eu possa facilmente mudar o programa para distribuir o trabalho entre vários computadores.

Existem várias soluções que eu posso ver para implementar esta:

  • Obter um computador multi-core e distribuir o trabalho entre todos os núcleos. Não o suficiente para o que eu preciso fazer.
  • Escreva um aplicativo que se conecta a múltiplos "processamento" servidores e distribuir a carga entre eles.
  • Obter um conjunto de computadores Linux baratos, e têm a tudo programa de tratamento como uma única entidade.

A opção número 2 é relativamente fácil de implementar, de modo que eu não olho muito para sugestões de como implementar este (pode ser feito apenas por escrever um programa que espera em um determinado porto para os parâmetros, processa os valores e retorna o resultado como um arquivo serializado). Isso seria um bom exemplo de Grid Computing .

No entanto, gostaria de saber as possibilidades da última opção, um cluster tradicional. Quão difícil é para executar um programa Java em uma grade linux? Será que todos os computadores separados ser tratado como um único computador com vários núcleos, tornando-se assim fácil de adaptar o programa? Existe alguma boa ponteiros para recursos que permitam-me para começar? Ou eu estou fazendo isso mais complicada e eu sou melhor com a opção número 2?

EDIT: como informação extra, Estou interessado em como implementar algo como descrito neste artigo da Wired Magazine: Scientific substituído um supercomputador com um Playstation 3 Linux Cluster . Definitivamente número dois sons como o caminho a percorrer ... mas o fator frieza.

EDIT 2: O cálculo é muito CPU-Bound. Basicamente, há uma série de operações em grandes matrizes, como a inversa e multiplicação. Tentei procurar melhores algoritmos para essas operações, mas até agora eu descobri que as operações que eu preciso são 0 (n3) (Em bibliotecas que estão normalmente disponíveis). O conjunto de dados é grande (para essas operações), mas é criado no cliente com base nos parâmetros de entrada.


Eu vejo agora que eu tinha um mal-entendido sobre a forma como um cluster computador sob linux trabalhou. Eu tive a suposição de que ele iria trabalhar de tal forma que ele só iria parecer que você teve todos os processadores em todos os computadores disponíveis, assim como se você tivesse um computador com vários núcleos, mas que não parece ser o caso. Parece que todos esses supercomputadores trabalhar por ter os nós que executam tarefas distribuídas por alguma entidade central, e que há várias diferentes bibliotecas e pacotes de software que permitem realizar esta distribuição com facilidade.

Portanto, a questão torna-se realmente, como não há tal coisa como número 3, para: Qual é a melhor maneira de criar um aplicativo java cluster

?
Foi útil?

Solução

Eu muito recomendo o Java Parallel Processing Framework especialmente porque seus cálculos já são independentes. Eu fiz um bom bocado de trabalho com esta graduação e ele funciona muito bem. O trabalho de fazer a implementação já é feito para você, então eu acho que isso é uma boa maneira de atingir a meta em "número 2".

http://www.jppf.org/

Outras dicas

Número 3 não é difícil de fazer. Ele requer o desenvolvimento de duas aplicações distintas, o cliente eo supervisor. O cliente é muito bonito o que você já tem, uma aplicação que roda uma simulação. No entanto, ele precisa de alterar de forma que ele se conecta ao supervisor usando TCP / IP ou o que quer e pede um conjunto de parâmetros de simulação. Em seguida, executa a simulação e envia os resultados de volta para o supervisor. O supervisor escuta as solicitações dos clientes e por cada pedido, recebe uma simulação não alocado a partir de um banco de dados e atualiza o banco de dados para indicar o item é alocado, mas inacabado. Quando a simulação for concluída, o supervisor atualiza o banco de dados com o resultado. Se as lojas supervisor os dados em um banco de dados real (MySql, etc), então o banco de dados pode ser facilmente consultado para o estado atual das simulações. Isso deve ser bem dimensionada até o ponto onde o tempo necessário para fornecer os dados de simulação para todos os clientes é igual ao tempo necessário para executar a simulação.

Mais simples maneira de distribuir computação em um cluster Linux é usar MPI. Eu sugiro que você faça o download e olhada MPICH2. É grátis. sua home page é aqui

Se suas simulações são completamente independentes, você não precisa mais das características do MPI. Você pode ter que escrever algumas linhas de C para a interface com MPI e pontapé de saída execução do seu programa ou script Java.

Você deve verificar se Hazelcast solução, peer2peer mais simples (servidor não centralizada) aglomerando para Java. Tente Hazelcast ExecutorService distribuída para a execução de seu código no cluster.

Saudações,

-talip

Você já foi sugerido, mas desclassificado-lo: núcleos multi. Você poderia ir para multi core, se você tivesse núcleos suficientes. Um tema quente atm é GPGPU computação. Esp. Nvidias CUDA é uma abordagem muito priomising se você tiver muitos tarefa independente que tem que fazer o mesmo cálculo. A GTX 280 oferece-lhe 280 núcleos, que podem calcular até 1120 - 15360 tópicos simultanously. Um par deles poderia resolver seu problema. Se a sua realmente implementável depende do seu algoritmo (fluxo de dados vs. fluxo de controle), porque todos os processadores escalares funcionam de forma SIMD.

Drawback: seria C / C ++, não java

Como otimizado são seus algoritmos? Você está usando BLAS bibliotecas nativas? Você pode obter cerca de uma ordem de magnitude ganho de desempenho, passando de bibliotecas ingênuo aqueles otimizados. Alguns, como ATLAS também vai se espalhar automaticamente os cálculos sobre múltiplas CPUs em um sistema, de modo que as tampas bala 1 automaticamente.

aglomerados AFAIK normalmente não são tratados como uma única entidade. Eles são geralmente tratados como nós separados e programado com o material como MPI e SCALAPACK para distribuir os elementos de matrizes para múltiplos nodos. Isto realmente não ajudá-lo a tudo o que muito se seu conjunto de dados pode guardar na memória em um nó de qualquer maneira.

Você já olhou para Terracotta ?

Para a distribuição do trabalho que você vai querer usar a estrutura Master / Worker .

anos Dez atrás, a empresa que eu trabalhava olhou para uma solução de virtualização semelhante, e Sun, Digital e HP todos suportados no momento, mas apenas com supercomputadores state-of-the-art com hotswap hardware e similares. Desde então, eu ouvi Linux suporta o tipo de virtualização que você está procurando para solução # 3, mas eu nunca usei isso mesmo.

Java primitivos e desempenho

No entanto, se você fizer os cálculos de matrizes que você gostaria de fazê-los em código nativo, não em Java (supondo que você está usando primitivos Java). Especialmente cache misses são muito caros, e intercalação em suas matrizes vai matar o desempenho. pedaços de memória não-intercalados em suas matrizes e código nativo, poderá ir a maior parte do aumento de velocidade sem necessidade de hardware adicional.

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