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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 98
    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 éclairé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    410
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 410
    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 éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 98
    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 éclairé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    410
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 410
    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 éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 98
    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 confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    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.

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 98
    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 confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    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.

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 98
    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 Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    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
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Consulter la discussion parue sur le forum C++
    http://www.developpez.net/forums/sho...d.php?t=330639

    C'est vrai que l'ordre du traitement peut influer sur le temps de calcul à cause de ces problèmes de cache pour de grosses matrices. Le code utilisé est transcrit du Fortran sans tenir compte de l'ordonnancement différent des tableaux en C.
    J'ai vérifié en effet que si au lieu de calculer les éléments de la matrice résultat dans cet ordre (disons ligne après ligne) on les calcule colonnes après colonnes et si je copie localement chaque colonne de la deuxième matrice pour calculer une colonne du résultat, le temps de calcul est divisé par 3.
    Ce facteur 3 n'existe pas pour de petites matrices (< 200*200 sur ma machine) et les temps sont comparables.

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

    Informations forums :
    Inscription : Juillet 2004
    Messages : 410
    Par défaut
    En effet je viens de tester en créant une matrice temporaire qui correspont à la transposé de B et apres je fais la multiplication ligne à ligne et au final j'ai un temps de calcul qui est de 2.3s contre 12.5s avec le meme langage

  13. #13
    Expert confirmé

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par diogene
    Ce facteur 3 n'existe pas pour de petites matrices (< 200*200 sur ma machine) et les temps sont comparables.
    Je pense que cela provient uniquement de la taille du "chunk" de mémoire alloué à un programme par défaut par le loader...

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