2009-12-09 11 views
-1

Je suis à la recherche d'un framework/d'une approche pour faire des messages en passant le calcul distribué en C++.Calcul distribué simple (similaire à la sommation) (en C++)

J'ai actuellement un algorithme itératif à un seul thread qui met à jour de manière incrémentielle un modèle de données. Les mises à jour sont littéralement additives, et j'aimerais distribuer (ou au moins paralléliser) le calcul sur autant de machines + coeurs que possible. Le modèle de données peut être vu comme un grand tableau de valeurs à virgule flottante (indépendantes). Comme les mises à jour sont toutes additives (c'est-à-dire commutatives et associatives), il est possible de fusionner les mises à jour d'autres nœuds dans un ordre arbitraire ou même de mettre à jour par lots. Quand il s'agit de en appliquant les mises à jour, le paradigme map/reduce fonctionnerait bien. Par contre, les mises à jour sont calculées par rapport à l'état actuel du modèle. Chaque étape «corrige» un défaut, il est donc important que le modèle utilisé pour le calcul de la mise à jour soit le plus frais possible (plus le modèle est démodé, moins la mise à jour est utile). Dans le pire des cas, les mises à jour sont entièrement dépendantes, et le parallélisme ne sert à rien.

Je n'ai jamais implémenté quoi que ce soit de manière flexible, mais cela semble être un candidat idéal. Donc, je cherche un cadre ou une approche pour distribuer les mises à jour (qui consistent principalement en des nombres à virgule flottante et quelques index dans le tableau pour identifier où ajouter la mise à jour). Mais, je ne suis pas sûr de savoir comment:

  • Je peux diffuser des mises à jour à tous les processus connectés. Mais cela signifie un trafic réseau énorme, donc je devrais réalistement mettre à jour par lots; et les mises à jour seront moins courantes. Cela ne semble pas évolutif de toute façon.
  • Je peux faire une sorte de topologie en anneau. Fondamentalement, une machine envoie à la machine suivante la somme de ses propres mises à jour et celles de ses prédécesseurs. Mais alors je devrais comprendre comment pas mises à jour en double, après tout, l'anneau est circulaire et finalement ses propres mises à jour arriveront dans le cadre de la somme de ses prédécesseurs.
  • ou une sorte de structure arborescente ...

Pour récapituler, pour obtenir des performances de convergence décent, une faible latence est critique; Plus la mise à jour et l'application de mise à jour sont longues, moins la mise à jour est utile. Les mises à jour doivent être distribuées à tous les nœuds le plus rapidement possible; mais en raison de la nature commutative et associée des mises à jour, peu importe que ces mises à jour soient diffusées individuellement (probablement inefficaces) ou qu'elles arrivent dans le cadre d'un lot fusionné.

Est-ce que quelqu'un connaît des cadres ou des approches existants pour accélérer le développement? Ou même juste des pointeurs généraux? Je n'ai jamais rien fait de tel ...

Répondre

3

Vous voulez probablement MPI (Message Passing Interface). C'est essentiellement la norme de l'industrie pour l'informatique distribuée. Il existe de nombreuses implémentations, mais je recommanderais OpenMPI car il est à la fois gratuit et très apprécié. Il vous fournit une API C pour transmettre des messages entre les nœuds, et fournit également des fonctionnalités de niveau supérieur telles que broadcast, all-to-all, réduire, scatter-gather, etc. Il fonctionne sur TCP, ainsi que plus rapidement et moins longtemps interconnexions comme Infiniband ou Myrinet, et prend en charge diverses topologies.

Il existe également un wrapper Boost autour de MPI (Boost.MPI) qui vous offrira une interface plus conviviale en C++.

+0

Cela ressemble à un démarrage technique raisonnable. Je suppose que l'aspect traitement par lots/fusion n'est pas un problème résolu? –