J'ai besoin d'exécuter beaucoup d'opérations matricielles dans ma demande. Le plus de temps prend la multiplication de matrice. Je l'ai mis en place de cette façon
template<typename T> Matrix<T> Matrix<T>::operator * (Matrix& matrix) { Matrix<T> multipliedMatrix = Matrix<T>(this->rows,matrix.GetColumns(),0); for (int i=0;i<this->rows;i++) { for (int j=0;j<matrix.GetColumns();j++) { multipliedMatrix.datavector.at(i).at(j) = 0; for (int k=0;k<this->columns ;k++) { multipliedMatrix.datavector.at(i).at(j) += datavector.at(i).at(k) * matrix.datavector.at(k).at(j); } //cout<<(*multipliedMatrix)[i][j]<<endl; } } return multipliedMatrix; }
5 Réponses :
boost ublas je pense est définitivement la voie à suivre avec ce genre de chose. Boost est bien conçu, bien testé et utilisé dans beaucoup d'applications. P>
Par rapport aux autres options disponibles (Eigen, CublaS, MKL), Boost Ublas a une performance assez terrible. Eigen notamment intègre de nombreux concepts utilisés par Boost Ublas et peut émettre des instructions SIMD pour diverses architectures de la CPU.
considérer bibliothèque scientifique GNU ou mv ++ p>
Si vous allez bien avec C, blas est une bibliothèque de bas niveau qui intègre tous les deux c et des instructions de Fortran enveloppées C et utilise un grand nombre de bibliothèques de mathématiques de niveau supérieur. p>
Je ne sais rien à ce sujet, mais une autre option pourrait être Meschach quel semble avoir une performance décente . p>
Edit: En ce qui concerne votre commentaire à propos de ne pas vouloir utiliser des bibliothèques utilisant votre carte graphique, je vais souligner que dans de nombreux cas, les bibliothèques utilisées de votre carte graphique sont des implémentations spécialisées des bibliothèques standard (non GPU). . Par exemple, diverses implémentations de blas sont répertorié sur sa page Wikipedia , seulement certaines sont conçues pour tirer parti de votre GPU. P>
Il y a un livre appelé Introduction aux algorithmes code>. Vous voudrez peut-être vérifier le chapitre de la programmation dynamique. Il possède une excellente multiplication matricielle Algo à l'aide de la programmation dynamique. Sa peine vaut une lecture. Eh bien, cette information était au cas où vous voudriez écrire votre propre logique au lieu d'utiliser une bibliothèque. P>
Il y a beaucoup d'algorithmes pour une multiplication de matrice efficace. P>
Algorithmes pour une multiplication de matrice efficace P>
Regardez les algorithmes, trouvez une implémentation. P>
Vous pouvez également effectuer une implémentation multi-threadée pour cela. P>
Eigen est de loin l'un des plus rapides, sinon le plus rapide, bibliothèques d'algèbre linéaire là-bas. Il est bien écrit et il est de haute qualité. En outre, il utilise un modèle d'expression qui rend le code d'écriture plus lisible. La version 3 vient de publier utilise OpenMP pour le parallélisme de données.
En général, si vous avez besoin d'une chose assez standard réalisée efficacement, vous devez rechercher une bibliothèque bien faite. Ils sont écrits par des personnes qui en savent généralement plus que ce que vous faites sur l'opération et qui peut mettre plus de temps que vous ne pouvez la rendre efficace.
Sont ces matrices denses? Sinon (dans une grande quantité d'applications que vous avez des matrices clairsemées), cet algorithme simple perdra beaucoup de temps à multiplier les zéros. Bien sûr, afin de gérer efficacement les matrices clairsemées, vous devez modifier complètement la manière dont les données sont stockées.
Découvrez le BLAZE BIBLABIBY A>, qui gère très bien la multiplication de matrice-matrix et fournit une syntaxe facile à utiliser.