Qual è l'impatto della semantica del movimento C ++ 11 nel contesto dell'informatica scientifica?


10

C ++ 11 introduce la semantica di spostamento che può, ad esempio, migliorare le prestazioni del codice in situazioni in cui C ++ 03 dovrebbe eseguire una costruzione o assegnazione di copie. Questo articolo riporta che il codice seguente presenta una velocità 5x quando viene compilato con C + 11:

vector<vector<int> > V;
for(int k = 0; k < 100000; ++k) {
    vector<int> x(1000);
    V.push_back(x);
}

Qual è l'impatto della semantica del movimento C ++ 11 nel contesto dell'informatica scientifica?

Sono interessato a questa domanda è generale, ma più specificamente mi interessa anche spostare la semantica per i codici agli elementi finiti scritti usando le librerie boost. Ho testato parte del mio codice C ++ 03 usando la versione boost 1.47.0 (poiché le note di rilascio boost menzionano la semantica di movimento sono state introdotte in 1.48.0) e la versione 1.53.0 di boost, ma non ho notato molti miglioramenti. Immagino che qualsiasi risparmio derivante dal fatto di non dover eseguire la costruzione di copie per boost::numeric::ublas::vector/ matrixe boost::functionnon sia evidente poiché la risoluzione delle matrici di sistema costituisce la maggior parte del carico di lavoro.

Modifica: in realtà sembra che la semantica di spostamento sia implementata solo per boost::function(vedere le note di rilascio della versione 1.52.0 ). Non vi è alcuna menzione della semantica di spostamento boost::numeric, ho attaccato le fonti per accertarmene e sembra che non ci siano riferimenti di valore.


1
Come noterai nell'ultima parte della tua domanda, a meno che tu non abbia profilato il tuo codice e abbia visto molte copie in corso, non puoi migliorare sostanzialmente le tue prestazioni usando la semantica di spostamento.
Bill Barth,

Risposte:


10

Penso che in pratica l'impatto sia limitato e sarà limitato.

Il motivo per cui in questo momento è limitato è che i grandi pacchetti di elementi finiti sono attenti a scrivere codice portatile e quindi non usano ancora costrutti del linguaggio C ++ 11 nei propri codici.

Ovviamente, trarranno vantaggio da codice come quello che mostri dove, anche senza dover cambiare il codice sorgente, beneficerai di una libreria di supporto del compilatore migliorata come libstdc ++ per GCC. Detto questo, le persone nell'informatica scientifica sono abbastanza ben consapevoli delle spese di copia e quindi, per gli oggetti che contano, semplicemente non copiano - generano sul posto, oppure fanno copie poco profonde, o usano la condivisione puntatori o molte altre tecniche disponibili per evitare il sovraccarico della copia. In altre parole, la situazione per la quale sono state inventate le semantiche di movimento non si verifica molto spesso nei codici scientifici "reali".

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.