Simulateur de particules
Mala
Membre, Modérateur
Histoire de m'aérer les neurones, je me suis amusé à faire un petit simulateur de particules. C'est un sujet assez intéressant pour bien cerner les optimisations de codage aussi bien en terme d'algorithmie que de parallélisation.
Dans la foulée, je me suis aussi fait les dents sur la vectorisation SSE. Le gain apporté est très intéressant. Avec 2048 particules, sur mon Core 2 Duo 2,16Ghz, au bout d'un moment on a l'impression d'observer un amas globulaires en mouvement. L'impression de "vie" qui en résulte est assez poétique je trouve...
:fouf):
Je vous livre la petite application (Intel seulement) qui en résulte...
Galaxy.zip
Elle permet au passage d'estimer le nombre de GFLOPS de la machine. Cela peut s'avérer intéressant pour comparer la puissance de calcul entre deux machines.
Dans la foulée, je me suis aussi fait les dents sur la vectorisation SSE. Le gain apporté est très intéressant. Avec 2048 particules, sur mon Core 2 Duo 2,16Ghz, au bout d'un moment on a l'impression d'observer un amas globulaires en mouvement. L'impression de "vie" qui en résulte est assez poétique je trouve...
:fouf):
Je vous livre la petite application (Intel seulement) qui en résulte...
Galaxy.zip
Elle permet au passage d'estimer le nombre de GFLOPS de la machine. Cela peut s'avérer intéressant pour comparer la puissance de calcul entre deux machines.
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Wow
Le top serait d'avoir la même chose en économiseur d'écran avec un peu de couleurs.
Mon mac ce fait vieux :-\\
En tout cas super ton simulateur, ça ferait un tabac comme fond d'écran dans le monde de la recherche avec toutes ces petites particules.
Galaxy1_1.zip
Le principe consiste à considérer qu'un groupe de particules éloignées est assimilable à une force proportionnelle à l'ensemble de leur masse au point de barycentre. On construit alors un arbre 3D ayant pour but de regrouper les particules en fonction de leur position.
Un lien intéressant (mais à extrapoler en 3D pour bien faire) <br />http://www.cs.princeton.edu/courses/archive/fall04/cos126/assignments/barnes-hut.html
Ce calcul est néanmoins une approximation. Un coefficient permet de régler la précision/vitesse de calcul. Dans mon cas, j'ai figé le coef à 0.5 pour avoir un bon compromis. Sur un Octo, j'arrive à une vitesse de calcul équivalente à plus de 200 GFlops sur la base de l'algo de force brut de départ. Il faut néanmoins augmenter le nombre de particules pour creuser l'écart.
En dégradant un peu plus la précision, on devrait pouvoir obtenir quelque chose de compatible pour un économiseur d'écran...
NB: pour le moment, la vectorisation n'est pas prise en compte par l'algo de Barnes & Hut. Le fonctionnement sur la base d'un arbre rend la vectorisation un peu plus délicate.
Galaxy1_2.zip
Il me reste à vectoriser pour voir ce que ça donne.
http://www.particules.eliotis.com
Pour le moment, seulement deux articles faute de temps mais c'est déjà ça:
- "Introduction" qui est plutôt de la vulgarisation.
- "Premier projet" où l'on rentre dans le vif du sujet avec une première version du simulateur de particule.
Dans le prochain article, je pense aborder les optimisations en mono-thread. :brule:
Edit: dans la foulée, ce serait sympa de faire aussi quelques benchs entre 32bits et 64bits.
- "Optimisation": Tests 32/64bits, tests sur la précision de calcul et optimisation sur la partie algorithme.
Prochaine étape: optimisation par parallélisation (Vectorisation et Multi-threading).
Et pour finir, j'ai prévu un portage iPhone avec Open GL ES pour voir ce que l'iPhone a dans le ventre...
Tu fait ça avec OpenGL ?
Oui c'est normal. Ce n'est pas la partie graphique qui met ta machine à genou mais les calculs gravitationnels.
Il faut bien comprendre qu'il y a simulateur et simulateurs. Certains sont pensés pour faire du rendu pour les jeux et d'autres du calcul scientifique. La on est dans le deuxième cas de figure. Le programme simule les interactions gravitationnelles entre toutes les particules. Si tu es à 2048 sur ton Mac book, cela sous entend qu'à chaque 'image' le programme fait un calcul de l'ordre de 2048^2 interactions soit plus de 4 millions de traitements. Sachant que pour chaque traitement entre deux particules, le programmes calcul la distance qui les sépares, puis en déduit la force exercée pour aboutir à l'accélération et enfin la vitesse instantanée.
Je t'invite à regarder les sources et à lire la présentation pour mieux comprendre ce qui se passe.