2010-12-12 10 views
1

J'ai récemment rencontré un problème avec mon programme parallèle. Chaque processus a plusieurs hashtables glib qui doivent être échangés avec d'autres processus, ces hashtables peuvent être assez grands. Quelle est la meilleure approche pour y parvenir?envoyer une hashtable glib avec MPI

  • create dérivés datatype
  • utilisation pack mpi et déballer
  • envoyer la clé valeur & sous forme de tableaux (problème, étant donné que nombre d'éléments ne sont pas connus au moment de la compilation)

Je n'ai pas utilisé 1 & 2 avant et ne sais même pas si c'est possible, c'est pourquoi je vous demande les gars ..

+0

Vous pouvez également étudier l'accès à la mémoire d'un seul côté, tel qu'il est implémenté dans MPI-2. J'insiste sur le mot "pourrait". –

Répondre

2

Pack/unpack crée une copie de vos données: si vous Les cartes sont grandes, vous aurez envie d'éviter cela. Cela exclut également votre 3ème option.

Vous pouvez en effet définir un type de données personnalisé, mais ce sera un peu compliqué. Voir la fin de this answer pour un exemple (en remplaçant "graphe" par "carte" et "noeud" par "paire" en lisant). Je vous suggère read up sur ces sujets pour obtenir une bonne compréhension de ce que vous devez faire.

Que le nombre d'éléments n'est pas connu au moment de la compilation ne devrait pas être un vrai problème. Vous pouvez simplement envoyer un message contenant la taille de la charge utile avant d'envoyer le contenu de la carte. Cela permettra au processus de réception d'allouer juste assez de mémoire pour le tampon de réception.

Vous pouvez également envisager d'imprimer simplement le contenu de vos cartes dans des fichiers, puis de faire en sorte que les processus lisent les résultats des autres. C'est beaucoup plus simple, mais aussi moins élégant et beaucoup plus lent que le passage de message.