我有一些代碼運行得很好,但我想讓它運行得更好。我對它的主要問題是它需要嵌套for循環。外層是用於迭代(它必須連續發生),內層是針對每個點粒子的考慮。我知道有沒有什麼我可以做外一個,但我不知道是否有優化類似的方式:SIMD值得嗎?有更好的選擇嗎?
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;
}
}/*}}}*/
我已經看了SIMD,雖然我不能找到太多有關它並且我不完全確定,正確提取和打包數據所需的處理值得獲得執行一半指令的收益,因爲顯然一次只能使用兩個雙打。
我試圖用shm和pthread_barrier將它分解成多個線程(同步上面的代碼是不同的階段),但它讓它變慢了。
我目前的代碼確實很快;每10M粒子*次迭代次數爲1秒,從gprof中我可以看出,30%的時間僅用於該函數(5000次調用; PART_COUNT = 8192次粒子耗時1.8秒)。我並不擔心小的恆定時間的事情,只是512K粒子* 50K迭代* 1000次實驗上次超過一週。
我想我的問題是,如果有任何處理這些長矢量的方法比循環遍歷它們更有效。我覺得應該有,但我找不到它。
感謝您接受我的回答。這些幫助有多少? – celion 2010-07-21 19:48:03