Quel est l'impact de la sémantique des mouvements C ++ 11 dans le contexte du calcul scientifique?


10

C ++ 11 introduit la sémantique de déplacement qui peut, par exemple, améliorer les performances du code dans les situations où C ++ 03 devrait effectuer une construction de copie ou une affectation de copie. Cet article signale que le code suivant connaît une accélération de 5 fois lorsqu'il est compilé avec C + 11:

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

Quel est l'impact de la sémantique des mouvements C ++ 11 dans le contexte du calcul scientifique?

Je suis intéressé par cette question qui est générale, mais plus spécifiquement, je suis également intéressé par la sémantique de déplacement pour les codes d'éléments finis écrits à l'aide de bibliothèques boost. J'ai testé une partie de mon propre code C ++ 03 en utilisant la version boost 1.47.0 (puisque les notes de version boost mentionnent la sémantique de déplacement introduite dans 1.48.0) et la version boost 1.53.0, mais je n'ai pas remarqué beaucoup d'amélioration. Je suppose que les économies de ne pas avoir à faire de construction de copie pour boost::numeric::ublas::vector/ matrixet boost::functionne sont pas perceptibles car la résolution des matrices système constitue la majeure partie de la charge de travail.

Edit: En fait, il semble que la sémantique de déplacement ne soit implémentée que boost::function(voir les notes de publication de la version 1.52.0 ). Il n'y a aucune mention de la sémantique de mouvement dans boost::numeric, j'ai salué les sources pour m'assurer et il ne semble pas y avoir de références rvalue.


1
Comme vous le notez dans la dernière partie de votre question, à moins d'avoir profilé votre code et vu de nombreuses copies en cours, vous ne pouvez pas améliorer considérablement vos performances en utilisant la sémantique de déplacement.
Bill Barth

Réponses:


10

Je pense qu'en pratique l'impact est limité et sera limité.

La raison pour laquelle il est limité en ce moment est que les gros packages d'éléments finis prennent soin d'écrire du code portable, et qu'ils n'utilisent donc pas encore de constructions de langage C ++ 11 dans leurs propres codes.

Bien sûr, ils bénéficieront d'un code comme celui que vous montrez où, même sans avoir à changer le code source, vous bénéficiez d'une bibliothèque de support de compilateur améliorée telle que libstdc ++ pour GCC. Cela dit, les gens de l'informatique scientifique sont assez bien conscients des coûts de copie et donc, pour les objets où cela importe, ils ne copient tout simplement pas - soit ils génèrent sur place, soit ils font des copies superficielles, soit ils utilisent le partage pointeurs, ou de nombreuses autres techniques disponibles pour éviter les frais de copie. En d'autres termes, la situation pour laquelle la sémantique du mouvement a été inventée ne se produit pas très souvent dans les "vrais" codes scientifiques.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.