Je viens de réécrire un programme MATLAB en C ++ comme une fonction MEX pour accélérer les choses, avec des résultats fantastiques. Cette décision d'optimisation a été une très bonne idée, avec une vitesse maximale 20 sans filetage. Cela m'a toujours laissé curieux de savoir ce que la fonction MEX dépense du temps et de vouloir identifier les goulots d'étranglement possibles. p>
Je cherche un moyen de profiler les fonctions MEX. Le profileur MATLAB n'est pas très utilisé et les autres profileurs que j'ai téléchargés (à la fois gratuits et essais) souhaitent tous un exécutable à exécuter. Je ne suis pas de Mex-Guru, mais aussi loin que j'ai compris que le seul moyen de gérer un Mex est de Matlab. La fonction MEX est compilée dans une DLL, mais s'appelle .MEX64. Ce problème devrait donc être similaire au profilage d'une DLL. Pour écrire la fonction C ++ MEX, j'ai utilisé un utilisateur unique VS2005 (I.E., pas la version de l'équipe) et je suis en cours d'exécution sur une plate-forme X64. P>
Quelqu'un peut-il connaître un bon moyen de profiler une fonction MEX? Quel outil dois-je utiliser et comment puis-je l'utiliser lorsque je commence à partir de Matlab? Ou y a-t-il une autre façon de profiler le code C ++? p>
3 Réponses :
La seule façon dont j'ai réussi à faire cela consiste à séparer la fonction de travail et à écrire une enveloppe distincte (au lieu de MexFunction) qui charge des fichiers .mat avec des données de test et fonctionne comme exécutable autonome. Cela peut ensuite être profilé en utilisant par exemple. GPROF P>
Merci pour le conseil. C'est une bonne approche. Mon seul problème est que l'entrée au MexFunction est une grande bouquet de grandes structures Matlab. J'ai besoin d'écrire du code pour créer tout ce genre de choses dans l'emballage pour pouvoir courir, ce qui m'empêche de m'empêcher de y aller à un et sans aucune pensée.
Ne suivez pas. Vous ne pouvez pas créer toutes vos structures à l'intérieur de Matlab et les enregistrer dans un fichier .mat? (c.-à-d. Tout ce qui était auparavant un argument d'entrée à votre Fonction MEX est maintenant enregistré dans un fichier .mat et lus dans le nouveau wrapper du disque.
Il est possible de profiler directement vos fichiers MEX à l'aide de Valgrind. Vérifiez Cette répond.
Y a-t-il un moyen de gérer le tout sous une IDE VC. Comme si vous pouviez dire "Débug DLL FOO.DLL, en utilisant MATLAB comme application de démarrage". P>
Puis, si la barre de fonction que vous utilisez dans FOO.DLL est exécutée dans <1 sec, assurez-vous que MATLAB l'appelle beaucoup de fois ou ajoutez une fonction d'emballage dans la DLL pour l'appeler beaucoup de fois. < / p>
Si vous pouvez arriver à ce point, vous pouvez utiliser le Technique d'échantillonnage de pile d'appels manuels , qui fonctionne vraiment malgré non être populaire ou nécessitant une installation d'un outil. P>
Deux solutions possibles en plus des fins déjà suggérées. P>
Il est possible d'écrire un script qui charge les données, exécute votre fonction MEX, puis sortez. Vous pouvez ensuite laisser le profileur appeler le MATLAB exécutable avec ce script. Cela a fonctionné pour moi avec le profileur visuel de Nvidia lorsque je profiais de mes fonctions Cuda Mex. P> Li>
Si vous avez construit la fonction MEX dans Visual Studio, vous devriez pouvoir se connecter au processus MATLAB, puis exécuter la fonction pour le débogage ou le profilage. P> li> ol>