web-dev-qa-db-fra.com

Pourquoi Octave est-il plus lent que MATLAB?

J'utilise Octave et MATLAB pour quelques projets et je suis tombé sur quelques questions. Cette question Pourquoi/quand devrais-je préférer MATLAB à Octave? ) a répondu à plusieurs, mais il en reste encore une ...

J'ai lu un certain nombre d'articles/d'autres sources comparant les performances d'Octave et de MATLAB, et j'ai exécuté certains de mes propres tests sur des scripts standard qui confirment le consensus général selon lequel Octave est généralement beaucoup plus lent que MATLAB pour les opérations standard (itéré, bien sûr, pour que la comparaison soit significative).

Le consensus semble également suggérer que la majeure partie de l'augmentation des performances de MATLAB est attribuable à son compilateur JIT, qui compile de grandes boucles au moment de l'exécution. Cela a du sens et les plus grandes différences de performances semblent se produire dans ces cas (par exemple Mathworks Matlab vs Gnu Octave )

Ma question est la suivante: pourquoi devrait-il être le cas que le code vectorisé s'exécute également plus lentement dans Octave? Il semble que dans ce cas, la mémoire devrait être mise de côté avant la boucle et une boucle native C/C++ devrait effectuer l'opération, ce qui équivaudrait aux performances entre Octave et MATLAB pour le code vectorisé. De plus, cela a-t-il des implications plus larges, c'est-à-dire qu'Octave pourrait fonctionner plus mal pour des opérations complexes, même si du code est écrit de telle sorte qu'un compilateur JIT est inutile/inutilisé?

37
Sam Grondahl

Il y a quatre façons d'accélérer le code Matlab:

  • JIT: la compilation à l'exécution aide aux boucles mais semble accélérer (ou au moins interagir avec) d'autres parties du code également, selon mes observations anecdotiques.

  • Implémentation de fonctions en C/C++: Il existe un tas de fonctions Matlab/Octave qui sont implémentées dans Matlab/Octave. À chaque version, il y en a beaucoup plus qui sont intégrés dans les modules intégrés.

  • Multithreading: Il y a ne liste de fonctions qui ont des implémentations multithread, ce qui accélérera les appels de fonction.

  • Implémentations généralement plus efficaces. Par exemple, le filtre médian a obtenu une augmentation de vitesse massive pour les entrées entières il y a quelques versions.

Toutes ces approches nécessitent des développeurs dédiés à accélérer le code. Pour autant que je sache, une préoccupation majeure des développeurs Octave est de s'assurer que la fonctionnalité (Matlab) est là, alors que l'augmentation des performances semble avoir été au centre du développement de Matlab ces dernières années.

35
Jonas

Matlab utilise en interne Intel Math Kernel Library (Intel MKL) pour les opérations vectorielles et matricielles. Cela donne à Matlab un avantage significatif sur Octave.

Essayez les commandes 'version -lapack' et 'version -blas' dans votre Matlab pour vérifier la version de MKL que votre Matlab utilise.

Un lien rapide qui traite de l'utilisation de MKL par Matlab est http://stanford.edu/~echu508/matlab.html .

Intel MKL est propriétaire. software.intel.com/en-us/intel-mkl. Cependant, pour une utilisation non commerciale, la version Linux est gratuite. Si Octave peut en quelque sorte utiliser le MKL installé sur nos machines, cela devrait accélérer considérablement Octave.

17
Sooraj