Pochissimi sviluppatori di software scientifici comprendono buoni principi di progettazione, quindi mi scuso se questa risposta è un po 'prolissa. Dal punto di vista dell'ingegneria del software, l'obiettivo dello sviluppatore di software scientifico è progettare una soluzione che soddisfi una serie di vincoli che sono spesso in conflitto .
Ecco alcuni esempi tipici di questi vincoli, che potrebbero essere applicati al design della tua libreria di matrici sparse:
- Completato in un mese
- Funziona correttamente sul tuo laptop e su diverse workstation
- Funziona in modo efficiente
Gli scienziati stanno gradualmente prestando maggiore attenzione ad alcuni altri requisiti comuni dell'ingegneria del software:
- Documentazione (guida per l'utente, tutorial, commenti sul codice)
- Manutenibilità (controllo versione, test, design modulare)
- Riutilizzabilità (design modulare, "flessibilità")
Potrebbe essere necessario più o meno uno di questi requisiti. Se stai cercando di vincere un premio Gordon Bell per la performance, anche le frazioni di un percento sono rilevanti e pochi giudici valuteranno la qualità del tuo codice (purché tu possa convincerli che è giusto). Se stai cercando di giustificare l'esecuzione di questo codice su una risorsa condivisa come un cluster o un supercomputer, spesso devi difendere le affermazioni sulle prestazioni del tuo codice, ma raramente sono molto stringenti. Se stai cercando di pubblicare un articolo su un giornale che descrive i miglioramenti delle prestazioni del tuo approccio, allora devi essere legittimamente più veloce dei tuoi concorrenti e il 20% delle prestazioni è un compromesso che farei volentieri per una migliore manutenibilità e riusabilità.
Tornando alla tua domanda, il "buon design", concesso abbastanza tempo di sviluppo, non dovrebbe mai sacrificare le prestazioni. Se l'obiettivo è rendere il codice più veloce possibile, allora il codice dovrebbe essere progettato attorno a tali vincoli. È possibile utilizzare tecniche come la generazione di codice, l'assemblaggio in linea o trarre vantaggio da librerie altamente ottimizzate per la risoluzione del problema.
E se non avessi abbastanza tempo di sviluppo? Cosa c'è di abbastanza buono? Bene, dipende, e nessuno sarà in grado di darti una buona risposta a questa domanda senza più contesto.
FWIW: Se sei veramente interessato a scrivere kernel a matrice sparsa ad alte prestazioni, dovresti confrontarti con un'installazione PETSc ottimizzata e lavorare con il loro team se li stai battendo, sarebbero felici di incorporare i kernel sintonizzati nella libreria.