J'ai du code de traitement d'image MATLAB qui fonctionne assez lentement et je suis prêt à la convertir à C / C ++. Je ne sais pas vraiment beaucoup sur la façon dont Matlab fonctionne et comment le code est exécuté, mais je suis juste intéressé à entendre quel type de rapidité je pouvais m'attendre. Il existe clairement de nombreuses variables qui affecteront cela, mais je cherche juste un guide peut-être de vos propres expériences. P>
merci p>
ZENNA P>
7 Réponses :
Cela dépend vraiment de la qualité de votre code MATLAB et de ce que vous faites. Le code Idiomatic matlab écrit par un expert MATLAB va être difficile à battre, en particulier si vous n'êtes pas un gourou d'optimisation et s'attendant purement à une vitesse en raison de l'interrupteur de la langue. Par exemple, j'ai trouvé que même certaines des plus grandes bibliothèques FFT c-basées sur C n'avaient aucune correspondance pour la FFT de Matlab. P>
Cela dit, comparant un programme MATLAB mal écrit à un C ++ écrit en moyenne, je dirais que vous examinez un ordre de grandeur dans mon expérience. p>
Pour les FFT, Matlab utilise FFTW ("la transformée Fourier la plus rapide de l'Ouest", voir fftw.org ), qui est implémenté dans C (en réalité, Code C généré par objectif CAML, voir FFTW.ORG/PLDI99.PDF " a>).
La réponse courte à la question de quel type de rapidité que vous pourriez obtenir est "Cela dépend". p>
MATLAB est un interprète, donc globalement, il est beaucoup plus lent que le code Native C ++. Cependant, de nombreuses fonctions MATLAB sont bien optimisées et les versions récentes comprennent JIT. Donc, vous devriez décider de réécrire tout votre code MATLAB en C, réécrivez uniquement les parties critiques ou pour optimiser le code MATLAB lui-même pour fonctionner plus rapidement. P>
Je vous suggérerais de commencer à utiliser les outils de profilage intégrés de Matlab pour trouver les goulots d'étranglement des performances de votre application. Il se peut que vous puissiez modifier le code MATLAB pour obtenir une meilleure performance. La règle de base est d'éviter les boucles en utilisant des opérations de réseau vectorisées au lieu de itération d'un élément à la fois. P>
Avec l'introduction de l'accélérateur JIT, la pénalité de la boucle »n'est pas vraiment préoccupante comme dans le passé. Utilisez le profileur pour trouver les véritables goulots d'étranglement.
Par exemple, MATLAB utilise la bibliothèque FFTW pour implémenter des algorithmes FFT. La performance de cette bibliothèque est presque impossible à battre. Le seul que je sais que c'est comparable est la bibliothèque de noyau Intel Math (MKL), mais est commerciale. Donc, tout d'abord, je suggérerais d'utiliser toutes les bibliothèques mathématiques que vous pouvez trouver. Matlab fait cela dans les coulisses. p>
Il est vrai qu'il est parfois difficile de battre matlab. Mais la chose est que le profileur MATLAB ne vous donne pas toujours suffisamment d'informations sur la manière d'améliorer votre code. Vous savez que certaines méthodes MATLAB prennent la plupart du temps, mais vous ne savez pas toujours si les moyens d'améliorer la performance les appeler d'une autre manière parce que cette méthode est une boîte noire. p>
in c / c ++ Vous avez des outils tels que Valgirnd qui vous permet d'inspecter même si l'assembleur est en train de générer le compilateur. Et de cette façon, vous pouvez aider le compilateur à améliorer ce code affilant une méthode par exemple. Mais encore une fois, Matlab utilise des bibliothèques mathématiques professionnelles dans les coulisses et, si la plupart du temps consacre dans ces bibliothèques lorsque vous exécutez votre code MATLAB, les performances sont alors difficiles à améliorer. P>
Je pourrais vous aider à essayer une approche différente. Vous pouvez analyser les goulots d'étranglement avec le profileur MATLAB et voir s'il en vaudrait la peine de déplacer ce code au code natif. Matlab vous permet de ça. Vous pouvez également le faire dans l'inverse. Vous pouvez implémenter une colle en C / C ++ et et appelez MATLAB pour certaines opérations où vous avez vécu que votre code natif est plus lent que MATLAB. p>
Pour le traitement de l'image, vous pouvez obtenir une vitesse notable. Mais cela dépend vraiment de la qualité de votre rédaction de code MATLAB. Beaucoup de choses peuvent être vectorisées ou être prises en charge par des fonctions intégrées. Ce type de code est flamboyant rapidement. P>
Toutefois, si vous trouvez que votre code consiste en beaucoup de boucles (comme dites, en boucle sur tous les pixels d'une image), il va être incroyablement lent et la vectorisation peut donner 100 fois la vitesse ou plus. P>
Si votre code est très difficile à faire "à droite" dans MATLAB, la commutation sur C peut être une option viable. J'ai fait un projet de vision informatique à l'école (reconstruction de points 3D) qui a clairement montré cela. Lorsque notre projet, qui a été mis en œuvre dans C ++ et OpenCV, a été fini de calculer, l'un des autres groupes de groupes n'avait guère même chargé les images. Les leurs ont été écrits à Matlab. Nous n'avons jamais chronométré, mais mon devinez em> est que notre version a couru environ 10 fois plus vite. P>
Mais là encore, leur code MATLAB n'était probablement pas optimisé du tout. Donc, ce n'est pas vraiment utile comme une référence. P>
Avec l'introduction de l'accélérateur JIT, la pénalité de la boucle »n'est pas vraiment préoccupante comme dans le passé. Utilisez le profileur pour trouver les véritables goulots d'étranglement.
Oui, j'ai aussi entendu ça. Malheureusement, je n'ai pas encore eu le plaisir de travailler avec les dernières versions Matlab :(
Cela dépend principalement de l'étanchéité de vos boucles dans Matlab. Si vous appelez simplement une série de fonctions de traitement d'images MATLAB intégrées, vous ne serez probablement pas en mesure d'améliorer les performances (plus susceptibles de le faire mal). Si vous êtes en boucle sur des pixels d'image ou si vous faites une sorte de traitement de bloc, vous pouvez voir de grandes améliorations. Si vous faites des boucles, mais la quantité de traitement au sein de chaque itération est substantielle, vous ne pouvez voir que peu ou aucune amélioration. p>
La façon dont je regarde Matlab, c'est que chaque ligne exécutée a une certaine quantité de frais généraux. Si vous pouvez mettre votre solution dans la forme d'une matrice multiplier, ou une autre opération vectorielle / matrice, vous ne subirez qu'une seule fois et qu'il est négligeable. Cependant, avec des boucles, vous souffrez que les frais généraux chaque fois que la boucle itière. En outre, la plupart des fonctions de traitement d'images de Matlab ne font que passer des appels à des bibliothèques optimisées. N'essayez donc pas de les recréer à moins que vous sachiez à certains endroits où ils peuvent être améliorés. P>
J'ai constaté que la meilleure approche consiste à utiliser une combinaison de C et Matlab. J'utilise MATLAB lorsque l'opération peut être facilement vectorisée (mettre en termes d'opérations vectorielles / matricielles). Cela peut signifier venir à la solution d'un angle différent de ce qui semble le plus simple. En outre, il est difficile de battre le complot et de la visualisation de Matlab afin que je ne puissiez certainement pas passer à une solution entièrement C / C ++, à moins que vous ne disposiez de planifier comment afficher avec C / C ++ (si cela fait partie de votre projet). P >
Si je ne peux pas trouver un moyen relativement facile de vous vectoriser, je viens de mettre en œuvre la partie du traitement qui nécessite des boucles serrées dans une fonction C MEX C qui peut être appelée à partir de Matlab. J'ai tendance à utiliser c au lieu de C ++ dans ce cas car le processus doit être relativement petit et ne nécessite pas beaucoup d'abstraction de données complexes, mais C ++ fonctionnerait aussi bien. Assurez-vous d'accéder aux données d'image dans la colonne-majeure afin de maximiser les hits de cache, car c'est la manière dont Matlab organise ses matrices. P>
Avec l'introduction de l'accélérateur JIT, la pénalité de la boucle »n'est pas vraiment préoccupante comme dans le passé. Utilisez le profileur pour trouver les véritables goulots d'étranglement.
Oui, je vais certainement aller cette route en premier, mais j'ai encore trouvé des situations où c avec optimisations peut être meilleure. Cela pourrait être mes connaissances limitées pour tirer parti du compilateur JIT. Cela étant dit, évitant C / C ++ où Matlab peut faire aussi bien ou mieux est une bonne idée.
@MATLABDOUG: Pouvez-vous éventuellement se développer sur l'accélérateur JIT et le profileur? Je fais beaucoup de programmation Matlab et je n'ai jamais entendu parler de ceux-ci, mais ils semblent intéressants. Peut-être que vous pourriez fournir quelques liens? Merci.
Comme les autres l'ont dit, utilisez le profileur Matlab pour voir ce que sont les goulots d'étranglement. Si c'est la matrice Numéro-crunching, vous avez une jolie barrette à sauter pour battre Matlab. Si vous avez beaucoup de déclarations conditionnelles ou d'appels de fonction, vous êtes plus susceptible de pouvoir améliorer votre vitesse. P>
Assurez-vous d'essayer de minimiser le nombre de fois que les données sont transférées entre MATLAB et C ++. Si vous envoyez de grandes matrices de données dans une grosse grossière, cela risque d'être rapide. Sinon, si vous effectuez de nombreux transferts de données dedans et même si votre programme C ++ est rapide, vous risquez de perdre l'avantage de vitesse dans la conversion de données. P>
Je regarderais également vos algorithmes et j'envisagerais d'utiliser Java. Il est très pratique d'appeler le code Java personnalisé de Matlab, car Matlab s'exécute déjà sur une JRE. J'ai été très impressionné par la vitesse de transfert de grandes matrices de données entre les fonctions MATLAB et mon code Java personnalisé. J'avais examiné la mise en œuvre d'un algorithme en droit C ++ (en utilisant MeX ou autre) il y a quelques années pour accélérer Matlab, et cela ressemblait à un cauchemar pour faire face à toutes les structures de données. J'ai fini par utiliser Com / ActiveX, car j'exécutitais sur une machine Windows et que l'interface était beaucoup plus facile. P>
Après avoir fait beaucoup de programmation de bas niveau pour résoudre des problèmes numériques, j'ai une meilleure appréciation pour ce qui peut se tromper, de la précision numérique à la programmation des problèmes de maintenance, et à moins qu'il n'y ait eu un avantage de performance énorme, je choisirais une langue de niveau supérieur n'importe quelle journée sur C / C ++. P>
J'ai exporté une routine MATLAB en C ++ et compilez avec Visual Studio C ++ comme MEX. Le speed-up était un facteur de 10. Et si j'utiliserais plusieurs cœurs, je vous aurais également également 3 fois plus de vitesse. P>
Si vous avez des pentes dans les pentes et que vous faites quelque chose avec les composants simples de la matrice, quelque chose comme Y (m, n) = x (m) * A - x (m-1) et celui-ci pour les pentes, alors vous allez avoir une bonne vitesse. P>
Si vous utilisez de nombreuses fonctions MATLAB pour le calcul, où la fonction MATLAB est elle-même de nombreuses opérations, il a moins de sens pour exporter le code en C ++. P>
Ummm ... Certains exemples de code seraient gentils. Vous ne pouvez pas prendre un algorithme lent et merdique à Matlab et attendez-vous à une conversion pour le rendre rapide. Vous ne pouvez pas vous battre l'interprète, c'est peut-être l'algorithme