Ho un codice che funziona abbastanza bene, ma mi piacerebbe farlo funzionare meglio. Il problema principale che ho con esso è che ha bisogno di avere un ciclo annidato. Quella esterna è per le iterazioni (che devono avvenire in serie), e quella interna per ogni particella punto in esame. So che non c'è molto che possa fare quello esterno, ma mi chiedo se c'è un modo di ottimizzare qualcosa di simile:SIMD ne vale la pena? C'è un'opzione migliore?
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;
}
}/*}}}*/
Ho guardato SIMD, anche se non riesco a trovare molto su esso, e non sono del tutto sicuro che l'elaborazione richiesta per estrarre e impacchettare correttamente i dati varrebbe la pena di fare la metà delle istruzioni, dal momento che apparentemente solo due doppi possono essere usati contemporaneamente.
Ho provato a suddividerlo in più thread con shm e pthread_barrier (per sincronizzare le diverse fasi, di cui il codice precedente è uno), ma lo ha reso più lento.
Il mio codice attuale è abbastanza veloce; è nell'ordine di un secondo per 10M di iterazioni di particelle * e da quello che posso dire da gprof, il 30% del mio tempo viene speso solo in quella funzione (5000 chiamate; PART_COUNT = 8192 particelle impiegano 1,8 secondi). Non sono preoccupato per le piccole cose a tempo costante, sono solo 512K particelle * 50.000 iterazioni * 1000 esperimenti hanno impiegato più di una settimana l'ultima volta.
Credo che la mia domanda sia se esiste un modo per gestire questi lunghi vettori che è più efficiente del semplice scorrere su di essi. Mi sento come dovrebbe essere, ma non riesco a trovarlo.
Grazie per aver accettato la mia risposta. Quanto ha aiutato qualcuno di quelli? – celion