Le pub des programmeurs
- 1 927 réponses
- 117 participants
- 131 735 vues
- 130 followers

Anonyme



Wolfen

Citation : - dans la fonction process, est ce que tu utilises des appels systeme ?
Ca je sais que c'est pas conseillé

Citation : - Lorsque tu utilises des sin,cos et autre fonctions transcendentales, est ce que tu utilises les fonctions standarts de la libc ?
Des log et des pow principalement, j'imagine qu'il faut éviter...
Citation : - est ce que tu utilises bien le cache de ton proc ?
Je m'en sers pas du tout, comment on fait ?

Citation : - est ce que tu calcules plusieurs fois les memes valeurs ?
L'avantage des classes c'est que j'évite ce genre de trucs

Citation : Il y a des trucs simples pour l'optimisation: par exemple, en maths, diviser par deux et multiplier par 0.5, c'est pareil. Sur un pentium, en flottant, diviser est facilement 5 a 10 fois plus couteux qu'une multiplication. Si tu as besoin de cos et sin regulierments espaces, tu peux utiliser des tables et des formules de recurrence, etc... Aussi, il faut bien connaitre le compilo, et toutes les options d'optimisation. Ca peut changer beaucoup de choses.
La faut que je me renseigne...
Citation : La méthode ultime pour savoir ce qui te bouffe du CPU : le profiling
Connais pas du tout, je vais faire du google

Merci des infos !
Développeur de Musical Entropy | Nouveau plug-in freeware, The Great Escape | Soundcloud

zieQ

Si tu utilises des log, sqrt ou pow par sample, c'est clair que le problème de perf vient de là ;) Dans ce cas, précalcule des tables ou simplifie ton modèle avec des approximations.

Pov Gabou

Citation :
Je m'en sers pas du tout, comment on fait ?
tu t'en sers forcement ;) Mais il s'agit d'optimiser tes fonctions pour respecter le principe dit de localite, pour que tout ce que tu utilises dans un e petite boucle par exemple soit dans le cache.
J'ai fait un petit programme, et voila ce qu'il me dit pour le cout de exp, log, sqrt et cos (sous linux, gcc, et les flags d optimisation de base pour le compilo):
316 cycles pour exp en double (ca me parait beaucoup)
183 pour log en double
67 pour sqrt en double
224 pour cos
Typiquement, si tu over sample 2 fois, que tu es a 44.1 khz, a vue de nez, si tu fais un log sur chaque sample, tu bouffes deja 30 millions de cycles par seconde en stereo ! Faut voir que souvent, t'as des grosses contraintes sur ces fonctions (resultat exact, renvoi de nan s'il le faut, etc...), dont tu te fous en audio. Il y a aussi le probleme des nombres denormaux (Laurent de Soras a un bon article a ce sujet).
Par exemple, recemment, j'ai eu besoin d'un exp rapide, et aussi exact que la version IEEE. Pour ca, j'ai pas mal bidouille: ca prend du temps, mais ca vaut le coup si tu reutilises ensuite. Le principe de base pour les fonctions transcendantales, c'est de decouper l'entree en partie entiere et fractionnaire. La partie entiere est souvent simple a calculer, et le partie fractionnaire etant dans un intervalle limite, tu peux avoir des approximations qui convergent plus rapidement. Pour exp, les etaptes sont les suivantes:
- utiliser l'equivalent exp(x) = 2^(x/ln(2))
- calculer xi et xf la partie entiere et frac de x/ln(2)
- calculer 2^xi: la, il faut ruser, en utilisant le fameux truc x << 2 = x / 2 pour une puissance de 2, mais en manipulant bit par bit l'exposant au format IEEE (tu peux pas utiliser directemen xi >> 2, car ca peut depasser facilement la valeur max d'un int en 32 voire 64 bits).
- calculer 2^xf: la, tu utilises une approx polynomiale (il y a mieux que Taylor pour xf entre -1 et 1: tu peux aboutir a la precision 64 bits en 3 ou 4 termes).
En gardant la precision, tu peux gagner un facteur 3-4 facilement. Si tu abandonnes la precision, tu peux gagner un facteur 5 a 10 je pense.
J'avais ecrit un petit post sur le profiling, mais j'ai fais la commande reboot sur le mauvais ordi


zieQ

Citation : J'avais ecrit un petit post sur le profiling, mais j'ai fais la commande reboot sur le mauvais ordi Bref, pour resumer, ce que je te conseillerai, c'est deja de pouvoir compiler facilement ton plug in en mode non VST, de maniere a ce que tu puisse le charger dans un hote bidon que tu as programme, pour pouvoir controler facilement l'environnement. L'hote n'a pas besoin de grand chose: en gros, charger le plug, lister les parametres, et appeler la fonction process avec des entrees bidons. Tu peux meme le programmer en python
Non, pas besoin de reprogrammer un hôte, y'en a déjà des tout fait avec les sources itou itou. Qui plus est, le logiciel LTProf que j'ai conseillé ne nécessite pas de recompilation donc c'est tout bon ;)

Pov Gabou

Citation : Non, pas besoin de reprogrammer un hôte, y'en a déjà des tout fait avec les sources itou itou.
Apres ca depend de ce que tu recherches et de ce qui est dispo. La, je viens de telecharger les sources du sdk vst, et il y a pas de support linux, par exemple. Il faut donc porter le code correspondant.
Je suis pas tres au courant de la "scene" prog VST, mais je me demande par exemple s'il existe des hotes scriptables, pour pouvoir envoyer n'importe quel type d'entrees/sorties, pour tester les alloc+acces memoire sous valgrind, etc...

zieQ

- minihost, savihost ou l'hôte du sdk comme hôtes minimaux debuggables
- VST-scanner by V. Burel (VB audio)
- VST Plugin Analyser by Christian Budde
- Plugin Consultant by Achitophel Consulting
Pour en revenir aux approximations, je consulte *toujours* le bouquin "Numerical Recipes" lorsque j'ai un problème numérique à résoudre. C'est gratuit, c'est en pdf, et c'est là :
http://www.nr.com/

bigbill

Citation : Il y a aussi le probleme des nombres denormaux (Laurent de Soras a un bon article a ce sujet).
Je connais le papier le L. de Soras, mais j'ai jamais réussi à mettre en évidence un impact sur les perfs. Les procs récents auraient-ils résolu ce problème

Wolfen > ce qui peut se produire aussi c'est que ton compilo peut être 'mauvais' quand tu le fais travailler sur des flottants. C'est ce qui m'est arrivé il y a quelques mois avec une vieille version de compilateur Borland: malgré les optims mises à fond, je me suis rendu compte qu'il se servait très bêtement de la pile du FPU. Alors qu'il y a beaucoup de perf à gagner à ce niveau-là, particulièrement dans les boucles. Tu peux compter sur un facteur 5, voire plus

Par ailleurs, comme te le disait Pov Gabou, quand tu utilises les libs de maths fournies avec ton compilo, il rajoute à ton code une gestion d'exceptions qui peut être très lourde. Exemple typique: sauvegardes et restaurations du registre de statut du FPU. Quand tu connais tes datas et que tu peux prévoir leur excursion, ces mécanismes de sécurité deviennent superflus et tu as intérêt à essayer de les court-circuiter, temporairement du moins..
Eventuellement, tu peux avoir besoin de descendre au niveau assembleur. Si ça ne te rebute pas, alors tu peux consulter cette page chez AMD, et plus particulièrement ce PDF qui pourra t'apporter des réponses sur les optimisations de cache et de branchements.
Tu trouveras dans ce PDF la liste des instructions FPU, et dans le chapitre 6 de ce PDF une bonne introduction à la prog du FPU.

Wolfen


Ca me fait halluciner le nombre de cycles pour l'exponentielle

Développeur de Musical Entropy | Nouveau plug-in freeware, The Great Escape | Soundcloud

Wolfen


Développeur de Musical Entropy | Nouveau plug-in freeware, The Great Escape | Soundcloud

Pov Gabou

La regle de base avec l'ASM, c'est de ne pas l'utiliser avant d'avoir tout essaye. Typiquement, si tu as des problemes de denormalisation, d'utilisation de exp/sqrt/etc... a la place de tes propres fonctions, tu peux deja gagner un ordre de grandeur facile, alors que l'ASM, c'est de l'ordre de la micro optimization.
Citation :
Pour en revenir aux approximations, je consulte *toujours* le bouquin "Numerical Recipes" lorsque j'ai un problème numérique à résoudre. C'est gratuit, c'est en pdf, et c'est là :
Le probleme du NR, c'est qu'il est oriente maths, et que le plus souvent, t'as pas besoin de cette precision. Rggarde ); return false;" rel="nofollow" target="_blank">http://www.musicdsp.orgm, dans
archive, il y a pas mal de code C et ASM pour approximer log, sqrt, exp (en base 2 le plus souvent).
Citation :
Exemple typique: sauvegardes et restaurations du registre de statut du FPU.
Ca me fait penser a un autre truc hyper couteux: convertir les flottants en entier. Il faut pas laisser le compilo le faire pour toi. Les denormaux, ca depend de ce que tu codes. Ca peut arriver facilement dans tout code "recursif", comme les IIR; ca arrive rapidement avec l'exponentielle, aussi.
T'as pas un bout de code d'un truc qui prend du temps que tu peux poster ?

bara

J'ai eu l'occasion dans mon premier boulot (donc avant de faire mumuse avec du midi et de l'algorythmique musicale) de coder pour un usage ultra-critique (militaire). Alors là, c'est sur que l'aspect temps-réel c'est vachement important.
La stratégie, à mon sens, et je rejoins ce qui a été dit ici, c'est:
1. estimer le gap entre la spec et les résultats réels: passé un certain niveau de complexité, on va passer 1000 ans à gagner presque rien, donc limite vaux mieux changer d'archi ou d'approche.
Par exemple, j'ai eu à réaliser une FFT sur une plate-forme un peu zarbi à l'époque: des FPGA qui contenait un coeur de processeur IBM PowerPC. Donc, j'ai codé mon merdier bourrinement, et j'allais 40 fois plus lentement que voulu. J'ai enablé tous mes caches et mes prefetches, regardé la gueule de l'assembleur généré par le compilateur, commuté l'horloge de la carte de dév' (et donc du proc) de 100MHz à 450MHz (si si, on peux oublier de faire ça). J'en suis arrivé à coder tous mes papillons en assembleurs, en restant 4 fois plus lent que voulu. On a fini par fabriquer une palanquée d'opérateurs "papillon de FFT" purement FPGA (VHDL, quoi, ma formation de base), le processeur n'étant là que pour séquencer le merdier, donner à bouffer aux papillons hardware, gérer les entrées-sorties et interruptions diverses. Là, on était 2 fois plus rapides que la spec.
2. localiser les points critiques: si une fonction est appellée pour traiter chaque sample, ça peux valoir le coup de l'optimiser plus que l'init du soft qui ne sera utilisée qu'une fois
3. optimiser à proprement parler, et là ya plein de pistes:
a. passer aux fonctions les bons paramêtres, ni plus ni moins
b. vérifier que tous les cas limites sont traités UNE SEULE FOIS
c. effectivement, bien connaitre son compilateur: j'en ai vu qui pour diviser par deux des entiers réalisaient une division, d'autres qui castaient en flottant, multipliaient par 0.5 et faisaient des arrondis, et d'autres enfin qui décalaient vers la droite... C'est pas le même prix.
d. ne pas hésiter à changer le format des données et des constantes dès l'entrée: un MulAcc sur 32 bits prends parfois un seul cycle sur certaines machines, bicoze ils ont un copro qui ne fait que ça. Deux MulAcc sur 16 bits prendront deux fois plus de temps. Ca vaux le coup de concaténer parties réelles et imaginaires quand on fait du papillon de FFT (je sais plus bien ce que j'avais magouillé, mais j'avais pas mal gagné sur certaines plate-formes avec un truc dans ce genre là).
e. effectivement, relativiser la précision du bordel: selon l'application, un développement limité à l'odre 1 ou 2 sera plus rapide qu'un cosinus et tout aussi acceptable du point de vue de la précision. De même, les log se tabulent vachement bien selon ce que l'on en fait, ou s'approximent avec plusieurs bouts de droite.
Bon, et là j'ai la sale impression d'avoir écrit un tissu de conneries et de Lapalissades. Désolé

Sinon, simu d'ampli, j'ai fait aussi


Pov Gabou

Citation :
Par exemple, j'ai eu à réaliser une FFT sur une plate-forme un peu zarbi à l'époque: des FPGA qui contenait un coeur de processeur IBM PowerPC
Trop fort ces militaires, ils bossaient deja sur le cell avant que sony et IBM l'inventent

Plus serieusement, j'ai l'impression que tu as une experience fpga et dsp. Pour ces architectures, le dsp est souvent obligatoire, au moins au partie, ne serait-ce que parce que le C ne peut pas transcrire certaines instructions dsp (muladd, typiquement, addressage inverse pour la FFT). Puis la memoire est rapide, il y a pas de cache (au moins sur les trucs simples, mais je connais que les trucs tres simples en DSP

Le probleme de l'assembleur sur les procs recents, c'est qu'ils sont tellement complexes (niveau de pipeline, on etait a plus de 20 sur le prescott, je crois), avec tout ce que ca a comme consequence (reordonencement, entre autre), que ca devient difficile de prevoire ce qui va se passer. Et ce qui est plus rapide sur un athlon peut etre plus lent sur un P4. Je parle meme pas des problemes de taille de cache, etc... Donc a part quelques trucs bien precis, il vaut mieux rester en C et/ou intrinsices sse. Par exemple, pour exp, en restant en C, tu peux facilement gagner un facteur 2 a 4 par rapport a la GNU C (je pense que sous windows/mac, c'est plus optimise, mais c'est plus cher, aussi). Par contre, connaitre l'assembleur est un plus, ne serait-ce que pour avoir une idee de comment les choses marchent par derriere.
En audio, un truc bien complexe a gerer, c'est l'oversampling. Pour eviter l'aliasing, par exemple dans les oscillo modules, il faut over-sampler ton signal pour avoir de bons resultats. Tout le truc, c'est de savoir de combien t'as besoin d'oversampler, selon tes modulations; et en interne, dans ton moteur audio, tu peux avoir plusieurs frequences de fonctionnement en parralllele selon les parties...
Typiquement, j'aurais tendance a penser que reaktor est un des logiciels les plus complexes en audio (les dernieres versions auraient un compilateur JIT, mais c'est dur de trouver des infos fiables a ce sujet)
Quelques threads relativement recents sur des techniques pour le son
http://www.music.columbia.edu/pipermail/music-dsp/2004-December.txt (infos sur les langages recents, generation de code, etc...)
http://www.music.columbia.edu/pipermail/music-dsp/2005-December.txt (infos sur processing par block contre process par sample).
In fine, le truc ultime serait quelque chose analogue aux techniques employees par fftw et atlas, a savoir generation de code automatique dependant de la machine, ou justement des trucs style JIT, etc... Java a lance le truc dans l'industrie, et il existe maintenant des implementations open source assez sophistiquees pour voir des choses qui il y a encore 5 ans etaient cantonnes a l'academique: machines virtuelles comme mono ou parrot. En generation de code a partir d'algo, il y a FAUST sous linux:
http://faudiostream.sourceforge.net/
Dans la categorie "langages specialises pour faire du son", il y a supercollider qui me vient en tete, qui est relativement "ancien". Il y a aussi chuck dont j'ai deja parle.

bara

Citation : Trop fort ces militaires, ils bossaient deja sur le cell avant que sony et IBM l'inventent
Le composant en question est le Xilinx Virtex-II Pro, je vois pas pourquoi t'as l'air choqué, moi j'en ai eu dans les mains (carte de dév' ML300) en 2002 je crois. A l'époque ce composant était leur haut de gamme (jusqu'à 4 coeurs de PowerPC par chip).
Sinon, tiens, en ce moment je m'interresse à la convolution: Gabou tu pratiques ça comment ? Bourrin en faisant la somme come un gros sale ? Ou FFT -> Multiplication -> FFT inverse ?

miles1981


Y'a certain DSP qui n'ont même pas l'adressage inverse, chez Analog Device ou TI, ça paraît être un comble, mais c'est la vérité - je crois que c'était les Blackfin où j'avais dû faire le calcul à la main, mais comme la bestiole permet d'écrire de l'assembleur parallèle, elle compense à l'aise -
Audio Toolkit: http://www.audio-tk.com/

Pov Gabou

Citation :
Le composant en question est le Xilinx Virtex-II Pro, je vois pas pourquoi t'as l'air choqué
Pas vraiment choque, c'est juste que ca rappelle furieusement le cell, un coeur ppc plus des dsp, c'est tout. J'ai pas suivi ce qui se passait, parce qu'il y a trop de buzz pour l'instant, mais je me disais qu'une ps3. une fois que ca devient abordable, et s'il y a un kit linux, pouvait etre interessant pour programmer en dsp.
Citation :
Sinon, tiens, en ce moment je m'interresse à la convolution: Gabou tu pratiques ça comment ? Bourrin en faisant la somme come un gros sale ? Ou FFT -> Multiplication -> FFT inverse ?
Ca depend de tes reponses impulsionnelles: si elles sont courtes (le courte dependant du processeur, mais de l'ordre de quelques dizaines pour les trucs courants et une bonne implementation fft), a "la main", sinon, en effet, avec la FFT, en faisant gaffe parce que multiplication fft = convolution circulaire (il faut padder tes blocs pour eviter "l'aliasing temporel"). Si tu veux faire du temps reel, ca devient nettement plus complique car il faut gerer la latence avec des blocs de taille variable, et des decoupages de la reponse impulsionnelle (avec les brevets qui vont avec

Tu peux regarder brutefir pour voir un peu comment ca marche dans ces cas.

Wolfen



Miles > C'est quoi pour toi les meilleurs DSP pour faire de l'audio ? Analog Device a l'air bien côté...
Bara > Wow le post

Citation : Sinon, tiens, en ce moment je m'interresse à la convolution: Gabou tu pratiques ça comment ? Bourrin en faisant la somme come un gros sale ? Ou FFT -> Multiplication -> FFT inverse ?
Le mieux c'est avec les FFT, à fond, si tu as des impulses qui font au moins une centaine d'échantillons

Je t'envoie vite fait un message aussi pour la simulation d'ampli

Très intéressant tout ça

Développeur de Musical Entropy | Nouveau plug-in freeware, The Great Escape | Soundcloud

Pov Gabou

Citation :
Gabou > pour l'assembleur, c'est juste que j'ai vu pas mal de développeurs VST qui s'en servent, ainsi que des jeux d'instructions SSE par exemple, pour optimiser leur bordel
Oui, mais a mon avis, c'est le dernier truc a regarder quand meme. Les developpeurs VST, ils optimisent aussi ailleurs ;)
Citation :
Et pour le bout de code, c'est vraiment gros ma fonction processReplacing avec tous les appels de classe En plus je fais de l'oversampling x8 en utilisant la classe HalfBandFilter de MusicDSP
oversampling x8, ca veut donc dire qu'en stereo, tu dois traiter 8*88200 ~ 650000 samples / s. A ce train la, tout ce que tu peux faire va prendre vachement cpu: si tu calcules un cos, un sin et un exp betement sur chacun des samples, tu peux deja bouffer 500 Mhz.
Citation :
Et pour le bout de code, c'est vraiment gros ma fonction processReplacing avec tous les appels de classe
Tu fais quoi concretement dans ce plug ?

Wolfen

Citation : oversampling x8, ca veut donc dire qu'en stereo, tu dois traiter 8*88200 ~ 650000 samples / s. A ce train la, tout ce que tu peux faire va prendre vachement cpu: si tu calcules un cos, un sin et un exp betement sur chacun des samples, tu peux deja bouffer 500 Mhz.
Bon heureusement c'est du mono

Citation : Tu fais quoi concretement dans ce plug ?
Pour l'instant y a un certain nombre d'étages de gain à la suite, par exemple 5, chacun étant constitué d'une fonction de waveshaping polynomiale et de deux filtres avant et après... Pour la dénormalisation, j'ajoute du bruit en entrée de chaque filtre à -200 dB, que j'ai calculé au lancement du programme et stocké dans un tableau pour éviter les calculs en temps réel.
L'oversampling a une influence dramatique sur les perfs n'empêche

Développeur de Musical Entropy | Nouveau plug-in freeware, The Great Escape | Soundcloud

Pov Gabou

Citation :
L'oversampling a une influence dramatique sur les perfs n'empêche
Ben oui, un oversampling d'un facteur N, ca bouffe N fois plus de ressources, en gros.
Citation :
Pour l'instant y a un certain nombre d'étages de gain à la suite, par exemple 5, chacun étant constitué d'une fonction de waveshaping polynomiale et de deux filtres avant et après... Pour la dénormalisation, j'ajoute du bruit en entrée de chaque filtre à -200 dB, que j'ai calculé au lancement du programme et stocké dans un tableau pour éviter les calculs en temps réel.
Ca me parait pas tres complique a poster en soit (a moins qu'il y ait des secrets defense ;) ). Je veux dire, t'as une classe pour chaque etage, un truc pour la denormalisation, et eventuellement tout le tralalala pour le waveshapping.
Citation :
FFTW et FFTReal (la deuxième est beaucoup mieux à utiliser d'ailleurs, et on peut l'utiliser sur des produits commerciaux).
Ca n'as pas non plus le meme but. Le truc de Soras est adapte a l'audio, ou tu peux donc simplifier l'interface. Au contraire, fftw gere le reel, le complexe, le multi dimensionnel, le "fortran storage vs C storate", etc...

Pov Gabou


miles1981

Wolfen > aucune idée, mais si je devais choisir là tout de suite, je prendrai le Blackfin d'AD, même s'il a des trucs qui manquent, la carte d'évaluation elle-même a 4 entrées audio, 6 sorties + un vidéo, USB, réseau, donc il y a de quoi se faire plaisir.
Pour ce qui est de l'optimisation de la FFT, si je n'ai que du radix-2 fixé à la compilation, je regarderai du côté d'une bibliothèque templatée.
En revanche, pour faire mieux au niveau conception et flux de données, je ne ferais que quelques appels dans le PRocessReplacing. Par exemple si tu fais tout hériter d'une seule struture avec une interface suffisemment complète pour toi et miimale, un petit pattern Décorateur permettrait de mettre, de supprimer, de déplacer facilement les élements dans la chaîne de traitement sans se compliquer la vie, tout en appelant une seule méthode dans la fonction principale, le reste ayant été géré dans les fonctions non critiques.
Audio Toolkit: http://www.audio-tk.com/

Anonyme


Pour les cells, il parait que ceux de la PS3 sont des grosses merde, que la console est aussi (peut etre plus) dur à utiliser que la PS2, et que la plupart des gens qui bossent dessus sont très inquiets car les perfs sont a peu pret lamentable...

miles1981

Les Cells de la PS3 sont des Cells incomplets, que 7 coprocesseurs, car IBM a d'énormes soucis de rendement.
Audio Toolkit: http://www.audio-tk.com/

Anonyme

Citation : Mais j'imagine qu'avec Direct X 10 et l'interface physique, on pourra faire des choses plus facilement.
mmm je pense pas, la physique c'est relativement light par en terme de données (une matrice par objets), les langages déja existant (GLSL, CG, etc) permetent deja de bien s'amuser avec ce genre de chose (et y'a pas de gestion de mémoire, ou de pointeur, etc etc lol).
Citation : Les Cells de la PS3 sont des Cells incomplets, que 7 coprocesseurs, car IBM a d'énormes soucis de rendement.
Ca serait aussi énormément buggé, autour des cells je pense.

thie91

Citation : Sinon, tiens, en ce moment je m'interresse à la convolution: Gabou tu pratiques ça comment ? Bourrin en faisant la somme come un gros sale ? Ou FFT -> Multiplication -> FFT inverse ?
le passage par la FFT serait plus rapide ??

Citation :
mais si je devais choisir là tout de suite, je prendrai le Blackfin d'AD, même s'il a des trucs qui manquent, la carte d'évaluation elle-même a 4 entrées audio, 6 sorties + un vidéo, USB, réseau, donc il y a de quoi se faire plaisir.
tu as des retours sur ces cartes d'évaluation ?
parcque c'est vrai qu'elles sont sympa, et en plus, l'outil de dev en ASM est pas dégueu !
- < Liste des sujets
- Charte