C ++ moderno nell'informatica scientifica?


22

Sto cercando libri o articoli, o post di blog, o qualsiasi materiale pubblicato in generale, che riguardi specificamente gli usi delle funzionalità moderne del C ++ (spostare la semantica, l'STL, gli iteratori, la valutazione lenta, ecc.) Nell'informatica scientifica. Puoi suggerire qualcuno?

Penso che queste nuove funzionalità renderanno più semplice la scrittura di codice efficiente, ma non ho trovato esempi concreti. La maggior parte dei riferimenti che ho letto riguardano usi generici del C ++ e non contengono esempi di calcolo scientifico. Quindi sto cercando degli esempi (non devono essere esempi di codici di produzione, solo esempi pedagogici, a livello, diciamo, Ricette numeriche) di codice di calcolo scientifico usando le moderne funzionalità di C ++.

Si noti che non sto chiedendo informazioni sulle librerie che utilizzano queste funzionalità. Sto chiedendo articoli / libri / ecc. Spiegando come posso sfruttare queste funzionalità nell'informatica scientifica.


2
Stai chiedendo "moderno" nel senso di ciò che oggi è inteso come la migliore pratica (rispetto a 20 anni fa) o "moderno" nel senso specifico del C ++ 11/14?
Kirill,

2
@Kirill Immagino sia entrambi. Principalmente qualcosa che utilizza C ++ 11/14, ma seguendo le migliori pratiche.
becko,

Risposte:


11

Due esempi di librerie che utilizzano moderni costrutti C ++:

  • Entrambe le librerie di eigen e armadillo (algebra lineare) usano diversi costrutti C ++ moderni. Ad esempio, usano entrambi i modelli di espressione per semplificare le espressioni aritmetiche e talvolta possono eliminare alcuni temporanei:

http://eigen.tuxfamily.org

http://arma.sourceforge.net/

http://hpac.rwth-aachen.de/teaching/sem-accg-14/Armadillo.pdf (presentazione sui modelli di espressione in Armadillo)

  • La libreria CGAL (geometria computazionale) utilizza molte moderne funzionalità C ++ (utilizza fortemente modelli e specializzazioni):

http://www.cgal.org

Nota:

i moderni costrutti C ++ sono molto eleganti e possono essere molto divertenti da usare. È sia un punto di forza che un punto di debolezza: quando li si utilizza, è così allettante aggiungere diversi livelli di template / specializzazioni / lambdas che alla fine a volte si ottiene più "amministrazione" che codice efficace nel programma (in altre parole, il tuo programma "parla" più del problema che descrivendo la soluzione). Trovare il giusto equilibrio è molto sottile. Conclusione: è necessario tenere traccia dell'evoluzione del rapporto "segnale / rumore" nel codice misurando :

  • quante righe di codice nel programma?
  • quante classi / modelli?
  • tempo di esecuzione?
  • consumo di memoria?

Tutto ciò che aumenta i primi due può essere considerato come un costo (perché può rendere il programma più difficile da capire e da mantenere), tutto ciò che diminuisce gli ultimi due è un guadagno .

Ad esempio, l'introduzione di un'astrazione (una classe virtuale o un modello) può fattorizzare il codice e rendere il programma più semplice ( guadagno ), ma se non viene mai derivato / istanziato una sola volta, allora introduce un costo per nessun guadagno associato (di nuovo lo è sottile perché il guadagno potrebbe arrivare più tardi nella futura evoluzione del programma, quindi non esiste una "regola d'oro").

Anche il comfort del programmatore è un fattore importante da tenere in considerazione nel bilancio costi / guadagni: con troppi modelli, i tempi di compilazione possono aumentare in modo significativo e i messaggi di errore diventano difficili da analizzare.

Guarda anche

In che misura il generico e la meta-programmazione utilizzando i modelli C ++ sono utili nella scienza computazionale?


2
Lo stesso vale per Armadillo e Eigen, no?
dr.blochwave,

Sì, hai ragione (ho appena controllato la documentazione di Armadillo, ne ho meno familiarità). Sto modificando il post.
BrunoLevy,

1
Tempi di compilazione più lunghi sono un altro costo degno di nota.
Kirill,

@Kirill, sì buon punto (modificato il post per menzionarlo), grazie.
BrunoLevy,

10

Suggerirei di dare un'occhiata a Deal.II. Utilizza l'STL, i propri iteratori, puntatori condivisi, ecc.

I vari solutori lineari possono usare le varie matrici a causa di come è stata progettata. Non ho riscontrato alcun uso della semantica di spostamento, ma ciò non significa che non ci siano. Ecco un link


Anche OpenFOAM - uso piuttosto esteso di modelli.
tpg2114,

1
deal.II non usa la semantica di movimento (perché si astiene dall'usare le funzionalità del linguaggio C ++ 11 - ma usa le funzionalità della libreria C ++ 11 per le quali ci sono sostituzioni in BOOST per compilatori più vecchi). Utilizza praticamente tutte le altre funzionalità del linguaggio C ++, incluse tutte quelle poste nella domanda originale.
Wolfgang Bangerth

Non sembra facile guardare in dettaglio una grande biblioteca.
Michael,

7

La libreria HPX fa ampio uso di una gamma di funzionalità C ++ 11 come i costruttori di mosse e punta anche a essere un'implementazione completa di N4409 (Working Draft, Specifiche tecniche per le estensioni C ++ per il parallelismo).

Hanno un elenco di pubblicazioni sul loro sito che include una serie di esempi sull'uso della biblioteca per accelerare il calcolo scientifico. C'è anche una discussione così interessante sulla biblioteca e sul suo uso del C ++ moderno in questo episodio di CppCast .


Benvenuto su scicomp.se! Se aggiungi collegamenti o citi alcuni articoli / libri / post di blog che trattano questa biblioteca per il calcolo scientifico, voterò felicemente la tua risposta!
Hardmath,

5

Suggerisco di dare un'occhiata al C ++ scientifico e ingegneristico: un'introduzione con tecniche ed esempi avanzati di Barton e Nackmann .

Il fatto che questo libro sia stato pubblicato nel 1994 sembra violare il tuo criterio di "tecniche moderne". Tuttavia, Barton e Nackmann erano all'avanguardia di ciò che era possibile con i modelli C ++ all'epoca e le tecniche innovative ideate per ottenere buone prestazioni sono ancora utilizzate nelle ultime librerie di classe C ++.


4

Oltre a deal.ii (che è già stato suggerito qui) puoi anche dare un'occhiata a Dune libreria che fa ampio uso di alcune funzionalità avanzate di C ++ come metaprogrammazione dei template, intervalli di iteratori, puntatori intelligenti e così via. C'è anche una recente prestampa di Joachim Schöberl, che commenta l'uso delle funzionalità C ++ 11, come ad esempio le funzioni lambda, per semplificare l'implementazione dei metodi agli elementi finiti in NGSolve. Incrementoha anche alcune librerie relative alla programmazione scientifica come uBLAS, Graph, ecc. Immagino che nella maggior parte di queste librerie troverai buoni esempi dell'uso moderno del C ++. Tuttavia, tieni presente che potresti riscontrare anche cattivi esempi di utilizzo del C ++ avanzato / moderno. In alcuni casi, mentre leggevo il codice / la documentazione, ho avuto la sensazione che occasionalmente le cose fossero enormemente troppo generalizzate per mostrare abilità avanzate come TMP, dove per il 99% di tutte le potenziali applicazioni un'implementazione più semplice farebbe anche lavoro.


3

Il libro "Guide to Scientific Computing in C ++" di Pitt-Francis & Whiteley è stato scritto per rispondere esattamente a questo genere di cose (uso di STL, iteratori ecc.) Ed è disponibile via Amazon o come e-Book dall'editore .

Divulgazione - Lavoro nello stesso gruppo di ricerca degli autori, ma penso ancora che sia un'ottima risorsa per questo!


1

Penso che questo libro sia perfetto per te, come ha fatto per me: Alla scoperta del C ++ moderno: un corso intensivo per scienziati, ingegneri e programmatori (approfondimento C ++) di Peter Gottschling, specialmente se usato insieme ai principi di programmazione e alla pratica C ++ 2nd Edition Bjarne Stroustrup. Lo stesso inventore del C ++. Entrambi dovrebbero fornire un terreno solido su cui stare.


0

La libreria Blaze per l'algebra lineare fa un uso pesante di C ++ 14 sotto forma di tipi di ritorno dedotti e finali. Altre moderne funzionalità C ++ in uso sono constexpr, alias modelli e un sacco di metaprogrammi di modelli con espressione SFINAE.

Puoi anche utilizzare elenchi di inizializzatori per i tuoi vettori e matrici, ad es

blaze::DynamicVector<int> x{ 4, -1, 3 };

Per maggiori dettagli vedi la loro pagina iniziale .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.