Question

Je développe une application scientifique utilisée pour effectuer des simulations physiques. Les algorithmes utilisés sont O (n3). Par conséquent, le traitement d’un grand ensemble de données est très long. L’application exécute une simulation en environ 17 minutes et je dois exécuter environ 25 000 simulations. Cela représente environ un an de temps de traitement.

La bonne nouvelle est que les simulations sont complètement indépendantes les unes des autres. Je peux donc facilement modifier le programme pour répartir le travail sur plusieurs ordinateurs.

Je peux voir plusieurs solutions pour implémenter ceci:

  • Procurez-vous un ordinateur multicœur et répartissez le travail entre tous les cœurs. Pas assez pour ce que je dois faire.
  • Ecrivez une application qui se connecte à plusieurs "traitements". serveurs et répartir la charge entre eux.
  • Obtenez un cluster d'ordinateurs Linux bon marché et demandez au programme de tout traiter comme une entité unique.

L’option numéro 2 est relativement facile à mettre en oeuvre. Je ne cherche donc pas beaucoup de suggestions sur la façon de le mettre en œuvre (peut être fait simplement en écrivant un programme qui attend les paramètres sur un port donné, traite les valeurs et renvoie le résultat sous forme de fichier sérialisé). Ce serait un bon exemple de Grid Computing .

Cependant, je me demande quelles sont les possibilités de la dernière option, un cluster traditionnel. Est-il difficile d'exécuter un programme Java dans une grille Linux? Tous les ordinateurs séparés seront-ils traités comme un seul ordinateur à plusieurs cœurs, facilitant ainsi l’adaptation du programme? Y at-il de bons indicateurs de ressources qui me permettraient de commencer? Ou je fais cela trop compliqué et je suis mieux avec l'option numéro 2?

EDIT: Comme information supplémentaire, je suis intéressé par la mise en oeuvre de quelque chose comme décrit dans cet article de Wired Magazine: Scientific a remplacé un superordinateur par un cluster linux Playstation 3 . Définitivement le numéro deux semble être la voie à suivre… mais le facteur fraîcheur.

EDIT 2: le calcul est très lié au processeur. Fondamentalement, il y a beaucoup d'opérations sur les grandes matrices, telles que l'inverse et la multiplication. J'ai essayé de rechercher de meilleurs algorithmes pour ces opérations, mais jusqu'à présent, j'ai constaté que les opérations dont j'avais besoin étaient 0 (n3) (dans les bibliothèques normalement disponibles). L'ensemble de données est volumineux (pour de telles opérations), mais il est créé sur le client en fonction des paramètres d'entrée.

Je vois maintenant que j'avais un malentendu sur le fonctionnement d'un cluster d'ordinateur sous Linux. J'avais supposé que cela fonctionnerait de telle sorte qu'il semblerait simplement que tous les processeurs de tous les ordinateurs soient disponibles, comme si vous aviez un ordinateur à plusieurs cœurs, mais cela ne semble pas être le cas. Il semble que tous ces supercalculateurs fonctionnent avec des nœuds exécutant des tâches distribuées par une entité centrale et qu’il existe plusieurs bibliothèques et progiciels différents qui permettent d’effectuer facilement cette distribution.

La question devient alors, car le numéro 3 n'existe pas, la question suivante: quel est le meilleur moyen de créer une application java en cluster?

Était-ce utile?

La solution

Je recommande vivement le Java Parallel Processing Framework, surtout que vos calculs sont déjà indépendants. J'ai fait un bon travail avec ce premier cycle et cela fonctionne très bien. Le travail de mise en œuvre est déjà fait pour vous, donc je pense que c’est un bon moyen d’atteindre l’objectif de "numéro 2".

http://www.jppf.org/

Autres conseils

Le numéro 3 n'est pas difficile à faire. Cela nécessite de développer deux applications distinctes, le client et le superviseur. Le client est à peu près ce que vous avez déjà, une application qui exécute une simulation. Cependant, il doit être modifié pour se connecter au superviseur à l'aide de TCP / IP ou autre et demander un ensemble de paramètres de simulation. Il exécute ensuite la simulation et renvoie les résultats au superviseur. Le superviseur écoute les demandes des clients et pour chaque demande, obtient une simulation non allouée d'une base de données et met à jour la base de données pour indiquer que l'élément est alloué mais non terminé. Lorsque la simulation est terminée, le superviseur met à jour la base de données avec le résultat. Si le superviseur stocke les données dans une base de données réelle (MySql, etc.), la base de données peut être facilement interrogée pour connaître l'état actuel des simulations. Cela devrait aller jusqu'au point où le temps nécessaire pour fournir les données de simulation à tous les clients est égal au temps requis pour effectuer la simulation.

Le moyen le plus simple de distribuer l’informatique sur un cluster Linux consiste à utiliser MPI. Je vous suggère de télécharger et de regarder MPICH2. C'est gratuit. leur page d'accueil est ici

Si vos simulations sont complètement indépendantes, vous n’avez pas besoin de la plupart des fonctionnalités de MPI. Vous devrez peut-être écrire quelques lignes en C pour vous connecter à MPI et lancer l'exécution de votre script ou programme Java.

Vous devriez consulter la Hazelcast , la solution de clustering peer2peer (pas de serveur centralisé) la plus simple pour Java. Essayez Hazelcast Distributed ExecutorService pour exécuter votre code sur le cluster.

Cordialement,

-talip

Vous l'avez déjà suggéré, mais vous l'avez disqualifié: multi-cœurs. Vous pouvez opter pour plusieurs noyaux, si vous avez assez de noyaux. Un sujet d'actualité intéressant est l'informatique GPGPU. Esp. NVIDIAs CUDA est une approche très prioritaire si vous avez plusieurs tâches indépendantes qui doivent faire le même calcul. Une GTX 280 vous fournit 280 cœurs, qui peuvent calculer simultanément jusqu'à 1120 - 15360 threads. Une paire d'entre eux pourrait résoudre votre problème. Si sa mise en œuvre dépend vraiment de votre algorithme (flux de données par rapport au flux de contrôle), tous les processeurs scalaires fonctionnent de manière SIMD.

Inconvénient: ce serait C / C ++, pas Java

Dans quelle mesure vos algorithmes sont-ils optimisés? Utilisez-vous des bibliothèques BLAS natives? Vous pouvez obtenir un gain de performances d'un ordre de grandeur en passant de bibliothèques naïves à des bibliothèques optimisées. Certains, comme ATLAS, répartiront automatiquement les calculs sur plusieurs processeurs d’un système, ce qui couvrira automatiquement la puce 1.

Les groupes AFAIK ne sont généralement pas traités comme une seule entité. Ils sont généralement traités en tant que nœuds distincts et programmés avec des éléments tels que MPI et SCALAPACK pour distribuer les éléments des matrices sur plusieurs nœuds. Cela ne vous aidera pas vraiment beaucoup si votre ensemble de données tient de toute façon dans la mémoire d'un noeud.

Avez-vous consulté Terracotta ?

Pour la répartition du travail, vous voudrez utiliser le cadre maître / travailleur .

Il y a dix ans, la société pour laquelle je travaillais envisageait une solution de virtualisation similaire. À l'époque, Sun, Digital et HP la prenaient en charge, mais uniquement avec des supercalculateurs à la pointe de la technologie avec échange dynamique en matériel et similaire. Depuis lors, j’ai entendu dire que Linux prenait en charge le type de virtualisation que vous recherchiez pour la solution n ° 3, mais je ne l’ai jamais utilisée moi-même.

Primitives et performances Java

Toutefois, si vous effectuez des calculs matriciels, vous souhaitez les effectuer en code natif, et non en Java (en supposant que vous utilisez des primitives Java). En particulier, les erreurs de cache sont très coûteuses, et l’entrelacement dans vos tableaux tue les performances. Des morceaux de mémoire non entrelacés dans vos matrices et votre code natif vous permettront de gagner le plus de temps possible sans matériel supplémentaire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top