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

MATLAB Discussion :

DLL:encore et toujours


Sujet :

MATLAB

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 11
    Points : 5
    Points
    5
    Par défaut DLL:encore et toujours
    Bonsoir tout le monde!
    Comme l'indique le titre, je suis en train de battre avec des fichiers DLL!
    Je m'explique: j'ai un programme Matlab qui appelle une fonction du type [valeurs retournées]=calcul(valeurs envoyées). Il se trouve que la fonction "calcul" est composée de 6 équations qui au total dépassent les 600 lignes! L'exécution du programme étant un peu longue, je voudrais savoir si le fait de créer une DDL de la fonction "calcul" me permettrait de gagner en temps.

    J'ai donc créer une fonction toute simple qui renvoie la somme de deux entiers:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     function calcul=somme(a,b)
    calcul=a+b;
    Ensuite j'utilise la commande

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     mcc -W lib:Som -T link:lib calcul
    pour obtenir ma DLL! Elle apparait dans mon répertoire de travail! C'est maintenant que les ennuis commencent! Je n'arrive pas utiliser cette DLL et je n'arrive pas à comprendre comment l'appeler! (Som(5,1) me renvoie une erreur...).
    Merci d'avance pour vos pistes, précisions et réponses,
    Bonne soirée,

    Ps: MATLAB Version 7.0.1.24704 (R14) Service Pack 1
    MATLAB Compiler Version 4.1 (R14SP1)

  2. #2
    Expert éminent sénior
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Points : 14 828
    Points
    14 828
    Par défaut
    Je n'ai malheureusement le Compiler et ne peux donc tester mais n'y a-t-il pas déjà une erreur (de typo peut-être) : ta fonction s'appelle somme et dans la ligne de commande tu mets calcul (qui est la variable de sortie de ta fonction).
    Ce serait donc plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mcc -W lib:Som -T link:lib somme
    Et sinon si tu peux mettre le message d'erreur ça peut aider à t'aider.

  3. #3
    Membre averti

    Inscrit en
    Août 2007
    Messages
    302
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 302
    Points : 352
    Points
    352
    Par défaut
    Creer une DLL avec matlab 7.xx n'ameliorera a prioris pas le temps de calcul de la fonction.

    Salutations,

    Gregoire

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Hello!

    En effet, j'ai fais une coquille en recopiant sur le post.....la fonction s'apelle bien somme en non pas calcul. Merci Caro95470.

    Pourquoi je ne devrais gagner en temps de calcul? Je pensais qu'une DLL était un bout de code deja compilé. Du coup, c'est ça de moins à faire et vu la taille de la fonction....

    A+

  5. #5
    Expert éminent sénior
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Points : 14 828
    Points
    14 828
    Par défaut
    Citation Envoyé par Guigui4345 Voir le message
    Pourquoi je ne devrais gagner en temps de calcul? Je pensais qu'une DLL était un bout de code deja compilé. Du coup, c'est ça de moins à faire et vu la taille de la fonction....
    Oui je suis passée à côté de ça....
    Regarde la Une application compilée est-elle plus rapide ?
    en particulier le lien Does the MATLAB Compiler speed up the execution time of MATLAB functions?

    Les solutions qui s'offrent donc à toi (et je sens que ça ne va pas te plaire) sont :
    - améliorer ton code MATLAB
    - le réécrire dans un autre langage (C, C++, Fortran) et le compiler pour en faire un fichier MEX.

  6. #6
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 316
    Points : 52 948
    Points
    52 948
    Par défaut
    Citation Envoyé par caro95470 Voir le message
    Les solutions qui s'offrent donc à toi (et je sens que ça ne va pas te plaire) sont :
    - améliorer ton code MATLAB
    - le réécrire dans un autre langage (C, C++, Fortran) et le compiler pour en faire un fichier MEX.
    Et encore... pour le second point, il semble que les fichiers MEX ne réduisent pas forcément le temps d'exécution... tout dépend du code (présence de structures itératives imbriquées par exemple).

    Sinon, pour revenir à la question initiale, pourrais-tu nous montrer les code de la fonction calcul (même un peu abrégée) ?

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par Dut Voir le message
    Et encore... pour le second point, il semble que les fichiers MEX ne réduisent pas forcément le temps d'exécution... tout dépend du code (présence de structures itératives imbriquées par exemple).

    Sinon, pour revenir à la question initiale, pourrais-tu nous montrer les code de la fonction calcul (même un peu abrégée) ?
    Je suis obligé d'abreger car la fonction fait exactement 1193 lignes. Ca ressemble à ça:

    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
     
    function sensib=calcul_sensib(cde,x1,x2,x3,x4,x5,x6,Te)
     
    global Xc1 Yc1 Zc1 Xc2 Yc2 Zc2 Xc3 Yc3 Zc3 Xc4 Yc4 Zc4
     
    for k=1:4
     
        Sensib1u(k)=(cde(4)*Te)*sin(cde(5)*Te)*cos(cde(6)*Te)+...
        ...
        Sensib12u(k)=sin(x6)*cos(x4)+cos(x4)*sin(x5)^2....
     
    end
     
    sensib=[Sensib1u(1) Sensib1u(2) Sensib1u(3) Sensib1u(4) ;
               ....................................................................];
    Le probleme est que cette fonction est appelé dans un algo d'optimisation, ce qui revient à l'appeler une bonne dizaine (voire plus) de fois par seconde.

    Merci A+

  8. #8
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 316
    Points : 52 948
    Points
    52 948
    Par défaut
    Est-il nécessaire de passer par des variables temporaires ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    function sensib=calcul_sensib(cde,x1,x2,x3,x4,x5,x6,Te)
     
    global Xc1 Yc1 Zc1 Xc2 Yc2 Zc2 Xc3 Yc3 Zc3 Xc4 Yc4 Zc4
     
    sensib=zeros(1,4); % A supprimer si il y a juste 4 valeurs à stocker
     
    sensib(1)=(cde(4)*Te)*sin(cde(5)*Te)*cos(cde(6)*Te)+...
        ...
    sensib(2)=sin(x6)*cos(x4)+cos(x4)*sin(x5)^2....

  9. #9
    Membre averti

    Inscrit en
    Août 2007
    Messages
    302
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 302
    Points : 352
    Points
    352
    Par défaut
    Hello,

    Si c'est pas déjà fait commence par utiliser le profiler.. D'autre part la doc contient toute une partie plutôt bien faite sur l'optimisation de code matlab.

    Une fois que tu ne sais plus comment t'y prendre pour optimiser, il te reste les fichiers MEX (ré-écrire les parties critiques dans un autre langage). Sans connaitre exactement le détail de ton algorithme (mais il est visiblement itératif) d'expérience je ne serais pas étonné que tu arrives à augmenter la vitesse par un facteur 10x environ.


    Salutations,

    Grégoire

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par Dut Voir le message
    Est-il nécessaire de passer par des variables temporaires ?
    Ben je viens de faire le test et je ne gagne quasiment rien! C'est plutôt normal car je n'ai "que" douze variables locales.
    A+ et merci

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par paradize3 Voir le message
    Hello,

    Si c'est pas déjà fait commence par utiliser le profiler.. D'autre part la doc contient toute une partie plutôt bien faite sur l'optimisation de code matlab.

    Une fois que tu ne sais plus comment t'y prendre pour optimiser, il te reste les fichiers MEX (ré-écrire les parties critiques dans un autre langage). Sans connaitre exactement le détail de ton algorithme (mais il est visiblement itératif) d'expérience je ne serais pas étonné que tu arrives à augmenter la vitesse par un facteur 10x environ.


    Salutations,

    Grégoire
    Le profiler....hum??? Bon avant de poser des questions et surement déjà traitées, je vais travailler un peu de mon côté pour decouvrir cet outil!!!
    Merci pour la piste!

  12. #12
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Me revoilou!!
    J'ai finalement opté pour vos solutions! J'ai donc ré-écrit en C la fonction calcul sensib puis j'en ai fait une ddl que j'appelle dans mon prog Matlab! Le résultat est décoiffant, je passe de 15,534s à 3.577s !!!!!!!!!
    Merci bcp à vous pour le coup de main,
    Cordialement

Discussions similaires

  1. Encore et toujours libmysql.dll
    Par Shiva dans le forum Bases de données
    Réponses: 23
    Dernier message: 13/07/2013, 15h29
  2. Clic droit encore et toujours
    Par Stéphane Olivier BERNARD dans le forum Access
    Réponses: 3
    Dernier message: 22/05/2006, 00h26
  3. IE/Firefox... encore et toujours...
    Par maniaco_jazz dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 19/02/2006, 23h17
  4. nodes, child et compatibilité... encore et toujours
    Par pmithrandir dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 28/04/2005, 14h26
  5. stencil buffer, encore et toujours
    Par JAimeBienCoderBourre dans le forum OpenGL
    Réponses: 4
    Dernier message: 08/04/2005, 11h16

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