4.1.1.3.2 : Le fichier source

Écrivons le fichier sqrt_intrinsics.cpp :



Il nous faut tout d'abord inclure un header qui permet de définir l'alignement des données en float avec PLIB_VECTOR_SIZE_FLOAT. Ainsi que des fonctions intrisèques génériques telles que :
  • plib_load_ps : pour lire des registres vectoriels (par exemple 8 floats en AVX
  • plib_sqrt_ps : pour calculer la racine carré des valeurs des registres vectoriels
  • plib_store_ps : pour sauvegarder des registres vectoriels


1
#include "phoenix_intrinsics.h"


Ensuite nous incluons notre header :

1
#include "sqrt_intrinsics.h"


Ensuite nous implémentons notre racine carré en prennant en compte le fait que nous traitons plusieurs données en même temps, la boucle for est donc sur vecSize et non sur nbElement :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
///Do the Hadamard product
/**	@param[out] tabResult : table of results of tabX*tabY
 * 	@param tabX : input table
 * 	@param nbElement : number of elements in the tables
*/
void sqrt_intrinsics(float* tabResult, const float* tabX, size_t nbElement){
	size_t vecSize(PLIB_VECTOR_SIZE_FLOAT);
	size_t nbVec(nbElement/vecSize);
	for(size_t i(0lu); i < nbVec; ++i){
		PRegVecf vecX = plib_load_ps(tabX + i*vecSize);
		PRegVecf vecRes = plib_sqrt_ps(vecX);
		plib_store_ps(tabResult + i*vecSize, vecRes);
	}
}


Le fichier sqrt_intrinsics.cpp complet :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/***************************************
	Auteur : Pierre Aubert
	Mail : pierre.aubert@lapp.in2p3.fr
	Licence : CeCILL-C
****************************************/
#include "phoenix_intrinsics.h"
#include "sqrt_intrinsics.h"
///Do the Hadamard product
/**	@param[out] tabResult : table of results of tabX*tabY
 * 	@param tabX : input table
 * 	@param nbElement : number of elements in the tables
*/
void sqrt_intrinsics(float* tabResult, const float* tabX, size_t nbElement){
	size_t vecSize(PLIB_VECTOR_SIZE_FLOAT);
	size_t nbVec(nbElement/vecSize);
	for(size_t i(0lu); i < nbVec; ++i){
		PRegVecf vecX = plib_load_ps(tabX + i*vecSize);
		PRegVecf vecRes = plib_sqrt_ps(vecX);
		plib_store_ps(tabResult + i*vecSize, vecRes);
	}
}


Vous pouvez le télécharger ici.