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 :

Convolution rapide en C/C++


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 82
    Points : 63
    Points
    63
    Par défaut Convolution rapide en C/C++
    Bonjour à tous,
    J'ai besoin d'optimiser un morceau d'algorithme faisant une convolution.
    Codé en Matlab, la convolution (conv2) d'une matrice de taille 4000*1600 par un noyau de taille 105*81 est de l'ordre de 6s sur un P4 standard.
    A priori, on ne sait pas comment Matlab convolue avec conv2. Je pense qu'il utilise la FFT.
    J'aimerais réduire ce temps en passant en C ou C++. Je me penche donc sur l'utilisation de la FFT. En utilisant FFTW, on arrive à une quinzaine de seconde pour effectuer les FFT et IFFT sur une image de 4096*2048. On remarque également que la fonction FFT2 de Matlab mets à peur près 2 à 3 fois moins de temps que la librairie C FFTW.

    Quelqu'un a-t-il une idée à proposer pour accélérer le processus de convolution? Je reste surpris de ne pas réussir à faire mieux en C.
    J'ai vu rapidement les librairies MKL de chez Intel où une FFT est codée. Des idées quant à son efficacité?

    Pensez-vous qu'il soit possible de réduire le temps de convolution par FFT (ou pas d'ailleurs) à 1 seconde environ pour les tailles données en début de post?

    Merci d'avance pour vos avis,
    Adrien

  2. #2
    Membre confirmé Avatar de themadmax
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 446
    Points : 496
    Points
    496
    Par défaut
    Je ne comprend pas exactement, une convolution est bien differant pour moi d'une FFT ( http://docs.gimp.org/fr/plug-in-convmatrix.html ). Pour ce qui est de codé cela en C, c'est assez simple est très rapide. De plus de nombreuse lib de T.I. basic l'implémente. Pour avoir des temps de rendu encore plus rapide il est possible d'améliorer les algo de parcours d'image, ou descendre en ASM.
    ________________________________________________
    http://bliquid.fr : Blog sur Android et l'Acer Liquid

  3. #3
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par themadmax Voir le message
    Je ne comprend pas exactement, une convolution est bien differant pour moi d'une FFT
    Une convolution dans l'espace image correspond à une multiplication dans l'espace fréquentiel.

  4. #4
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    A priori, même si un programme écrit en langage matlab n'est pas très optimisé, les fonctions qui sont appelées par ces programmes le sont assez bien.

    Pour ce qui est la version Intel, aucune idée, je n'ai pas essayé, mais ça me semblerait une option à tenter.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  5. #5
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    En effet, Matlab utilise LAPACK derrière. Pour tout ce qui est calcul matriciel, Matlab, ça carbure. Ce sont des fonctions C très bien optimisé derrière !
    Par contre, dès qu'il y a des grosses boucles à la main, attention l'escargot !

    Il est en effet fort probable que Matlab utilise la FTT, c'est plus rapide sur les grosses matrices. Matlab est vraiment beaucoup plus rapide que FFTW ?

  6. #6
    Invité
    Invité(e)
    Par défaut
    Si le filtre est d'une longueur nettement plus faible que l'échantillon, des méthodes de type overlap-save ou overlap-add vont généralement aller plus vite que la FFT directe de l'échantillon complet.

    Par ailleurs, il n'y a pas que la transformée de Fourier qui accélère la convolution. J'ai souvenir d'une transformation voisine évitant les complexes (et donc pas mal de calculs en plus), due à Nussbaumer (je crois me souvenir qu'elle est décrite dans un exercice du Knuth (chap 4.3.3.C).

    Un excellent livre récent sur le sujet est Modern Computer Algebra, de von zur Gathen et Gerhard. Tu devrais y trouver ton bonheur au chapitre 8.



    Themadmax, l'utilisation de la tranformée de Fourier est un "truc" mathématique. En fait, si "*" note la convolution de deux fonctions, "x" leur produit, et TF leur transformée de Fourier, on a

    TF(f*g)=TF(f)xTF(g)

    En appelant ITF la transformée inverse de fourier, on a donc

    f*g = ITF( TF(f)xTF(g) )

    Le "truc" consiste à remarquer que le calcul direct de f*g est quadratique (O(n^2) pour des matrices de taille n), et que la Transformée de Fourier et son inverse sont O(n Log n) (et le produit O(n)). Au global, le calcul via les Transformées va donc être O(n log n), pour de grandes valeurs de n, passer par la FFT ira plus vite.

    Francois
    Dernière modification par Invité ; 01/07/2009 à 10h11.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 82
    Points : 63
    Points
    63
    Par défaut
    Merci aux auteurs des réponses.
    Je ne savais pas Matlab s'appuyait sur LAPACK, c'est bon à savoir.
    Pour la différence entre la fft Matlab et fftw, il doit y avoir un rapport 2 à 3 donc je ne sais pas sur quoi s'appuie FFT2 de Matlab...

    Sinon, je pense que FFT (et non FFT2) de Matlab utilise la multiplication polynomiale.

    En ce qui concerne les méthodes de type overlap-save, c'est une piste intéressante à étudier. Je vais voir ça étant donné la grande taille des matrices utilisées. L'idée serait d'adapter la méthode dite overlap-save en calculant uniquement des morceaux de FFT avec FFTW?

    Merci,
    Adrien

  8. #8
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par amarion Voir le message
    En ce qui concerne les méthodes de type overlap-save, c'est une piste intéressante à étudier. Je vais voir ça étant donné la grande taille des matrices utilisées. L'idée serait d'adapter la méthode dite overlap-save en calculant uniquement des morceaux de FFT avec FFTW?
    Oui, l'idée générale des méthodes overlap (save ou add) c'est que quand tu fait une convolution avec un filtre plus petit que tes données, des parties "éloignées" du résultat vont être indépendantes.

    Donc tu fais plusieurs calcul de convolution sur des segments réduits de ton image d'entrée (qui se recoupent, d'où le terme d'overlap), et réassemble les résultats pour avoir le résultat final (en les additionnant dans le cas de la méthode add, en les supprimant partiellement dans le cas de la méthode save).

    Ceci dit, je suis prêt à parier que Matlab utilise cela dans sa fonction de convolution, et comme ses fonctions bas niveau sont du C bien codé, il va être difficile à battre.

    Francois

  9. #9
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    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 302
    Points : 53 165
    Points
    53 165
    Par défaut
    Citation Envoyé par poukill Voir le message
    Il est en effet fort probable que Matlab utilise la FTT, c'est plus rapide sur les grosses matrices. Matlab est vraiment beaucoup plus rapide que FFTW ?
    Je ne suis pas un spécialiste de ces questions... mais je me débrouille assez bien avec la doc de MATLAB

    Pour la fonction CONV2 :
    conv2 uses a straightforward formal implementation of the two-dimensional convolution equation in spatial form
    Voir la section algorithme ici : http://www.mathworks.com/access/help...ref/conv2.html

    Pour FFT2 :

    fft2(X) can be simply computed as

    fft(fft(X).').'
    Voir encore une fois la section algorithme ici : http://www.mathworks.com/access/help.../ref/fft2.html

    Et pour FFTW... cette bibliothèque est bien intégrée dans MATLAB.

    On peut d'ailleur lire dans la documentation de la fonction FFT :
    The FFT functions (fft, fft2, fftn, ifft, ifft2, ifftn) are based on a library called FFTW
    La boucle est bouclée
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

Discussions similaires

  1. Comment recevoir rapidement une réponse à votre question ?
    Par Community Management dans le forum Windows
    Réponses: 3
    Dernier message: 17/08/2014, 02h28
  2. Calcul rapide de percentiles
    Par benj63 dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 08/12/2006, 14h50
  3. LES TECHNIQUES DES SGBDR / MySQL rapide ???
    Par SQLpro dans le forum Langage SQL
    Réponses: 1
    Dernier message: 12/09/2003, 11h16
  4. Accés rapide aux propriétés d'un Objet
    Par Alacazam dans le forum C++Builder
    Réponses: 4
    Dernier message: 28/11/2002, 21h56
  5. [VBA Excel] Effacer rapidement une feuille
    Par Invité dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 24/10/2002, 13h12

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