5.2.1.1 : Le header intrinsics_propagation_block.h



Écrivons le fichier intrinsics_propagation_block.h :



Comme d'habitude, il faut commencer par définir des macro qui éviterons les inclusions multiples de notre header :

1
2
#ifndef __INTRINSICS_PROPAGATION_BLOCK_H__
#define __INTRINSICS_PROPAGATION_BLOCK_H__


Nous aurons besoin de découper nos tenseurs en blocs :

1
#include "PTensor.h"


Le prototype de notre fonction :

1
2
3
4
5
6
void grayscott_propagation_block(PTensor<float> & outMatVecU, PTensor<float> & outMatVecV, const PTensor<float> & matVecVecU, const PTensor<float> & matVecVecV,
				std::vector<PBlock<float> > & vecBlockOutU, std::vector<PBlock<float> > & vecBlockOutV,
				std::vector<PBlock<float> > & vecBlockInU, std::vector<PBlock<float> > & vecBlockInV,
				size_t blockNbRow, size_t blockNbCol,
				const float * matBroadcastDeltaSquare, long nbStencilRow, long nbStencilCol,
				float diffusionRateU, float diffusionRateV, float feedRate, float killRate, float dt);


Où :
  • outMatVecU : est le résultat du calcul pour l'espèce U avec des voisins vecotriels
  • outMatVecV : est le résultat du calcul pour l'espèce V avec des voisins vecotriels
  • matVecVecU : est la concentration initiale de l'espèce U avec des voisins vecotriels
  • matVecVecV : est la concentration initiale de l'espèce V avec des voisins vecotriels
  • vecBlockOutU : est la liste des blocks à découper pour obtenir le résultat textbfU
  • vecBlockOutV : est la liste des blocks à découper pour obtenir le résultat textbfV
  • vecBlockInU : est la liste des blocks à découper pour obtenir les valeurs d'entrées de textbfU
  • vecBlockInV : est la liste des blocks à découper pour obtenir les valeurs d'entrées de textbfV
  • blockNbRow : est le nombre de lignes maximale d'un bloc
  • blockNbCol : est le nombre de colonnes maximale d'un bloc
  • matBroadcastDeltaSquare : est la matrice de poids que nous avons évoqués précédemment (section 4.1.1.1) mais en version vecotrielle
  • nbStencilRow : le nombre de lignes de cette matrice de poids (pour nous ce sera 3)
  • nbStencilCol : le nombre de colonnes de cette matrice de poids (pour nous ce sera 3)
  • diffudionRateU : le taux de diffusion de l'espèce U
  • diffusionRateV : le taux de diffusion de l'espèce V
  • feedRate : la vitesse du processus qui nourrit U et tue V et P
  • textbfkillRate : le taux de conversion de V en P
  • dt : l'intervalle de temps du calcul (plus il est petit plus le calcul sera précis noteBien sûr, si vous mettez un nombre dénormalisé comme pas de temps ça n'a aucun sens et vos résultats seront tout pourri, mais je me comprends.)
Le fait de garder les vecteurs de blocs permet de ne pas les réallouer à chaque fois que l'on traite une image.


Et finalement la fin de la condition du préprocesseur :

1
#endif


Le fichier intrinsics_propagation_block.h complet :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/***************************************
	Auteur : Pierre Aubert
	Mail : pierre.aubert@lapp.in2p3.fr
	Licence : CeCILL-C
****************************************/
#ifndef __INTRINSICS_PROPAGATION_BLOCK_H__
#define __INTRINSICS_PROPAGATION_BLOCK_H__
#include "PTensor.h"
void grayscott_propagation_block(PTensor<float> & outMatVecU, PTensor<float> & outMatVecV, const PTensor<float> & matVecVecU, const PTensor<float> & matVecVecV,
				std::vector<PBlock<float> > & vecBlockOutU, std::vector<PBlock<float> > & vecBlockOutV,
				std::vector<PBlock<float> > & vecBlockInU, std::vector<PBlock<float> > & vecBlockInV,
				size_t blockNbRow, size_t blockNbCol,
				const float * matBroadcastDeltaSquare, long nbStencilRow, long nbStencilCol,
				float diffusionRateU, float diffusionRateV, float feedRate, float killRate, float dt);
#endif


Vous pouvez le télécharger ici.