Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 23/06/2013, à 21:16

dva2tlse

fortran ou C, voire C++ ?

Bonjour le forum,
mon métier est le calcul de structures, dans l'aéronautique; il consiste, quand mes collègues dessinateurs ont fait les plans d'une pièce ou d'un assemblage de pièces, à vérifier par le calcul si c'est assez léger pour décoller puis assez solide pour ne pas casser en vol.
Je vais prochainement devoir améliorer sérieusement un programme que j'ai commencé à faire; c'est une vulgaire moulinette séquentielle, qui traduit des codes qu'elle trouve dans un premier fichier d'entrée, à l'aide de données se trouvant dans deux autres fichiers, pour fabriquer un fichier de sortie qui est une image modifiée du premier fichier d'entrée.
Il se trouve que le premier fichier d'entrée fait environ deux millions de lignes, et les deux autres quelques centaines seulement, et le traitement complet dure environ cinq minutes; il faudrait s'arranger pour que ce processus soit réalisable trois cent mille fois en une semaine; soit en six cent mille secondes, ce qui fait que le processus unitaire devrait durer deux secondes au lieu de cinq minutes. (gain d'un facteur 150)
Il est bien évident que l'on va changer de machine; un linux itanium tourne déjà près de six fois plus vite que la vieille HP 9000 où il y a le compilateur fortran que j'utilise pour l'instant, mais on pourrait gagner un peu plus s'il le faut vraiment.
Il doit également être possible d'utiliser un compilateur le plus performant possible pour cette application.
Par ailleurs dans le programme, certaines boucles de recherche parcourent entièrement les deux petits fichiers d'entrée, et je vais m'employer à ce que les variables puissent être trouvées par indexation, donc directement et sans recherche.
Toujours dans le code, je vais m'arranger pour qu'aucune partie de test ne se fasse deux fois.

Mais j'ai peur que cela ne suffise pas.

En me présentant ces objectifs, mon chef à évoqué du développement en C ou C++; je connais un peu le C, que j'utilise séquentiellement, exactement comme du fortran; alors est-ce que le basculement vers ce langage pourrait nous faire gagner du temps d'exécution ?
Et qu'en est il du C++ ? Je connais très peu la POO (je n'ai jamais fait qu'un seul développement en python) mais il me semble que cette structure de langage ne changerait pas grand chose.

Que pensez vous de tout ça ?
Merci de me donner toutes vos impressions, même les plus farfelues, parce qu'il me faut vraiment faire feu de tout bois pour y arriver.
David

Dernière modification par dva2tlse (Le 18/06/2021, à 16:16)


xubuntu 22.04 dans un PC assemblé
PS: 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 23/06/2013, à 21:37

pires57

Re : fortran ou C, voire C++ ?

La réponse que je te donnerais pour le choix du langage c'est :
prend celui que tu maîtrises le mieux.

Pour ce qui est de la rapidité d'éxécution, c'est la qualité du code que tu doit revoir et effectivement les options de compilations, quel que soit le langage choisi, si tu codes ne codes pas correctement alors tu auras des pertes de performances.


Utilisateur d'Archlinux, Ubuntu et Kali Linux
Administrateur système et réseau spécialisé Linux.
LinkedIn

Hors ligne

#3 Le 23/06/2013, à 21:38

nesthib

Re : fortran ou C, voire C++ ?

Est-ce qu'il serait possible de donner un exemple du type de « moulinette » que tu cherches à effectuer ? Ce sont quel types de calculs/recherches ?
Je pense que même si un changement de langage peut apporter de meilleures performance, réfléchir à un bon algorithme et à l'optimisation de ton problème t'apportera le meilleur gain de performances.
Enfin, de ce que je comprends, tes fichiers sont des fichiers texte ? Serait-il imaginable d'utiliser une autre approche (ex. base de données) ?


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

#4 Le 24/06/2013, à 08:09

dva2tlse

Re : fortran ou C, voire C++ ?

Bonjour les tous,
j'arrive au boulot ce matin et j'ai le grand plaisir de découvrir qu'on m'a déjà répondu cette nuit. (enfin hier soir, mais je devais dormir)

@pires57:
En effet, quand mon chef m'a parlé d'apprendre le C++, ça m'a fait un peu peur, et donc je pense que je vais en effet me limiter au fortran que je connais pas trop mal.


@nesthib:
Comme tu l'as deviné, tous les fichiers sont bien du texte, entrées comme sorties.

Ce que j'appelle une moulinette est une application console qui tourne toute seule, sans interaction de l'utilisateur.
  Ici on lit une ligne du premier fichier d'entrée, puis une partie de cette ligne est un code qui envoie chercher une donnée dans le deuxiÉme fichier, qui à son tour envoie rechercher une donnée du troisiÉme fichier; d'autres portions de la premiÉre ligne ont le même rôle, et on en combine jusqu'à cinq résultats intermédiaires par de simples additions et multiplications avant d'écrire le résultat dans le fichier de sortie.
  Le premier fichier fait environ deux millions de lignes, et il y en aura environ trois cent mille du même genre.
 
  Je me suis aperçu dans la nuit (j'y pense même la nuit, tellement ça me tracasse et m'intéresse) donc j'ai pensé pendant la nuit qu'une autre perspective d'amélioration est de paralléliser le travail, puisque nous avons des machines qui ont jusqu'à 40 proc's.
 
En ce qui concene un éventuel changement d'approche, comme passer par une base de données, j'en parlerai demain en début d'aprÉs-midi à l'occasion d'une réunion qui se tient sur le sujet pour évoquer les pistes d'amélioration possibles; mais je ne connais pas bien toutes les possibilités d'utilisation des BDD, et comme tout le dit pires57 ci dessus, je serais plus à l'aise dans un travail sur un produit que je connais bien. (comme le fichier texte !)

merci encore,
David


xubuntu 22.04 dans un PC assemblé
PS: 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

#5 Le 24/06/2013, à 08:39

nicolas66

Re : fortran ou C, voire C++ ?

Les opérations que tu effectues entre tes fichiers s'apparentent à des jointures. Les BDD permettent de gérer cela facilement et rapidement. Difficile en revanche de donner un facteur de gain précis.

Dernière modification par nicolas66 (Le 24/06/2013, à 08:41)


"The computer was born to solve problems that did not exist before." (B. Gates)

Hors ligne

#6 Le 24/06/2013, à 08:47

grim7reaper

Re : fortran ou C, voire C++ ?

Salut,

Comme les autres l‘ont dit, oui en changeant de machine/compilo/langage tu peux y gagner.
Mais bon, un facteur 150 entre le C, le Fortran et le C++ je n‘y crois pas trop.
De même en changeant de compilo’. J‘ai déjà vu un facteur 5, ce qui est déjà assez énorme, entre du code Fortran compilé par gfortran et ifort, mais 150 j’en doute.
Clairement, je pense que c’est un problème d‘algorithmie.

dva2tlse a écrit :

  Ici on lit une ligne du premier fichier d'entrée, puis une partie de cette ligne est un code qui envoie chercher une donnée dans le deuxiÉme fichier, qui à son tour envoie rechercher une donnée du troisiÉme fichier; d'autres portions de la premiÉre ligne ont le même rôle, et on en combine jusqu'à cinq résultats intermédiaires par de simples additions et multiplications avant d'écrire le résultat dans le fichier de sortie.
  Le premier fichier fait environ deux millions de lignes, et il y en aura environ trois cent mille du même genre.

Je ne sais pas comment est ton code, mais si je me base sur la description que tu donnes, je crois comprendre que pour chaque ligne que tu lis dans le gros fichier, tu vas lire dans les petits.
Comment est-ce que tu fais tes recherches ?
Je pense que c’est là que tu dois perdre le plus de temps (si ce n‘est pas fait comme il faut).

Dernière modification par grim7reaper (Le 24/06/2013, à 10:46)

Hors ligne

#7 Le 24/06/2013, à 11:03

dva2tlse

Re : fortran ou C, voire C++ ?

J'avais commencé par faire mes recherches par une vulgaire boucle while qui parcourait tout le deuxiÉme fichier jusqu'à avoir trouvé la bonne valeur issue du premier, puis aprÉs analyse de la ligne il fallait trouver de la mÁme façon dans le troisiÉme fichier la valeur finale.
Ce sont évidemment ces recherches qui sont longues, et je suis en train de modifier la façon dont sont lus initialement les deux petits fichiers pour que les valeurs qu'ils contiennent puissent Átre directement atteintes par indexation, sans avoir à tout faire défiler avec comparaison à chaque pas.


xubuntu 22.04 dans un PC assemblé
PS: 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

#8 Le 24/06/2013, à 11:55

grim7reaper

Re : fortran ou C, voire C++ ?

Ha oui, c’est terrible pour les perf’ cette approche hmm
Je ne sais pas comment sont tes données, mais si tu parles d‘indexation je pense qu’une table de hashage peut être très utile si tu peux en utiliser une.
En C++, c‘est dispo de base. En C non, mais ça se fait relativement bien (au pire, il y a des bibliothèques).
Bon pour le Fortran, comme d’hab dès qu’on sort du number crunching, bah c‘est laborieux… Mais ça doit se faire, ou se trouver déjà fait quelque part. À voir.

Mais selon la façon dont tu indexes tes données, peut-être qu’un tableau est suffisant.

Dans tout les cas, si tu peux accéder par indexation plutôt que faire des boucles naïves à chaque fois, tu devrais avoir un bon boost de performance.

Dernière modification par grim7reaper (Le 24/06/2013, à 11:56)

Hors ligne

#9 Le 24/06/2013, à 13:01

dva2tlse

Re : fortran ou C, voire C++ ?

L'indexation se fera par le remplissage de tableaux dès la lecture de deux petits fichiers de données, donc ça devrait bien accélérer les choses.
Merci à tous de vos commentaires


xubuntu 22.04 dans un PC assemblé
PS: 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

#10 Le 24/06/2013, à 14:18

pires57

Re : fortran ou C, voire C++ ?

effectivement, les bases de données te permettront un gain de performances, tu devrais t'y lancé.
Pour ce qui concerne le parallelisme, c'est une bonne idée que tu doit pouvoir mettre en oeuvre en fortran.
Pour un gain de performance, verifie les boucles au niveau de ton code, il est possible que certaines boucles soit inutiles.


Utilisateur d'Archlinux, Ubuntu et Kali Linux
Administrateur système et réseau spécialisé Linux.
LinkedIn

Hors ligne

#11 Le 24/06/2013, à 15:05

nesthib

Re : fortran ou C, voire C++ ?

C'est donc bien ce que je pensais, si tu dois faire (comme le dit nicolas66) une jointure sur tes petits fichiers, autant tout mettre en mémoire et utiliser une table de hachage. Tu gagneras AMHA beaucoup plus en performance que via des optimisation de compilation (ce qui ne t'empêche pas de le faire en parallèle).

Si tu veux plus de conseils sur la partie algo, je te suggère de donner des extraits de ces fichiers wink


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

#12 Le 29/10/2017, à 20:47

tibousow

Re : fortran ou C, voire C++ ?

bonjour, svp
je cherche comment faire une jointure hachage sur deux tableaux en c
merci

Hors ligne

#13 Le 31/10/2017, à 10:10

mandeb

Re : fortran ou C, voire C++ ?

bonjour,
Ne connaissant pas le C je m'orienterais vers Python : il possède une structure de dictionnaires "built-in" dont le chargement à partir d'un fichier txt se fait en 1 ligne (fonction eval).
Les 2 "petits" fichiers seront à transférer dans des dicos une seule fois au départ et les recherches séquentielles à partir du "gros" fichier devraient être grandement accélérées pour la suite.
Reste à faire des test pour voir le gain en rapidité et s'il se montre suffisant par rapport à tes contraintes...

Hors ligne