programmation DSP et SSE intrinsics

programmation DSP et SSE intrinsics - C++ - Programmation

Marsh Posté le 24-05-2008 à 14:38:10    

Bonjour,
 
Je viens de me lancer dans la programmation audio C++ (VST SDK)
 
J'aimerais utiliser les intrinsics SSE pour accélérer mes programmes, mais je cale sur les structures conditionnelles..
 
Par exemple, avec ce code (conversion d'une tension de contrôle de type "control voltage" non linéaire en une fréquence en Hz) :
 


float old_pitch = -20.f;
float freq = 0.f;
 
float *pitch_in = ... ;
float *signal_out = ...;
 
while( --sampleframes >= 0)
{
 
    float pitch = *pitch_in;
 
    if( pitch_cv != old_pitch)
    {
        freq = 440.f * fastpow2(pitch_cv*10.f - 5.f);
        old_pitch = pitch_cv;
    }
 
    *signal_out = freq;
 
    pitch_in++;
    signal_out++;
 
}


 
La fréquence n'est recalculée qu'à chaque fois que l'entrée change.
J'ai beau chercher et je ne sais pas comment je peux traduire ce "saut" en SSE ??
Les intrinsics de comparaison retournent des masques __m128...
C'est sans doute une question de newb, mais est-ce que le code que je viens de poster peut être traduit en SSE ?
 
Et aussi, comme la boucle SSE calcule 4 frames en même temps, est-ce qu'il est possible de récupérer des variables calculées dans la passe précédente ("old_pitch" dans l'exemple" ) ? ou est-ce que pour ça je dois me limiter aux intrinsics scalaires ?
 
Si parmi vous quelqu'un peut éclairer ma lanterne, je lui serai très reconnaissant  :)  
 
Merci d'avance !


Message édité par jitter le 24-05-2008 à 14:39:22
Reply

Marsh Posté le 24-05-2008 à 14:38:10   

Reply

Marsh Posté le 24-05-2008 à 14:58:15    

pour emuler un if en SSE2 il faut faire la chose suivante :

 

Soit le code :

 

a = condition ? vrai : faux; à vectoriser

 

- calculer le masque de la comparaison condition. Appelons ce masque M
- faire : v = M & vrai (mm_and de tête)
- faire : f = ~M & faux
- enfin a = v | f

 

En gros tu transforme un if else en calcul de masque, une paire de & et un | vectoriel (mm_and, mm_or).
En gros, quelque soit le résultat du test, tu calcul les deux versions et ensuite tu la sélectionne. C'est un idiome classique en SIMD SWAR.

 

Pour ton autre question, il faut toujours repenser ses algos vectorielles de faon à toujours faire toujours le mm calcul pr tt les éléments du vecteurs. Ici tu n'as qu'à stocker 4 old_picth consécutif dans un vecteur.

 

Une bonne astuce consiste dans un premier temps à reecrire son algo scalaire en déroulant les boucles d'un pas égales au cardinal du vecteur et ensuite de réécrire cet algo déroulé en utilisant uniquement des calculs et aucune structures de controle. Le passage en SSE2 est alors trivial.


Message édité par Joel F le 24-05-2008 à 15:02:39
Reply

Marsh Posté le 24-05-2008 à 20:34:01    

Merci beaucoup pour ces éclaircissements  :jap:  

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed