Quanto è più lento petsc4py vs c / c ++ / fortran?
Mi rendo conto che dipenderà in modo significativo dal codice in esecuzione, ma che dire di qualcosa di semplice come un prodotto a matrice vettoriale?
Quanto è più lento petsc4py vs c / c ++ / fortran?
Mi rendo conto che dipenderà in modo significativo dal codice in esecuzione, ma che dire di qualcosa di semplice come un prodotto a matrice vettoriale?
Risposte:
Questa è una preoccupazione diffusa nella comunità della programmazione scientifica e considererei l'incertezza delle prestazioni come uno dei maggiori "miti" della scienza computazionale.
Come discute da @fcruz , petsc4py
è un wrapper per le librerie PETSc, non una reimplementazione di PETSc in Python. Pertanto, è possibile aspettarsi che eventuali penali delle prestazioni provengano dalla copia di array da e verso PETSc o dall'overhead nelle chiamate del codice / funzione del driver. petsc4py
è implementato con molta attenzione e fintanto che capisci ilnumpy
interfacce array multidimensionali, è possibile evitare l'overhead della copia. Per la maggior parte dei casi d'uso in cui lavoro, la penalità prestazionale nel lavorare in Python è dell'ordine del 10-40%, e spesso guadagno sostanzialmente in altri modi che compensano più di questo successo. In effetti, molti altri sviluppatori esperti di HPC Python con cui ho parlato sostengono che questa differenza di prestazioni di solito può essere ulteriormente ridotta, e quando Python sta guidando codici computazionalmente costosi, questo sarà certamente il caso.
Il petsc4py
repository stesso presenta una serie di esempi utili per illustrare il compromesso prestazioni / flessibilità. Cerca nel petsc4py
repository di origine la demo chiamata perftest
, che risolve un sistema non lineare di equazioni usando sia un driver Python che un driver C (su un kernel Fortran fornito App.f90
in quella directory). Il sovraccarico di prestazioni qui è dell'ordine del 10%.
Come esempio concreto, faccio parte di un team di scienziati che lavorano su PyClaw , un pacchetto software che si interfaccia con PETSc per la gestione della griglia parallela e legami Fortran legacy per risolvere i problemi di Riemann sulle interfacce cellulari. Abbiamo condotto uno studio abbastanza accurato sul degrado delle prestazioni dal passaggio da un driver Fortran e puoi vedere i risultati in fondo a pagina 5 nella Tabella 1 del documento della conferenza . Nel nostro caso, abbiamo scambiato un po 'di prestazioni on-core per la capacità di interfacciare facilmente il nostro codice con PETSc e Fortran e di funzionare in modo efficiente in parallelo su decine di migliaia di core.
App.f90
sorgente in perftest
). Non vi sono differenze di prestazioni nell'I / O. Hai esaminato FEniCS per un pacchetto di livello superiore?
Petsc4py è solo un altro modo per accedere a PETSc ma da Python , o è lo stesso per dire che, petsc4py fornisce i collegamenti in modo che, da Python, sia possibile accedere alle strutture di dati PETSc e alle routine che hanno lo scopo di ridurre lo sforzo di sviluppo di solutori PDE paralleli (quella scala).
PETSc offre diversi livelli di astrazione ai loro risolutori e puoi persino usare PETSc per implementare il tuo solutore. Al livello più basso di astrazione del software, PETSc utilizza BLAS, LAPACK e MPI, e nella migliore delle ipotesi sarà veloce quanto l'implementazione di questi.
Ora pets4py utilizza cython per implementare i collegamenti a PETSc. Il sovraccarico dell'utilizzo del cython è relativo alla quantità di calcoli che verranno eseguiti dalla PETSc. Se usi i solutori PDE di alto livello di PETSc, i costi generali dovrebbero essere abbastanza piccoli da non doverti preoccupare di loro.
Una domanda forse più importante del confronto delle prestazioni di PETSc vs GEMV è se PETSc è lo strumento giusto per il tuo lavoro. Se devi implementare solutori PDE paralleli non banali, molto probabilmente PETSc ti aiuterà davvero. Tuttavia, se è necessario eseguire un gruppo di GEMV, si desidera una libreria BLAS. In bocca al lupo!