Contenu | Rechercher | Menus

Annonce

Si vous rencontrez des soucis à rester connecté sur le forum (ou si vous avez perdu votre mot de passe) déconnectez-vous et reconnectez-vous depuis cette page, en cochant la case "Me connecter automatiquement lors de mes prochaines visites".
Test de l'ISO d'Ubuntu francophone : nous avons besoin de testeurs pour la version francophone d'Ubuntu 14.04. Liens et informations ici.

Attention, une faille de sécurité dans bash a récemment été rapportée, il est recommandé de mettre à jour son système (plus de détails)

#1 Le 06/07/2013, à 21:55

dva2tlse

profilage

Bonjour, bonsoir le forum,
ce post fait suite à ces autres : http://www.developpez.net/forums/d13567 … voire-cpp/ et http://forum.ubuntu-fr.org/viewtopic.php?id=1310981, où je demandais quel langage de programmation choisir entre le fortran et le C voire le C++. J'ai finalement choisi de coder en fortran, parce que c'est le langage que je connais le mieux, et que j'envisage par la suite que la plupart du travail soit effectuée en parallèle sur plusieurs processeurs. (il y a des serveurs de calcul qui tournent déjà sur quarante proc's dans ma boite, pour d'autres applications)
Le travail en question est la traduction d'un fichier d'entrée d'environ deux millions de lignes, en une suite de valeurs numériques déterminées d'après les informations de chaque ligne, et avec d'autres infos que l'on récupère dans deux autres fichiers d'entrée de quelques centaines de lignes chacun; on m'a informé sur ce forum ou sur celui de développez.com où j'ai exposé le problème aussi, que le travail en question s'apparentait à un "jointure" de bases de données.
La première fois où le programme a tourné correctement jusqu'au bout, il a mis environ vingt minutes; suite aux discussions sur les forums, j'en suis arrivé à deux minutes environ (en améliorant sensiblement la logique de l'algo et les I/O), et aujourd'hui vendredi, en passant d'une vieille HP9000 à bout de souffle, à un bon PC sous linux avec un (seul) processeur itanium, j'en suis à 21 secondes.
  Avant cela, je voudrais, comme cela m'a été conseillé dans un post, profiler la tâche; maintenant qu'elle tourne bien, ça me permettrait de gagner encore ce qui peut l'être. Cependant le programme est assez peu découpé, et ne présente qu'un seul programme principal de six cents lignes environ; cela n'empêcherait-il pas le profilage d'être efficace ?
Merci de me donner  toutes les idées, même farfelues, que vous inspire ce post', car n'étant pas informaticien mais mécanicien (en calcul de structures), mon imagination et mes connaissances sont assez pauvres dans ces domaines,
merci encore,

Dernière modification par dva2tlse (Le 07/07/2013, à 13:35)


P.S.: Dis toto, pourquoi l'univers existe-t'il ?
Je vais y réfléchir avec Morphée et lui dès avant 22h55, donc ici, il faut se contacter auparavant.

Hors ligne

#2 Le 09/07/2013, à 13:06

Michel SIMIAN

Re : profilage

Bonjour,

Il existe des outils de mesure des temps de passage de ton programme, pour chaque fonction par exemple. Si ton programme est peu découpé (j'ai cru comprendre que cela voulait dire en peu de fonctions distinctes), le profilage automatique ne t'apportera pas beaucoup d'information. Rien ne t'empêche d'essayer,mais généralement, les options -pg ne gèrent que les fonctions.

Sinon, il faut alors que tu "profiles" à la main :

- isoler les blocs d'instructions, boucles principalement, ou tu peux supposer gagner du temps
- avant chaque entrée dans le bloc, appeler une fonction qui stocke le temps ou l''affiche en console
- juste après chaque sortie de bloc, appeler une fonction qui stocke le temps ou l'affiche en console

Ensuite, il te faudra effectuer un calcul des temps de passage par bloc en relisant les temps affichés ou stockés (attention, il y a certainement des temps internes de blocs encapsulés dans d'autres...)

Tu devras développer ces fonctions toi-même.

Hors ligne

#3 Le 09/07/2013, à 18:01

dva2tlse

Re : profilage

Bonjour Michel,
en effet mon programme est peu découpé (une seule fonction à ce jour, dont le rôle n'est que temporaire pour vérification en attendant que tout marche) mais ça m'intéresse de connaître les temps de passage aux divers points que je choisirai; mais comment faire ? Existe-t'il une fonction gettime() comme en C, ou un équivalent quelconque que je pourrais utiliser à ma guise ?


P.S.: Dis toto, pourquoi l'univers existe-t'il ?
Je vais y réfléchir avec Morphée et lui dès avant 22h55, donc ici, il faut se contacter auparavant.

Hors ligne

#4 Le 10/07/2013, à 13:38

claudius01

Re : profilage

Bonjour,

Sauf erreur de ma part, gprof et ce tutorial devraient t'aider voire répondre à ton problème.
De plus, un profilage de l'extérieur est beaucoup plus efficace qu'un profilage par instrumentation intérieure à la mano.
Pou finir, les méthodes gettime() ou gettimeofday() ont un coût non négligeable et ne permettent pas de comptabiliser le nombre de passages dans une fonction (une fonction qui se déroule en peu de temps cpu peut être catastrophique si elle est appelée des milliers de fois par seconde ;-)


Cordialement, A+
--
Claudius

Dernière modification par claudius01 (Le 10/07/2013, à 15:07)

Hors ligne

#5 Le 10/07/2013, à 16:26

dva2tlse

Re : profilage

Merci claudius,
j'ai trouvé ce matin à mon boulot une subroutine qui semble faire partie des fonction intrinsèques de mon gfortran, et qui donne la date et l'heure, donc pour l'instant ça me suffira pour le profilage sommaire que j'ai à faire.


P.S.: Dis toto, pourquoi l'univers existe-t'il ?
Je vais y réfléchir avec Morphée et lui dès avant 22h55, donc ici, il faut se contacter auparavant.

Hors ligne

#6 Le 10/09/2013, à 10:38

dva2tlse

Re : profilage

Bonjour le forum,
je reprends ce fil pour demander si quelqu'un saurait comment surveiller la quantité de mémoire qu'utilise le programme à différents moments.
  En effet, j'ai commencé à paralléliser ce programme avec openMP, et il fonctionne assez bien sur deux threads; mais dès que j'essaye d'en utilise plus, il se produit une "Memory fault" (et non pas une "Segmentation fault", dont je sais où chercher la cause)
  Donc je voudrais surveiller la mémoire qui est utilisé à différents moments, pour connaître les possibilités éventuelles d'augmenter le nombre de threads qui travaillent.
Merci,
David


P.S.: Dis toto, pourquoi l'univers existe-t'il ?
Je vais y réfléchir avec Morphée et lui dès avant 22h55, donc ici, il faut se contacter auparavant.

Hors ligne