Bonjour à toutes et tous,
en ce moment je travail sur un petit projet où j'implémente un graphe de scène et j'essaye de trouver la façon la plus performante de mettre à jour les données des noeuds de ce graphe. Pour cela il y a deux approches majeurs, où on représente notre graphe en "POO classique", on fait une hiérarchie de noeuds et quand on les met à jour le noeud parent va appeler la fonction membre de mise à jour de ses noeuds fils. Le problème c'est que cette technique n'est pas du tout cache friendly. Du coup j'ai regardé du côté des Data Oriented Design. En gros les données à mettre à jour sont packées dans des tableaux et la hiérarchie ne sert plus qu'à avoir un accès aux données d'une façon similaire à la POO sauf que les données ne sont pas contenu dans les noeuds du graphe qui ne contiennent qu'un index de l'emplacement de leurs données dans les tableaux.
Bref je vous explique tout ça pour vous situer exhaustivement le contexte et parce que si quelqu'un la déjà implémenté ça m'intéresse, car moi je l'ai fais, ça marche sauf que les performances ne sont vraiment pas au rendez-vous.

Du coup j'en viens à ma question qui va paraître très basique à côté du pâté que je viens d'écrire. Quand on déréférence un pointeur et que la donnée est chargée (sans parlé du prefetching), le CPU charge plus que notre donnée il charge quelques octets qui suivent j'imagine ? (sinon quel serait l'intérêt d'avoir des données contigus). J'imagine que ça dépend du processeur mais combien d'octets va-t-il chargé en plus de la donnée critique (celle qu'on demande) ? Mon tableau c'est un vector de matrice 4x4 float, donc c'est assez lourd, du coup je me demande combien il va en charger d'avance ...
Et si les octets d'après ne font pas partis du tableaux il les chargent quand même et puis advienne que pourra c'est au développeur de faire en sorte de ne pas taper dedans (bon ça oui mais est-ce que les données sont quand même transférées vers le cache) ?

En fait j'ai implémenter une version POO et une version DOD (qui me paraît suivre les critères du pattern assez rigoureusement) en version multithreadé, et je n'ai pas une différence de performance énorme, je passe de 170 FPS en POO à 250 en DOD, bon c'est pas mal mais cette différence est dû au fait que je met à jour un nombre important de noeuds (11111 pour être précis), sachant qu'une scène est rarement composé d'autant de noeuds... On dirait que le compilateur (celui de Visual C++) optimise tellement à fond la POO que ça tend à se rapprocher de la version DOD (j'ai activé toutes les optimisations possibles, fonctions intrinsèques et compagnie ...). Ce résultat vous paraît-il étrange ?

Merci d'avance