J'explore la bibliothèque Armadillo C ++ pour l'algèbre linéaire pour le moment. Autant que j'ai bien compris, il utilise la bibliothèque de Lapack / Blas pour les opérations de base de la matrice de base (multiplication de matrice par exemple). En tant qu'utilisateur Windows, j'ai téléchargé Lapack / Blas à partir d'ici: http: //icl.cs.utk .EDU / Lapack-for-Windows / Lapack / # Exécution . Le problème est que les multiplications matricielles sont très lentes à comparer à Matlab ou même à R. Par exemple, Matlab multiplie deux matrices 1000x1000 en ~ 0,15 secondes sur mon ordinateur, R a besoin de 1 seconde, tandis que C ++ / Armadillo / Lapack / Blas a besoin de plus de 10 secondes pour cela. p>
Donc, Matlab est basé sur des bibliothèques très optimisées pour l'algèbre linéaire. Ma question est de savoir s'il existe une Lapack / Blas plus rapide, BLAS, d'utiliser à partir de Armadillo? Alternativement, existe-t-il un moyen d'extraire une manière en quelque sorte des bibliothèques d'algèbre linéaire MATLAB et utilisez-les en C ++? P>
4 Réponses :
Y a-t-il un moyen d'extraire des bibliothèques d'algèbre linéaire MATLAB et utilisez-les en quelque sorte et les utiliser en C ++? Oui, pour la fonction C ++ Call Matlab, reportez-vous à ce lien: Comment appeler des fonctions MATLAB à partir de C ++ P>
Le compilateur Matlab coûte beaucoup de temps!
@Alexbuisson Alors pourquoi Matlab? Je connais une autre bibliothèque d'algèbre linéaire, Blas, qui convient à une informatique haute performance.
Oui c'est pourquoi j'utilise octave. Il s'agissait simplement d'une remarque de noter que Matlab IDE et Compilit sont 2 choses différentes.
Plusieurs C ++ Lib pour algèbre linéaire permettent un moyen facile de relier avec une lib. p>
regarde http: // logiciel. Intel.com/en-us/articles/intelR-mkl-and-C-Template-libraires P>
Vous devriez être capable de relier Armadillo au MKL pour plus de performances, mais c'est un package commercial, P>
Lapack ne fait pas la multiplication de matrice. C'est Blas qui fournit une multiplication de matrice. P>
Si vous avez un système d'exploitation 64 bits, je vous recommande d'essayer d'abord une version 64 bits de Blas. Cela vous fera doubler immédiatement des performances. P>
Deuxièmement, consultez une implémentation hautes performances de Blas, telle que Openblas . Openblas utilise à la fois vectorisation et parallélisation (c.-à-d. Multi-noyau). C'est un projet Open Source gratuit (sans frais). P>
MATLAB utilise interne le bibliothèque Intel MKL , que vous pouvez également utiliser avec le Bibliothèque de Armadillo . Intel MKL est une source fermée, mais est gratuite pour une utilisation non commerciale. Notez que Openblas peut obtenir des performances de multiplication de matrice qui est à égalité ou mieux que Intel MKL. P>
Notez que l'algèbre linéaire haute performance est généralement plus facile à accomplir sur Linux et Mac OS X que sur Windows. P>
Merci pour une telle réponse complète!
La dernière déclaration vient également en contradiction avec les Openblas n'a été fournie que dans Windows ou que je manque quelque chose?
Le code source des openblas peut être obtenu à partir de github.com/xianyi/openblas/relases
Ajout à ce qui a déjà été dit, vous devez également utiliser un niveau élevé d'optimisation: p>
Assurez-vous d'utiliser soit le drapeau lien vers ce qui est mentionné ci-dessus performances hautes performances fort> (et éventuellement multi-filetés) BLAS Bibliothèques forte>. AFAIK MKL est uniquement disponible librement pour les plates-formes UNIX, si vous utilisez une boîte Linux comme Cygwin Inside Windows, cela devrait être ok alors je suppose. Openblas est également multi-fileté. P> li>
Dans de nombreuses bibliothèques, réglage du symbole ndebug strong> (par exemple, passer le drapeau du compilateur -Dndebug) désactive la vérification et les affirmations de la plage coûteuse. Armadillo a son propre symbole, appelé arma_no_debug strong>, que vous pouvez définir manuellement ou que vous puissiez modifier le fichier d'en-tête Config.HPP (situé dans le répertoire Armadillo include) et décotez la ligne correspondante. Je suppose que depuis que vous avez pu allumer l'utilisation des blas externes à Armadillo, vous devez vous familiariser avec ce fichier de configuration de toute façon ... P> li>
ol>
J'ai fait une comparaison rapide entre Armadillo / Mkl_blas et Matlab sur mon poste de travail Intel Core-I7. Pour l'EXE C ++, j'ai utilisé -O3, MKL Blas et avaient défini arma_no_debug. J'ai multiplié des matrices aléatoires de 1000x1000 100 fois et avons en moyenne la moyenne des temps de multiplication.
La mise en œuvre C ++ était d'environ 1,5 fois plus rapide que MATLAB. P>
J'espère que cela aide p>
Si vous mettez -1, donnez-moi s'il vous plaît un indice sur comment pourrais-je améliorer ma question.