Lasciami provare a scomporre le tue esigenze:
- manutenibilità
- Lettura / scrittura di dati di testo
- Interfacce / capacità avanzate per le fattorizzazioni LU
- Solutori lineari sparsi
- Prestazioni e scalabilità per dati di grandi dimensioni
Da questo elenco, prenderei in considerazione le seguenti lingue:
C, C ++, Fortran, Python, MATLAB, Java
Julia è una nuova lingua promettente, ma la comunità si sta ancora formando attorno ad essa e non è stata implementata in nessun nuovo importante codice.
Lettura / scrittura di dati di testo
Questo è facile da ottenere in qualsiasi linguaggio di programmazione. Assicurati di eseguire il buffering e la coalescenza appropriati del tuo accesso I / O e otterrai buone prestazioni da qualsiasi delle lingue che dovresti prendere in considerazione. Evita gli oggetti stream in C ++ se non sai come usarli in modo performante.
Interfacce / capacità avanzate per le fattorizzazioni LU
Se si stanno eseguendo fattorizzazioni LU dense, è necessario utilizzare LAPACK o ScaLAPACK / Elemental per funzionalità parallele. LAPACK e ScaLAPACK sono scritti in Fortran, Elemental è scritto in C ++. Tutte e tre le librerie sono performanti, ben supportate e documentate. Puoi interfacciarti da una qualsiasi delle lingue che dovresti considerare.
Solutori lineari sparsi
I principali risolutori lineari sparsi liberamente disponibili sono quasi tutti disponibili tramite PETSc , scritto in C, che è ben documentato e supportato. È possibile interfacciarsi in PETSc da una qualsiasi delle lingue da considerare.
Prestazioni e scalabilità per dati di grandi dimensioni
Gli unici paradigmi di programmazione parallela che menzioni sono basati sulla memoria condivisa, il che significa che non stai prendendo in considerazione un approccio informatico basato su MPI (passaggio di messaggi) e di memoria distribuita. Nella mia esperienza, è molto più semplice scrivere codice che si ridimensiona ben oltre una dozzina di core usando una soluzione di memoria distribuita. Quasi tutti i "cluster" universitari sono basati su MPI in questi giorni, le grandi macchine a memoria condivisa sono costose e di conseguenza rare. Dovresti considerare MPI per il tuo approccio, ma il mio consiglio si applicherà indipendentemente dal paradigma di programmazione che scegli.
Per quanto riguarda le prestazioni sul nodo, se si scrivono routine numeriche da soli, è più semplice ottenere buone prestazioni seriali in Fortran. Se hai un po 'di esperienza in C, C ++ o Python, puoi ottenere prestazioni molto comparabili (C e C ++ sono morti, anche con Fortran, Python e MATLAB arrivano in circa il 25% di tempo in sovraccarico senza molto sforzo). MATLAB lo fa attraverso un compilatore JIT e un'ottima espressività algebrica lineare. Probabilmente dovrai usare i kernel numerici Cython, numpy, numexpr o embed per ottenere le prestazioni dichiarate da Python. Non posso commentare le prestazioni di Java, perché non conosco molto bene la lingua, ma sospetto che non sia lontano da quello di Python se scritto da un esperto.
Una nota sulle interfacce
Spero di averti convinto che sarai in grado di fare tutto ciò che desideri in uno dei linguaggi di programmazione che stai prendendo in considerazione. Se stai usando Java, le interfacce C saranno un po 'impegnative. Python ha un eccellente supporto dell'interfaccia C e Fortran tramite ctypes, Cython e f2py. LAPACK è già confezionato e disponibile tramite scipy. MATLAB ha tutte le funzionalità necessarie nelle sue librerie native, ma non è facilmente scalabile o particolarmente facile da eseguire sui cluster. Java può supportare le interfacce C e Fortran con JNI , ma non si trova comunemente nei cluster e nei software paralleli per il calcolo scientifico.
manutenibilità
Gran parte di questo si ridurrà al gusto personale, ma il consenso generale sulla manutenibilità è che si desidera ridurre al minimo il numero di righe di codice nel proprio software, scrivere codice modulare con interfacce ben definite e, per il software di calcolo, fornire test che verificano la correttezza e la funzionalità dell'implementazione.
Raccomandazione
Io personalmente ho avuto molta fortuna con Python e lo consiglio per molti progetti computazionali. Penso che dovresti prenderlo fortemente in considerazione per il tuo progetto. Python e MATLAB sono probabilmente i linguaggi più espressivi disponibili per il calcolo scientifico. Puoi facilmente interfacciare Python con qualsiasi altro linguaggio di programmazione, puoi usare f2py per racchiudere la tua attuale implementazione Fortran e riscrivere pezzo per pezzo qualunque parte desideri in Python verificando che tu stia mantenendo la funzionalità. In questo momento, consiglierei una combinazione dell'implementazione ufficiale di Python 2.7 con scipy . Puoi iniziare molto facilmente con questo stack dalla distribuzione di Python Enthought disponibile gratuitamente .
Puoi anche fare la maggior parte di questo in C, C ++ o Fortran. C e C ++ sono linguaggi molto interessanti per gli sviluppatori professionisti con molta esperienza, ma spesso inciampano nuovi sviluppatori e in questo senso probabilmente non sono una grande idea per un codice più accademico. Fortran e MATLAB sono popolari nel calcolo accademico, ma sono deboli nelle strutture dati avanzate e nell'espressività offerte da Python (pensate ad un oggetto dict Python, per esempio).
Domande correlate: