In MPI 2 können Sie nicht wirklich atomare Operationen durchführen. Dies wird in MPI 3 unter Verwendung von MPI_Fetch_and_op
eingeführt. Aus diesem Grund werden Ihre kritischen Daten geändert.
Darüber hinaus vorsichtig mit `MPI_Win_lock '. Wie beschrieben here:
Der Name dieser Routine ist irreführend. Insbesondere muss diese Routine nicht blockiert werden, außer wenn der Zielprozess der aufrufende Prozess ist.
Der eigentliche Blockprozess ist MPI_Win_unlock
, dass Sie sicher sein können, erst nach dieser Prozedur zurückkehrt bedeutet, dass die Werte von put
und get
korrekt sind. Vielleicht ist dies besser here beschrieben:
MPI passives Ziel Operationen organisiert werden in dem Zugang Epochen, die von MPI Win Lock und MPI Win klammert werden die Anrufe entsperren. Kluge MPI-Implementierungen [10] werden alle Datenbewegungsoperationen (puts, gets und accumulate) in einer Netzwerktransaktion kombinieren, die beim Entsperren auftritt.
Das gleiche Dokument kann auch eine Lösung für Ihr Problem bieten, das heißt, dass kritische Daten nicht atomar geschrieben werden. Dies geschieht durch die Verwendung eines Mutex, ein Mechanismus, der sicherstellt, dass nur ein Prozess auf Daten zu der Zeit zugreifen kann.
Ich empfehle Ihnen, dieses Dokument zu lesen: Die Lösung, die sie vorschlagen, ist nicht schwer zu implementieren.