J'ai du code qui fonctionne assez bien, mais je voudrais le faire fonctionner mieux. Le problème majeur que j'ai avec cela est qu'il doit avoir une boucle imbriquée. L'externe est pour les itérations (qui doivent arriver en série), et l'interne est pour chaque particule de point considérée. Je sais qu'il n'y a pas beaucoup je peux faire l'externe, mais je me demande s'il y a un moyen d'optimiser quelque chose comme:Est-ce que SIMD le mérite? Y a-t-il une meilleure option?
void collide(particle particles[], box boxes[],
double boxShiftX, double boxShiftY) {/*{{{*/
int i;
double nX;
double nY;
int boxnum;
for(i=0;i<PART_COUNT;i++) {
boxnum = ((((int)(particles[i].sX+boxShiftX))/BOX_SIZE)%BWIDTH+
BWIDTH*((((int)(particles[i].sY+boxShiftY))/BOX_SIZE)%BHEIGHT));
//copied and pasted the macro which is why it's kinda odd looking
particles[i].vX -= boxes[boxnum].mX;
particles[i].vY -= boxes[boxnum].mY;
if(boxes[boxnum].rotDir == 1) {
nX = particles[i].vX*Wxx+particles[i].vY*Wxy;
nY = particles[i].vX*Wyx+particles[i].vY*Wyy;
} else { //to make it randomly pick a rot. direction
nX = particles[i].vX*Wxx-particles[i].vY*Wxy;
nY = -particles[i].vX*Wyx+particles[i].vY*Wyy;
}
particles[i].vX = nX + boxes[boxnum].mX;
particles[i].vY = nY + boxes[boxnum].mY;
}
}/*}}}*/
Je l'ai regardé SIMD, même si je ne trouve pas beaucoup au sujet de et je ne suis pas tout à fait sûr que le traitement nécessaire pour extraire et emballer correctement les données vaudrait la peine de faire la moitié des instructions, car apparemment, seulement deux doubles peuvent être utilisés à la fois.
J'ai essayé de le diviser en plusieurs threads avec shm et pthread_barrier (pour synchroniser les différentes étapes, dont le code ci-dessus est un), mais cela l'a simplement ralenti.
Mon code actuel va assez vite; il est de l'ordre d'une seconde par itérations de particules * 10M, et d'après ce que je peux dire de gprof, 30% de mon temps est consacré à cette seule fonction (5000 appels, PART_COUNT = 8192 particules ont pris 1,8 secondes). Je ne suis pas inquiet pour les petites choses à temps constant, c'est juste que 512K particules * 50K itérations * 1000 expériences ont pris plus d'une semaine la dernière fois. Je suppose que ma question est de savoir s'il est possible de traiter ces longs vecteurs de manière plus efficace que de simplement les parcourir. Je me sens comme il devrait y avoir, mais je ne peux pas le trouver.
Merci d'avoir accepté ma réponse. Combien ont-ils aidé? – celion