5.3.1.1 : Le header intrinsics_propagation_link_block.h
Écrivons le fichier intrinsics_propagation_link_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_LINK_BLOCK_H__
#define __INTRINSICS_PROPAGATION_LINK_BLOCK_H__
|
Nous aurons besoin de découper nos tenseurs en blocs :
Le prototype de notre fonction qui calcule un bloc :
1
2
3
4
|
void grayscott_propagation_compute_link_block(PBlock<float> & outMatVecU, PBlock<float> & outMatVecV,
const PBlock<float> & matVecVecU, const PBlock<float> & matVecVecV,
const float * matBroadcastDeltaSquare, long nbStencilRow, long nbStencilCol,
float diffusionRateU, float diffusionRateV, float feedRate, float killRate, float dt);
|
Le prototype de notre fonction qui traite des vecteurs de blocs :
1
2
3
4
|
void grayscott_propagation_link_block(std::vector<PBlock<float> > & vecBlockOutU, std::vector<PBlock<float> > & vecBlockOutV,
std::vector<PBlock<float> > & vecBlockInU, std::vector<PBlock<float> > & vecBlockInV,
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
- 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 )
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 :
Le fichier
intrinsics_propagation_link_block.h complet :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
#ifndef __INTRINSICS_PROPAGATION_LINK_BLOCK_H__
#define __INTRINSICS_PROPAGATION_LINK_BLOCK_H__
#include "PTensor.h"
void grayscott_propagation_compute_link_block(PBlock<float> & outMatVecU, PBlock<float> & outMatVecV,
const PBlock<float> & matVecVecU, const PBlock<float> & matVecVecV,
const float * matBroadcastDeltaSquare, long nbStencilRow, long nbStencilCol,
float diffusionRateU, float diffusionRateV, float feedRate, float killRate, float dt);
void grayscott_propagation_link_block(std::vector<PBlock<float> > & vecBlockOutU, std::vector<PBlock<float> > & vecBlockOutV,
std::vector<PBlock<float> > & vecBlockInU, std::vector<PBlock<float> > & vecBlockInV,
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.