squalyl> ouai les swizzle donc ^^
code du swizzle pas terrible tout simplement

nos swizzles doivent pouvoir gerer x y z w 0 et 1, du coup c'est le symptome d'un code qui se veut quand meme semi-generique et qui peut pas (et veut pas!) specialiser toutes les combinaisons possibles, donc il y a une specialisation par dimension, mais a chaque iteration, pour chaque composante de destination, il y a une indirection memoire, c'est pas unroll, pas de SIMD, bref, ca prend cher.
sinon, tous les buffers sont cache-line aligned, mais en l'occurence, vu que ca c'est des loads scalaires qui sont fait, ca change rien (c'est de toutes facons tout le temps au moins aligned a 4 bytes).
bon jsuis pas trop sense montrer des screens mais juste un bout ca passe jpense

on voit bien les hits (de porc) sur un fx plus simple qui applique juste une velocity+accel simple:

en bleu c'est du spawn, on s'en fout.
les lignes jaunes c'est run a l'update
les 3 loads du debut prennent ultra cher, la data est froide, c'est le cout des cache misses (et pour les float3 du packing, les data d'origine sont en float4 avec un 'w' de padding, et sont recompactees au moment du load en float3, mais le coup du shuffling est infime compare au cache, donc quasiment toute la barre qu'on voit, c'est les cache misses (pas de false-sharing non plus, on a un algo qui place les buffers en memoire pour minimiser l'aliasing).
les swizzle (.xxx) prennent ultra cher compare aux autres ops.
et pour chaque operation, il y a des loads et des stores, c'est pas un asm compile tel quel qui passe par des registres HW, chaque instruction s'execute sur un gros batch (des blocs de ~1K elements), donc load toutes les operandes, fait l'op, et les re-store derriere pour l'op d'apres.
le store final n'utilise pas de non-temporal stores, et unpack l'array de float3 en array de float4
sinon quasiment toutes les ops a part swizzles et load sont unroll en AVX (il y a un hot dispatch au runtime entre SSE2 et plus si la machine le supporte, mais la en l'occurence ma machine c'est un i7 qui gere l'AVX, donc AVX)
Avec les non-temporal stores ca donne ca:

^^