2010-05-25 8 views
2

Existe-t-il un moyen facile d'implémenter des opérations entières atomiques (unilatérales) dans mpi? La dernière fois que j'ai regardé il y a trois ans, l'exemple dans le livre mpi était assez complexe à mettre en œuvre.mpi atomique lire/modifier/écrire

Répondre

0

Je ne pense pas. Une partie du problème est que la plupart des plates-formes (combinaison de matériel, o/s, bibliothèques, etc.) n'offrent pas de garanties d'atomicité pour les opérations entières lorsque des processus concurrents sont en cours d'exécution. Et MPI semble fonctionner de la même manière.

0

Il est impossible d'implémenter une opération de lecture/modification/écriture unilatérale "atomique" de cas en utilisant MPI.

Pour les opérations entre noeuds, il est impossible d'utiliser des interconnexions communes pour se rapprocher d'une opération "atomique". La couche TCP/IP ne peut effectuer aucune opération atomique. Une structure IBV implique des couches de bibliothèques et un module noyau vers une HCA locale, un chemin à travers un ou plusieurs commutateurs, un autre HCA avec un module noyau et plusieurs couches de bibliothèques de l'autre côté.

Pour les opérations entre les rangs sur le même nœud, si vous avez besoin d'une garantie de "atomique" pour les opérations sur un nombre entier unique, la mémoire partagée est l'outil approprié à utiliser, MPI ne l'est pas.

+0

Il existe un support des opérations atomiques dans certaines interconnexions: Infiniband ("InfiniBand fournit deux types d'opérations RMW atomiques: - L'opération Atomic Fetch and Add - Atomic Compare and Swap If" - http://books.google.com/books? id = 4s0BNIxPsdIC & pg = PA95 – osgx

+0

Il est vrai que la spécification IBV prend en charge les opérations atomiques - cependant, de nombreuses versions populaires des implémentations populaires ne supportent pas cette fonctionnalité.Mais je déclare que de la «porte d'entrée» d'une bibliothèque MPI L'appel MPI lui-même aura probablement plusieurs couches d'indirection (en fonction de l'implémentation) L'appel de broche, ou copie dans la mémoire pré-épinglée, requise par les interconnexions RDMA empêche efficacement l'intégralité du message. la transmission d'être "atomique". –

2

Le MPI unilatéral est assez complexe, avec environ trois mécanismes différents (plus ou moins deux et demi).

Les deux premiers modes sont la "synchronisation cible active" où la cible (le processus ciblé, celui faisant l'appel unilatéral s'appelle l'origine) déclare explicitement une époque pendant laquelle sa fenêtre (la zone "partagée") est exposée. Vous avez alors une distinction entre cette époque étant collectivement déclaré (MPI_Win_fence) et il est local à un groupe (MPI_Win_start/post/wait/complete appels).

Quelque chose de proche du vrai unilatéral est fait avec les MPI_Win_lock/unlock appels où l'origine verrouille la zone «partagée» sur la cible pour y avoir un accès exclusif. C'est ce que l'on appelle la "synchronisation passive de la cible", car la cible est complètement inconsciente de tout ce qui se passe dans sa zone partagée; cela nécessite un démon ou similaire pour s'exécuter sur la cible.

Jusqu'à présent, l'état de MPI-2. Malheureusement, vous ne pouviez lire ou écrire que les deux dans une période de verrouillage/déverrouillage, de sorte que les opérations de récupération atomique n'étaient pas possibles de manière directe. Cela a été résolu dans MPI-3, qui a l'instruction MPI_Fetch_and_op. Par exemple, si vous utilisez MPI_REPLACE, vous obtenez une lecture de la zone dans la mémoire «partagée» et l'écrasez avec ce que vous spécifiez. Cela suffit pour mettre en œuvre des opérations atomiques.