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 ...
Cela ressemble à un démarrage technique raisonnable. Je suppose que l'aspect traitement par lots/fusion n'est pas un problème résolu? –