4.2.2.1.2 : La fonction d'évaluation de performance


La fonction qui fera l'évaluation de performance de notre kernel de calcul :

1
2
3
4
///Get the number of nanoseconds per elements
/**	@param nbElement : number of elements of the tables
*/
void evaluateGrayScott(size_t nbElement){


Nous commençons encore par un petit subterfuge pour transformer le nombre d'élément nbElement à une dimension en un nombre de ligne et un nombre de colone (la macro PLIB_VECTOR_SIZE_FLOAT définit la taille d'un registre vectoriel de float) :

1
2
	size_t nbRow(nbElement*PLIB_VECTOR_SIZE_FLOAT);
	size_t nbCol(nbElement*PLIB_VECTOR_SIZE_FLOAT*2lu);


Il faut aussi mettre à jour le nouveau nombre d'éléments :

1
	nbElement = nbRow*nbCol;


Nous devons allouer nos images temporaires avec la fonction allocate_temporary que nous avons implémenté dans la section 3.1.2 :

1
2
3
	PTensor<float> tmpInU, tmpInV, tmpOutU, tmpOutV;
	float *tmpU1 = NULL, *tmpU2 = NULL, *tmpV1 = NULL, *tmpV2 = NULL;
	allocate_temporary(tmpU1, tmpU2, tmpV1, tmpV2, tmpInU, tmpInV, tmpOutU, tmpOutV, nbRow, nbCol);


Initialisons les paramètres de notre fonction de calcul :

1
2
3
	float diffudionRateU(0.1f), diffusionRateV(0.05f);
	float killRate(0.054f), feedRate(0.014f), dt(1.0f);
	long nbStencilRow(3l), nbStencilCol(3l);


Et, notre matrice de poids pour le gradient de concentration entre des cellules voisines (pour le moment ce n'est pas la peine de changer les valeurs car c'est un test de performance qui ne produit pas d'images) :

1
2
3
	float matDeltaSquare[] = 	{1.0f, 1.0f, 1.0f,
					1.0f, 1.0f, 1.0f,
					1.0f, 1.0f, 1.0f};


Finalement nous appellons la fonction qui évaluera les performances de notre kernel :

1
2
3
4
	micro_benchmarkAutoNsPrint("evaluate GrayScott reaction, vectorized", nbElement, grayscott_propagation, 
					tmpU2, tmpV2, tmpU1, tmpV1, nbRow, nbCol,
					matDeltaSquare, nbStencilRow, nbStencilCol,
					diffudionRateU, diffusionRateV, feedRate, killRate, dt);


Enfin, nous finissons cette fonction :

1
}