Je vais bientôt être chargé de faire un profil de mémoire approprié d'un code écrit en C / C ++ et utilise CUDA pour tirer parti du traitement GPU. P>
Mes pensées initiales seraient à créer des surcharges de macros et d'opérateurs qui me permettraient de suivre les appels vers Malloc, Gratuit, Supprimer et de nouveaux appels dans mon code source. Je serais juste en mesure d'inclure un en-tête différent et d'utiliser les Quelle est la meilleure façon de suivre cette utilisation dans une bibliothèque liée à la 3ème partie? Je suppose que je ne serais presque qu'à suivre l'utilisation de la mémoire avant et après les appels de fonction, correct? Dans mon scénario macro / surcharge, je peux simplement suivre la taille des demandes de déterminer la demande de la mémoire. Comment serais-je capable de dire à quel point l'utilisation de la tige de la soie libère? C'est également ce que je comprends aussi que le suivi «GRATUIT» ne vous donne pas vraiment de sens de la quantité de code que le code utilise à un moment donné, car il n'est pas nécessairement renvoyé au système d'exploitation. J'apprécie toute discussion sur la question. P>
merci p> __ file__ et __line __ code> macros pour imprimer des appels de mémoire dans un fichier journal. Ce type de stratégie est trouvé ici: http://www.almostinfinite.com/memtrack.html p>
7 Réponses :
Vous pouvez utiliser le profileur inclus dans Visual Studio 2010 Premium et Ultimate. P>
Il vous permet de choisir entre différentes méthodes de mesure de la performance, le plus utile que vous serez probablement un échantillonnage du processeur, car il gèle votre programme à des intervalles de temps arbitraires et de chiffres sur lesquels il est actuellement exécuté, ce qui ne rend pas votre programme de manière substantielle. plus lent. p>
Question modifiée pour refléter que je ne vais probablement pas exécuter cela sous Windows autant que Linux
Peut-être Valgrind et l'outil Massif? p>
Spécifiquement mentionné que je ne cherche pas à utiliser un outil de profilage robuste. Je veux pouvoir courir cela car je gère mon logiciel avec peu d'impact sur la performance.
Pour suivre la consommation de mémoire en temps réel de mes programmes sur Linux, je trouve simplement le Pour la chose Cuda / GPu, je pense que gdebugger pourrait vous aider. Je ne suis pas sûr, mais l'analyseur de mémoire n'affecte pas beaucoup les performances. P> / proc / [pid] / stat code>. C'est une opération assez légère, pourrait être négligeable dans votre cas si la bibliothèque tierce de votre choix que vous souhaitez suivre, le travail consécutif. Si vous souhaitez avoir des informations de mémoire lors du travail de la bibliothèque 3ème partie, vous pouvez lire le fichier code> code> dans un fil ou dans un autre processus. (Sommet de la mémoire ajoute rarement avant ou après des appels de fonction! ...) p>
Vous pouvez essayer le profileur de la Google Perftools's Perftools: P>
http://google-perfools.googlecode.com/svn/ Trunk / doc / heppprofile.html p>
C'est très léger; Il remplace littéralement malloc / calloc / realloc / libre pour ajouter du code d'instrumentation. Il est principalement testé sur les plates-formes Linux. P>
Si vous avez compilé avec les symboles de débogage, et que vos bibliothèques tiers sont livrées avec des variantes de la version de débogage, PerfTools devrait très bien faire. Si vous n'avez pas de bibliothèques de symboles de débogage, construisez votre code avec des symboles de débogage de toute façon. Cela vous donnerait des chiffres détaillés pour votre code et tous les restes peuvent être des attributs à la bibliothèque tiers. P>
Si vous ne voulez pas utiliser un outil "externe", vous pouvez essayer d'utiliser des outils tels que: p>
MTRACE P>
Il installe des gestionnaires pour Malloc, Realloc et libre et loger chaque opération à un fichier. Voir la Wikipedia que j'ai doublée pour des exemples d'utilisation du code. P> li>
dmalloc p>
C'est une bibliothèque que vous pouvez utiliser dans votre code et peut trouver des fuites de mémoire, des erreurs hors-tête et une utilisation d'adresses non valides. Vous pouvez également le désactiver au moment de la compilation avec -DDDMALLOC_DISABLE. P> li> ul>
Quoi qu'il en soit, je préférerais ne pas obtenir cette approche. Au lieu de cela, je vous suggère d'essayer d'essayer de tester votre application lorsque vous l'exécutez sur un serveur de test sous Valgrind (ou tout outil équivalent) et assurez-vous que vous effectuez une allocation de mémoire, puis laissez l'application exécutée sans vérification de la mémoire de la mémoire. pour maximiser la vitesse. Mais, en fait, cela dépend de votre demande et de vos besoins. P>
Je crois que cette question a deux J'ai écrit mes propres remplacements pour de nouvelles et supprimées. Ils étaient horriblement lents et n'ont pas beaucoup aidé. J'ai utilisé TotalView. J'aime Totalview pour le débogage OpenMP, mais je suis d'accord très lent pour le débogage de la mémoire. Je n'ai jamais essayé Valgrind. J'ai entendu des choses similaires. P>
Le seul outil de débogage de la mémoire que j'ai rencontré vaut son sel est Le vérificateur de mémoire de l'inspecteur d'Intel parallèle. Note: Comme je suis un étudiant, j'ai pu obtenir une licence d'éducation sur le bon marché. strong> qui dit, c'est incroyable. Il m'a fallu douze minutes pour trouver une fuite de mémoire enterrée dans un demi-million de lignes de code - je ne publisais pas un objet d'erreur lancé que j'ai attrapé et ignoré. J'aime tellement ce logiciel que lorsque mon raid a échoué / gagné 7 mangé mon ordinateur (pensez à la reconstruction de AutoPDate & RAID simultanément), j'ai tout arrêté et reconstruit l'ordinateur parce que je savais que cela me prendrait moins de temps pour reconstruire le double démarrage (48 heures) que ce qu'il aurait de trouver la fuite de la mémoire d'une autre manière. Si vous ne croyez pas mes revendications étranges, une version d'évaluation . em> p>
Je pense que tu n'as pas de chance. Pour tous les problèmes de mémoire à Cuda, j'ai essentiellement dû faire pousser mes propres outils et emballages autour de Cudamalloc Code> etc. Ce n'est pas joli. nsight vous achète quelque chose, mais à ce stade, pas très au-delà d'un «Voici combien vous avez alloué RIIIIhight maintenant. Et sur cette question triste, presque chaque problème de performance que j'ai eu avec Cuda dépendait directement de mon accès à la mémoire. motifs (qui ou ma taille de bloc de fil). p>
Quant à la tierce partie, j'ai trouvé que ceci soit résolu. Je n'ai pas eu de tas d'expériences - en désordre avec une bibliothèque de FPGA un moment de retour - mais j'étais à nouveau bloqué écrire mon propre wrapper qui était assez inefficace (à la fois dans le temps de codage et le débogage / le profilage).
L'option d'éventuelle liante peut-être --Wrap = symbole peut vous aider. Un très bon exemple peut être trouvé ici: Man LD P>