Conversion Matlab -> C, utile ?

Bonjour bonjour,

Bon asseyez-vous cinq minutes que je raconte ma vie.
Alors voilà je suis actuellement en stage chez un monsieur (très gentil) qui s’est codé une espèce d’énorme truc en Matlab (v.7 pour être précis) avec plein de fonctions qui font des calculs sur d’énormes (vraiment énormes) tableaux. Du style calcul de l’entropie, du rapport signal sur bruit etc… Or certains de ces calculs sont parfois longs, enfin c’est relatif ça ne dure pas des heures je dirais au maximum 5-10min pour les plus longs, mais en contexte expérimental ça peut devenir pénible.
Ma question est, à votre avis, y aurait-il un gain de temps non négligeable à coder les fonctions les plus lentes en C et à les interfacer ensuite avec Matlab ? Il n’a pas fait ça n’importe comment tout de même il utilise les fonctions préprogrammées etc et Matlab est tout de même bien fait mais bon interprété vs compilé toussa toussa.
'fin voilà j’voulais juste votre avis avant de présenter la chose au dit monsieur. B)
Mici.

edit : ortho

Par rapport a ton projet, je sais pas trop si c’est valable mais perso, j’ai fait en stage (y a longtemps B) ) un projet de compression d’image via un reseau de neurones, et j’ai programme la compression/decompression sous matlab. La compression mettait environ 20 min pour une image de 500k (genre) sur un p90 (oui c’etait top a l’epoque).
J’ai reprogramme en C la meme chose sur un 486 et ca mettait une 10aine de seconde.

wiiiiz

Alors peut etre que mon prog matlab etait naze, mais quand meme.

LoneWolf
Osons les multiplications par 2 pour faire des decalages de bits.

huhuhu
Ah oui là en effet c’est loin d’être négligeable dis donc. Si je peux passer de quelques minutes d’attente à “ah bah c’est déjà fini ?!” ce serait assez sympathique !
Merci de la réponse, j’vais voir si je peux coder ça discrétos, tester et si c’est concluant je proposerai l’idée.
Mais euh dans ce cas il me faudrait ptet une librairie d’algèbre linéaire, genre pour faire des produits de matrices rapides etc sans tout me retaper. Non ?

Euh, il y a des fonctionnalités de Matlab que va bien avoir du mal a coder en C pur… Prends par exemple l’operateur “” qui effectue une resolution en moindre carré par exemple. Si ton code en est blinde, tu vas avoir du taf… De meme que les operateurs de type a[.]…

Pour une librairie d’algebre lineaire, BLAS ou LAPACK sont tes amis.

Ouais je sais je sais, je n’ai pas l’intention de tout adapter, parce que bon Matlab est tout de même bien sympa pour tout ce qui est calcul matriciel, mais il y a des petites portions bien longues niveau temps et qui ne font pas vraiment appel à des fonctions particulières.
Enfin tout ceci n’est encore qu’à l’état d’idée.

Merci bien, même si je ne m’en sers pas cette fois-ci ce sera toujours utile !

edit : Je viens de voir que ces deux librairies sont utilisées par matlab et que l’on peut s’en servir directement dans une routine C écrite pour Matlab ! Elle est pô belle la vie ? :stuck_out_tongue:

Ca fait longtemps que j’ai pas fait de Matlab, mais il me semble qu’on peut “compiler” un fonction matlab en librairie ou en code utilisable ensuite en C.
J’en ai jamais eu besoin donc j’ai jamais essayé alors je sais pas comment ça se fait et si on gagne en efficacité mais y’a surement toutes les explications qu’il faut entre l’aide de Matlab et le site de Mathworks.

J’espère avoir été vaguement utile B)

Pour avoir cotoyé des matlabors, je confirme que l’export .m -> .c se fait a priori sans problèmes. Dans l’autre sens, j’en sais fichtre rien…

c’est spécifié dans le manuel de l’API et je ne l’ai pas, celui-la. Je pourrai vérifier, si besoin est…

Vectra, collectionneur de cellulose.

J’ai essayé récemment de convertir un code Matlab en C pour accélérer le bazar, et c’était un peu décevant. Par exemple la fonction d’exponentiation de matrice que j’ai réécrite en utilisant BLAS/LAPACK et le même algorithme que Matlab était un chouilla plus lente que celle de Matlab. Le truc c’est que toutes les fonctions natives de Matlab sont optimisées à mort, c’est très très dur de faire mieux. Même là où on pense que Matlab perd du temps il y a des optimisations cachées. Par exemple l’obligation de passer les arguments par valeur : en fait les arguments ne sont effectivement dupliqués dans la fonction appelée que si celle-ci les modifie, sinon matlab garde juste une référence.

Le gain en perfomance dépend donc beaucoup de l’état du code initial. Dans un programme Matlab, la lenteur provient surtout des défauts de parallélisation et de l’interprétation du code source. Pour donner un ordre d’idée :

for i=1:1000 c(i)=a(i)+b(i); end
prend grosso modo 10 fois plus de temps que

Si le code original est mal écrit et utilise plein de structures du premier type, tu peux gagner pas mal en rapidité en les optimisant. Pour l’interprétation, ce n’est pénalisant que si le code est très long et utilise des myriades de petites fonctions non natives.

Sinon concernant l’utilisation de fonctions Matlab en C ou C en Matlab (les deux sont possibles), il faut savoir que Matlab a été construit à partir du Fortran, donc tous les tableaux sont en convention “column major” (en C c’est “row major”). De plus les vecteurs complexes sont stockés d’une façon bizarre : toutes les parties réelles d’un côté et toutes les parties imaginaires de l’autre. Du coup, quand tu veux faire quelque chose sur une structure Matlab en C, il faut soit commencer par tout convertir, soit écrire tout son code en en tenant compte et renoncer à utiliser un type complexe.

L’inverse (appeler des fonctions Matlab à partir du C) a aussi son lot de problèmes. En fait, dans ce cas un noyau Matlab tourne en permanence à côté de ton programme, et quand tu appelles une fonction Matlab c’est pour faire une opération dans l’espace Matlab ; tu ne peux rien faire directement sur une structure de ton programme. Il faut donc encore une fois copier et convertir les variables…

Voilà voilà. En résumé mon avis c’est que si le code Matlab à été bien programmé à l’origine, le gain de temps en passant au C risque d’être faible. À toi de voir…

OK, merci pour toutes ces réponses. Oui je savais bien que les fonctions natives de Matlab étaient méga optimisées. Comme mon chercheur préféré n’est pas un idiot il a bien utilisé les constructions type a = b + c plutot que a(i)=b(i)+c(i) et autres rafinnement matlabiens.
Du coup je suis nettement moins partant pour réécrire son truc, assez complexe, pour ne gagner que quelques secondes voire en perdre…
Dilemme, dilemme… Je tenterai peut-être une des fonctions les plus lentes pour voir, quand j’aurai un peu plus de temps.
Merci à tous pour vos avis !

Mouais enfin tu auras quant meme une saut de perf sur les allocations et autres…

J ai fait le test sur un algorithme de tracking bien coder et c est pas comparable au niveau perf.

Mais faudrait deja essayer de comprendre pourquoi certains de tes call prennent du temps tu as un profiler dans matlab. Je commencerai par la moi.

Koubiak

Oui c’est pas bête le coup du profiler. Globalement ça se voit là où ça prend du temps c’est quand il y a de longue boucles for sur un tableau par exemple et que tu ne peux pas ruser avec un T(:,i) ou assimilé par exemple.
Oui les allocations j’y avais pensé mais c’est pareil si en Matlab tu prends soin de ‘déclarer’ ton tableau avant de l 'utiliser, le gain ne sera pas forcément monstrueux si ?

en fonction de l’application du monsieur , tu peux trouver des librairies C tres bien foutu specifique sur le net .

OK
Merci pour toutes les infos,mais je veux une réponse claire:

J’ai du code matlab et je voudrais voir le résultat de la tarduction en C.
Comment pourrais je procéder?

Merci d’avance.

Be tu le codes et tu verras bien…

Koubiak

Quelle commande?

Euh… Je pense pas que ça se fasse tout seul si…
Sinon bonjour à toi hein

Qu’en est il de la commande mcc?

Alors …

Personne ne la connais??

on ne comprends toujours pas ce que tu dis … mcc ? hum je comprends pas…

Koubiak

/me reste calme et distant.

Une rapide recherche dans l’aide de Matlab avec ‘mcc’ comme mot clef ne m’amène qu’à une vague page sur les ActiveX … Pas de commande, rien. Peut-être qu’avec quelques phrases en français supplémentaires…

Bon sinon pour ceux que c’est susceptible d’intéresser. J’ai traduit les deux fonctions les plus lentes. Pour une ça vaut vraiment le coup, je gagne un temps pas possible, je m’y attendais avec des boucles for sur chaque élément de tableaux énormes ce n’est pas super étonnant. Pour l’autre c’est limite négligeable. Je n’ai pas poussé plus avant mais donc voilà, la traduction peut valoir le coup mais c’est vraiment à décider au cas par cas.
Merci pour vos avis et votre aide.