1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
|
// déclaration des variables/registres qui vont contenir 2 variables au format double pour effectuer 2 opérations en parallèle
__m128d currentPixel, tempValue, oldValue;
__m128d Va, Vgain, Vtau;
Va=_mm_set1_pd(a); //charge le vecteur avec 2 variables idntiques égales à a
Vgain=_mm_set1_pd(gain);//charge le vecteur avec 2 variables idntiques égales à gain
Vtau =_mm_set1_pd(tau);//charge le vecteur avec 2 variables idntiques égales à gain
double returnData[2]; // un tableau à "2 cases" doubles qui servira à récupérer les données après calcul
register unsigned int firstloopSTOP=_NBrows-1; // le mot register indiqu au compilateur qu'il serait préférable que cette variable soit stockée en registre...si c'est possible
for (IDrow=0; IDrow<firstloopSTOP ; IDrow+=2 ) // on va de 2 lignes en 2 lignes maintenant
{
// set init value
//value=0;
tempValue=_mm_setzero_pd(); // on initialise la double valriable à 0
for (IDcolumn=0; IDcolumn<_NBcolumns ; ++IDcolumn)
{
// pack to values : __m128d _mm_set_pd( double x, double y ); => méthode pour remplir le vecteur par 2 valeurs type double
oldValue = _mm_set_pd( outputFrame[IDrow][IDcolumn], outputFrame[IDrow+1][IDcolumn]);
currentPixel = _mm_set_pd(inputFrame[IDrow][IDcolumn], inputFrame[IDrow+1][IDcolumn]);
// calcul du filtre=> j'ai tout mis d'un coup ensemble, quelle est la meilleure méthode?
tempValue = _mm_add_pd(currentPixel,_mm_add_pd(_mm_mul_pd(Vtau, oldValue), _mm_mul_pd(Va, tempValue)));
//on récupère/reconvertit les données calculées au format double
_mm_store_pd (returnData, tempValue); //write result in the buffer
// finalement, on réécrit dans le buffer de sortie...hem, ca en fait des transfert mémoire, ca devient lourd, il doit y avoir moyen de faire mieux...
outputFrame[IDrow][IDcolumn]=returnData[0];
outputFrame[IDrow+1][IDcolumn]=returnData[1];
// ancienne version de code simple
//value = outputFrame[IDrow][IDcolumn]*tau + inputFrame[IDrow][IDcolumn] + a* value;
//outputFrame[IDrow][IDcolumn] = value;
}
} |
Partager