IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

fortran vs C


Sujet :

C

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 98
    Points : 107
    Points
    107
    Par défaut fortran vs C
    Bonjour à tous,

    Je cherche à comparer les vitesses d'exécution de codes C et fortran identiques (pour faire de la prog scientifique) et j'obtiens des résultats curieux.
    Sachant que :
    • le programme utilisé est un simple produit de matrices 1000*1000, la subroutine qui prend du temps est donnée juste après
    • le compilo C est mingw-gcc et le compilo F95 est Lahey Fortran
    • options de compil optimales


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    void multiplie(double ***pointeur1, double ***pointeur2, double ***pointeur3, int taille)
    {
    	int i, j, k;
    	for (i=0;i<taille;i++)
    	{
    		for (j=0;j<taille;j++)
    		{
    			(*pointeur3)[i][j] = 0.0E0;
    			for (k=0;k<taille;k++)
    			{
    				(*pointeur3)[i][j]+=(*pointeur1)[i][k]*(*pointeur2)[k][j];
    			}
    		}
    	}
    }
    le calcul fortran est 5 fois plus rapide que le calcul C (les résultats étant rigoureusement identiques)
    Je ne comprends pas cette différence aussi flagrande ...

    Une idée ?

    Merci !

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    410
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 410
    Points : 361
    Points
    361
    Par défaut
    pourquoi tu passes l'adresse de l'adresse de la matrice?

    test ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void multiplie(double **pointeur1, double **pointeur2, double **pointeur3, int taille)
    {
    	int i, j, k;
    	for (i=0;i<taille;i++)
    	{
    		for (j=0;j<taille;j++)
    		{
    			pointeur3[i][j] = 0.;
    			for (k=0;k<taille;k++)			
    				pointeur3[i][j]+=pointeur1[i][k]*pointeur2[k][j];		
    		}
    	}
    }
    donne tes temps pour voir avec et sans optimisations

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 98
    Points : 107
    Points
    107
    Par défaut
    Citation Envoyé par reptils
    pourquoi tu passes l'adresse de l'adresse de la matrice?
    c'est en essayant plusieurs trucs (je suis en train d'apprendre...)

    Suite à ta modif, j'ai les mêmes temps :
    - optimisation "level 3" : 12.7s
    - optimisation "level 1" : 15.3s

    et fortran, 2.8s

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    410
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 410
    Points : 361
    Points
    361
    Par défaut
    je vais tester de mon coté voir... en fortran tes matrices sont allouées statiquement ou dynamiquement?

    EDIT: tu peux me montrer ton equivalent en fortran stp?

    EDIT2: est ce que tu peux tester avec un autre compilo fortran genre g95 ou gfortran? genre avec un compilo non commercial

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 98
    Points : 107
    Points
    107
    Par défaut
    merci pour ta participation !

    Les matrices sont allouées dynamiquement, mais là, j'ai quitté le boulot, je posterai ça demain après mes cours. Effectivement, je n'ai pas pensé à tester g95...

    bonne soirée

  6. #6
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Je suppose qu'en Fortran tu as des tableaux bi-dimentionnel, ici tu as un tableau unidimentionnel de pointeur vers tableau unidimentionnel. Tu prends plus de memoire et tu as une indirection de plus a chaque etape.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 98
    Points : 107
    Points
    107
    Par défaut
    Je suppose qu'en Fortran tu as des tableaux bi-dimentionnel
    effectivement

    ici tu as un tableau unidimentionnel de pointeur vers tableau unidimentionnel. Tu prends plus de memoire et tu as une indirection de plus a chaque etape.
    ouïe ! je débute. Peux-tu m'expliquer ou me donner une référence à potasser ?

    merci !

  8. #8
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par afrancisco
    ouïe ! je débute. Peux-tu m'expliquer ou me donner une référence à potasser ?
    Je suis mal place pour donner des references adequates aux debutants. Cherche dans les archives et ailleurs sur le site... mais je ne garanti la qualite de rien.

    Je peux par contre te donner le conseil d'arreter de t'occuper des performances tant que tu ne maitrise pas le C.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 98
    Points : 107
    Points
    107
    Par défaut
    Je peux par contre te donner le conseil d'arreter de t'occuper des performances tant que tu ne maitrise pas le C.
    Sage conseil ... cependant, le dilemne est celui-ci :
    • si C et fortran donnent des temps d'exécutions équivalents en calcul scientifique, alors je m'impliquerai à fond dans C, puisqu'il offre plus de possibilités d'interfaçage graphique (je dois faire du calcul scientifique intensif, avec des IHM pas trop moches)
    • si de toute façon C est moins rapide, je le laisse tomber (pour le boulot du moins)

    je cherche donc à répondre à cette question ...

  10. #10
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Citation Envoyé par afrancisco
    si C et fortran donnent des temps d'exécutions équivalents en calcul scientifique, alors je m'impliquerai à fond dans C, puisqu'il offre plus de possibilités d'interfaçage graphique (je dois faire du calcul scientifique intensif, avec des IHM pas trop moches)
    Dans ce cas-la, en general, on utilise les deux: le coeur calculatoire en Fortran, avec les cliquodromes en C (ou C++, Tcl/Tk, Python, IDL, ...)

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 98
    Points : 107
    Points
    107
    Par défaut
    J'y ai bien pensé, mais dans le cas où j'ai un calcul très long, j'affiche une progressbar, j'ai donc du code scientifique et du code IHM mêlés ... je ne vois alors pas comment séparer les deux pour utiliser du fortran compilé appelé par du C.

  12. #12
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Citation Envoyé par afrancisco
    J'y ai bien pensé, mais dans le cas où j'ai un calcul très long, j'affiche une progressbar, j'ai donc du code scientifique et du code IHM mêlés ... je ne vois alors pas comment séparer les deux pour utiliser du fortran compilé appelé par du C.
    Le plus simple est certainement d'avoir deux processus indépendants (deux execs si tu préfères). La GUI crée les fichiers d'initialisations (éventuellement, des scripts shell) selon les préférences de l'utilisateur, puis lance l'exec qui fait les calculs. Ce dernier met à jour un fichier de temps en temps. Ce fichier est lu par la GUI pour connaitre l'état d'avancement des calculs. Ainsi, tu as une séparation complète des deux.

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 98
    Points : 107
    Points
    107
    Par défaut
    ...Ce fichier est lu par la GUI pour connaitre l'état d'avancement des calculs. Ainsi, tu as une séparation complète des deux.
    Yes ! et peut-être même l'écriture sur des ports par fortran, et lecture par la GUI, mais peut-être est-ce une grosse co...ie, à voir ...

    merci en tous cas !

  14. #14
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Citation Envoyé par afrancisco
    Yes ! et peut-être même l'écriture sur des ports par fortran, et lecture par la GUI
    Commence par faire simple. Tu pourras compliquer apres si le besoin s'en fait sentir. Mon expérience me dit que les utilisateurs aiment bien trifouiller les fichiers de contrôle et de sortie générés par les GUI (voire se passer complètement de la GUI...). Il est donc conseillé de faire le plus transparent possible.

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    410
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 410
    Points : 361
    Points
    361
    Par défaut
    En tout cas si tu as des bonnes perfs numériques sur fortran c'est je pense en parti du au fait que tu utilise un compilo commerciale optimisé pour les calculs numériques. Si t'en fait de meme en C peut etre que tu auras des temps comparables.... L'experience montre que généralement (sauf calculs spécifics) c'est kiff kiff.

    Perso je ferai du tout en un avec un langage si c'est possible

  16. #16
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 386
    Points
    20 386
    Par défaut
    Citation Envoyé par afrancisco
    J'y ai bien pensé, mais dans le cas où j'ai un calcul très long, j'affiche une progressbar, j'ai donc du code scientifique et du code IHM mêlés ... je ne vois alors pas comment séparer les deux pour utiliser du fortran compilé appelé par du C.
    En Fortran c'est pas possible de faire une dll ?
    Sinon oui comme il a été dit faire 2 exe séparément , 2 processus.
    Si tu veux faire tous les calculs en C il faut faire de la programmation multithreading:

  17. #17
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 916
    Points
    17 916
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par afrancisco
    J'y ai bien pensé, mais dans le cas où j'ai un calcul très long, j'affiche une progressbar, j'ai donc du code scientifique et du code IHM mêlés ... je ne vois alors pas comment séparer les deux pour utiliser du fortran compilé appelé par du C.

    très facile....

    Mais pas pour débutants...

    Faire des fonctions "vides" d'interfaçage, non liées à un outil en particulier, et suivant l'outil fabriquer cette fonction et la "linker" pour obtenir le bon exécutable..

    Mais il faut très bien connaître les pointeurs, les structures, les appels croisés Fortran/C, etc...
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  18. #18
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    410
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 410
    Points : 361
    Points
    361
    Par défaut
    j'ai tenté une fois ou deux la cross compilation... c'est du sport!
    car meme en fortrn on doit faire face au probleme de name mangling avec un "_" ou pas devant les appels etc...

    peut etre que je m'y étais mal pris, mais en tout cas j'avais galéré pour faire reconnaitre des deux bestiaux

    EDIT: sinon on a testé au labo ton cas et bizarement meme des compilo light tels que gfortran ou g95 sont un poil plus rapides que le compilo gcc (mingw)
    mingw32-gcc: 12.5sec
    g95: 10.2sec
    gfortran: 9.5sec

    mais si tu utilises la subroutine intrinsèque "matmul" c'est normal que tu puisses atteindre les 2.8 sec (gfortran y arrvie aussi).

    Ce qui me chagrine c'est que dans un cas simple et equivalent de calcul (boucle de boucle de boucle) le c est plus lent => (compilo / langage?)

  19. #19
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 98
    Points : 107
    Points
    107
    Par défaut
    Bonjour à tous,

    bon, mes cours sont erminés

    En Fortran c'est pas possible de faire une dll ?
    si, mais les prog doivent pouvoir tourner sur linux

    Mon expérience me dit que les utilisateurs aiment bien trifouiller les fichiers de contrôle et de sortie générés par les GUI (voire se passer complètement de la GUI...)
    c'est vrai, on a eu des retours dans ce sens
    ----------------------------------------------------------
    Voici le code fortran que j'ai utilisé (très classique, sans matmul)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
          subroutine mult(tab1, tab2, tab3, taille)
          implicit none
          double precision, intent(inout) :: tab1(:,:), tab2(:,:), tab3(:,:)
          integer, intent(in) :: taille
          integer :: i, j, k
             do i = 1, taille
                do j = 1, taille
                   tab3(i, j) = 0.0d0
                   do k = 1, taille
                      tab3(i, j) = tab3(i, j) + tab1(i, k)*tab2(k, j)
                   enddo
                enddo
             enddo
          return
          end subroutine mult
    donc identique au code C.

    Avec le compilo g95, niveau d'opt 3, j'ai 7.8s donc 50% plus rapide qu'avec mingw32-gcc.
    Avec un compilateur C du commerce en "/K fast" j'ai le même temps qu'avec mingw32-gcc.

    Je m'oriente donc, a priori, vers la solution suivante :
    - GUI en C, librairie du style GTK ou wxwidgets
    - executables fortran qui récupèrent les arguments de la ligne de commande

    les échanges entre les 2 se feront par fichiers interposés, à fréquence définie par la GUI au lancement de l'exe

    Normalement, les 2 sources pourront être compilés sur des os différents, sans changement des codes.

    Merci à tous pour votre participation à la discussion !

  20. #20
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par afrancisco
    Voici le code fortran que j'ai utilisé (très classique, sans matmul)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
          subroutine mult(tab1, tab2, tab3, taille)
          implicit none
          double precision, intent(inout) :: tab1(:,:), tab2(:,:), tab3(:,:)
          integer, intent(in) :: taille
          integer :: i, j, k
             do i = 1, taille
                do j = 1, taille
                   tab3(i, j) = 0.0d0
                   do k = 1, taille
                      tab3(i, j) = tab3(i, j) + tab1(i, k)*tab2(k, j)
                   enddo
                enddo
             enddo
          return
          end subroutine mult
    Souviron34 pourra peut-etre confirmer (cela fait 20 ans que j'ai plus fait de Fortran...). En Fortran j'aurais inverse les boucles sur i et j (en Fortran les elements d'un tableau bi-dimentionel avec la seconde dimention constante sont consecutif en memoire, en C ce sont les elements avec la premiere dimention constante qui le sont). C'est plus gentil pour les caches.

    Je m'oriente donc, a priori, vers la solution suivante :
    - GUI en C, librairie du style GTK ou wxwidgets
    - executables fortran qui récupèrent les arguments de la ligne de commande

    les échanges entre les 2 se feront par fichiers interposés, à fréquence définie par la GUI au lancement de l'exe

    Normalement, les 2 sources pourront être compilés sur des os différents, sans changement des codes.
    Je ne suis pas sur que ce soit la bonne solution. Ce n'est pas si complique que cela d'avoir du Fortran qui appelle du C et inversement.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

Discussions similaires

  1. Problème en interfacant C et Fortran
    Par karl3i dans le forum MFC
    Réponses: 6
    Dernier message: 23/05/2006, 16h10
  2. Compilateur Fortran
    Par badrou dans le forum Fortran
    Réponses: 3
    Dernier message: 28/11/2004, 20h39
  3. accès fortran à une base / utilisation des "bytea"
    Par bdkiller dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 05/11/2004, 08h31
  4. Simulateur fortran
    Par kaczmarek dans le forum Linux
    Réponses: 1
    Dernier message: 28/07/2004, 17h55
  5. [TP]Portage d'un encodeur MP3 Fortran en pur Pascal...
    Par Christophe Fantoni dans le forum Turbo Pascal
    Réponses: 11
    Dernier message: 04/07/2003, 17h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo