8
votes

Meilleure stratégie pour le profilage de la mémoire Utilisation de mon code (open source) et du code 3ème partie (source fermée)

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.

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 __ file__ et __line __ 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

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.

Je ne veux pas vraiment utiliser des outils de profilage de mémoire telles que TotalView ou Valgrind, parce qu'ils font généralement beaucoup d'autres choses (la vérification des limites, etc.) qui semble rendre le logiciel très lent. Une autre raison pour cela est que je veux que cela soit un peu sûr en sécurité - le logiciel utilise MPI que je crois aux processus d'apparition. Je vais essayer de profiler en temps réel afin que je puisse jeter à la journalisation des fichiers ou quelque chose qui peut être lu par un autre processus pour visualiser l'utilisation de la mémoire lorsque le logiciel fonctionne. Cela va également être exécuté dans un environnement Linux.

merci


0 commentaires

7 Réponses :


0
votes

Vous pouvez utiliser le profileur inclus dans Visual Studio 2010 Premium et Ultimate.

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.


1 commentaires

Question modifiée pour refléter que je ne vais probablement pas exécuter cela sous Windows autant que Linux



1
votes

Peut-être Valgrind et l'outil Massif?


1 commentaires

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.



1
votes

Pour suivre la consommation de mémoire en temps réel de mes programmes sur Linux, je trouve simplement le / proc / [pid] / stat . 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 dans un fil ou dans un autre processus. (Sommet de la mémoire ajoute rarement avant ou après des appels de fonction! ...)

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.


0 commentaires

1
votes

Vous pouvez essayer le profileur de la Google Perftools's Perftools:

http://google-perfools.googlecode.com/svn/ Trunk / doc / heppprofile.html

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.

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.


0 commentaires

1
votes

Si vous ne voulez pas utiliser un outil "externe", vous pouvez essayer d'utiliser des outils tels que:

  • MTRACE

    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.

  • dmalloc

    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.

    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.


0 commentaires

0
votes

Je crois que cette question a deux très réponses séparées. Un pour la terre C / C ++. Et une seconde pour la terre Cuda.

sur la CPU:

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.

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é. 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 .

sur le GPU:

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 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).


1 commentaires

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).



2
votes

L'option d'éventuelle liante peut-être --Wrap = symbole peut vous aider. Un très bon exemple peut être trouvé ici: Man LD


0 commentaires