je le code de test qui effectue les opérations suivantes:barrière MPI ne bloque pas écriture de fichiers, chasse d'eau et os.fsync
Ecrire un message de test à un fichier> Barrière> Lire le message de test> Affirmer égal> Répéter.
from __future__ import print_function
import os
from mpi4py import MPI
comm = MPI.COMM_WORLD
rank = comm.Get_rank()
loop = True
def main():
global loop
txt_write = 'buhahaha'
with open('test', 'w') as f1:
if rank == 0:
f1.write(txt_write)
f1.flush()
os.fsync(f1.fileno())
comm.barrier()
with open('test') as f2:
txt_read = f2.read()
try:
assert txt_read == txt_write
except:
print("Assertion error", txt_read, "!=", txt_write, 'rank=', rank)
loop = False
finally:
comm.barrier()
if rank == 0:
os.remove('test')
if __name__ == '__main__':
i = 0
while loop:
main()
if i % 1000 == 0 and rank == 0:
print("Iterations:", i)
i += 1
Il fonctionne pour quelques 100 ou 1000 itérations, mais à un moment donné, il lit un fichier vide et l'assertion échoue. D'autres réponses avaient recommandé l'utilisation de flush
et os.fsync
, mais cela ne semble pas aider - cela rend l'exécution plus lente. Une idée de comment résoudre ce problème?
Qu'est-ce que le système de fichiers utilisez-vous? Est-ce un seul noeud ou un cluster? – Zulan
L'ouverture d'un fichier en écriture n'est-elle généralement pas tronquée pour être vide? Donc, vos threads ne courent-ils pas entre la plupart d'entre eux en les tronquant pour être vides et l'un tronque-t-il en y écrivant une chaîne? – jschultz410
@zulan ext4 filesytem sur linux. J'ai couru ce code avec 2 processus sur un poste de travail. – jadelord