Nel mio programma sto simulando un sistema N-body per un gran numero di iterazioni. Per ogni iterazione produco un insieme di coordinate 6N che devo aggiungere a un file e quindi utilizzare per eseguire l'iterazione successiva. Il codice è scritto in C++ e attualmente utilizza il metodo write()
per scrivere i dati in formato binario ad ogni iterazione.Il modo più veloce per scrivere dati durante la produzione
Non sono un esperto in questo campo, ma mi piacerebbe migliorare questa parte del programma, poiché sono in procinto di ottimizzare l'intero codice. Sento che la latenza associata alla scrittura del risultato del calcolo ad ogni ciclo rallenta significativamente le prestazioni del software.
Sono confuso perché non ho esperienza di programmazione parallela e I/O di file di basso livello. Ho pensato di alcune tecniche astratte che ho immaginato avrei potuto realizzare, dal momento che sono la programmazione per la moderna (possibilmente multi-core) macchine con sistemi operativi Unix:
- Scrittura dei dati nel file in blocchi di n iterazioni (sembra ci essere modi migliori per procedere ...)
- parallelizzare il codice con OpenMP (come implementare effettivamente un buffer in modo che i fili sono sincronizzati in modo appropriato, e non si sovrappongono?)
- Uso
mmap
(la dimensione del file potrebbe essere enorme, nell'ordine dei GB, questo approccio è abbastanza robusto?)
Tuttavia, non so come implementarli al meglio e combinarli in modo appropriato.
Qual è la tua domanda? –
"Sento che la latenza associata alla scrittura del risultato del calcolo in ogni ciclo rallenta significativamente le prestazioni del software." lo senti o hai profilato il tuo codice? –
Hai profilato il codice per assicurarti che i tuoi sentimenti riguardo alla latenza siano corretti? – Grizzly