Je considère l'implémentation d'un tableau comme un conteneur, et je ne suis pas sûr d'utiliser un gsl :: gsl_vector ou un std :: vector. Le conteneur doit être efficace dans l'espace mais également très rapide lors de l'appel des valeurs. Le conteneur sera référencé en permanence dans le programme principal pour, par exemple, entrer des valeurs dans des fonctions tensorielles, entre autres choses. J'appelle du conteneur littéralement des milliards de fois. Le gsl_vector est pratique car il me permettra d'utiliser les bibliothèques gsl BLAS à l'occasion, et l'appel gsl_vector_get(...)
est très efficace. D'autre part, je suis capable d'obtenir presque la même vitesse d'appels en utilisant des itérateurs stl, et le vecteur stl a une interface que je trouve tout à fait naturelle.gsl :: gsl_vector vs std :: surcharges vectorielles et efficacité
Y at-il des frais généraux de mémoire/problèmes d'efficacité que je devrais être au courant de ce que j'ai négligé dans le code ci-dessus?
En outre, j'utilise une implémentation std::vector<gsl_vector*>
pour le moment, et un itérateur pour parcourir le vecteur std ::. Serait-il plus intelligent d'utiliser une gsl_matrix ici? L'idée serait d'utiliser gsl_vector_views pour obtenir le bon vecteur, plutôt que l'itérateur. Serait-ce plus efficace?
drôle comment les résultats de référence présentés par le projet X, il arrive que X sort le plus rapide. Les gens d'Eigen sont également catégoriques sur le fait que leur code est bon, et Armadillo a changé/amélioré depuis la version utilisée dans le benchmark. Votre kilométrage peut varier. –
Il est beaucoup plus rapide que Armadillo (vous pouvez voir le lien de référence) parce que comme je l'ai dit blaze utiliser "Smart Expression Template". Signification: Blaze utilise des templates uniquement comme un wrapper pour les bibliothèques blas de code c de bas niveau (comme Intel mkl). Armadillo essaie de calculer l'opération matricielle en déroulant la boucle au moment de la compilation (la forme originale du "template d'expression") et les documents que j'ai liés montrent que c'est loin de la solution optimale. . Je pense que Eigen utilise une implémentation mixte, mais Blaze est aussi plus rapide qu'Eigen. –
Oui. Le benchmark peut varier. Mais l'idée que "Expression Template" ne peut pas battre intel MKL (ou tout autre code bas niveau c) est très solide. Utiliser des templates comme un wrapper pour un code bas niveau optimisé est beaucoup mieux que de se fier au compilateur pour faire 100% du travail. Je pense que tous les BLAS C++ convergent sur cela, ce qui est l'idée derrière "Smart Expression Templates". –