Alors (avec N=100 cette fois, j'avais mis à 64 par erreur plus haut)
Le static de static void compute... ne semble pas avoir d'effet particulier.Code:
1
2
3
4
5
6 Test original : 3520.54 ms Test avec float* Q = new float[N*N*N+16]+16; 1919.73 ms Test avec le dernier code de screetch (alloca) 2018.73
Donc au final, si je comprends bien, le problème venait du fait que le compilateur aligne en mémoire les deux adresses de P et Q (lors du new), ce qui fait qu'il ne peut plus y accéder simultanément après (mais alors pourquoi les aligner ?). Et dans le dernier code les calculs intermédiaires sont fait dans la pile (avec alloca) pour forcer le compilateur a comprendre qu'il n' y a pas d'aliasing, le tas et la pile étant bien distinct. C'est à peu près ça ? :?