Tôi có một số mã chạy khá tốt, nhưng tôi muốn làm cho nó chạy tốt hơn. Vấn đề chính tôi có với nó là nó cần phải có một vòng lặp lồng nhau. Cái bên ngoài là cho các phép lặp (mà phải xảy ra serially), và cái bên trong là cho từng hạt điểm được xem xét. Tôi biết không có nhiều tôi có thể làm gì về người ngoài, nhưng tôi đang tự hỏi nếu có một cách tối ưu hóa một cái gì đó như:SIMD có đáng giá không? Có lựa chọn nào tốt hơn không?
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;
}
}/*}}}*/
Tôi đã nhìn vào SIMD, mặc dù tôi không thể tìm thấy nhiều về nó, và tôi không hoàn toàn chắc chắn rằng việc xử lý cần thiết để trích xuất và đóng gói dữ liệu đúng sẽ đáng để đạt được một nửa như nhiều hướng dẫn, vì dường như chỉ có hai đôi có thể được sử dụng tại một thời điểm.
Tôi đã cố gắng chia nhỏ thành nhiều chuỗi với shm và pthread_barrier (để đồng bộ hóa các giai đoạn khác nhau, trong đó mã ở trên là một), nhưng nó chỉ làm cho nó chậm hơn.
Mã hiện tại của tôi không hoạt động khá nhanh; đó là thứ tự của một giây cho mỗi lần lặp 10 triệu hạt * và từ những gì tôi có thể nói từ gprof, 30% thời gian của tôi chỉ dành cho chức năng đó (5000 cuộc gọi; PART_COUNT = 8192 hạt mất 1,8 giây). Tôi không lo lắng về những thứ thời gian nhỏ, liên tục, nó chỉ là các hạt 512K * 50K lần lặp * 1000 thử nghiệm mất hơn một tuần thời gian qua.
Tôi đoán câu hỏi của tôi là nếu có bất kỳ cách nào để xử lý các vectơ dài này hiệu quả hơn là chỉ lặp qua chúng. Tôi cảm thấy như có nên, nhưng tôi không thể tìm thấy nó.
Cảm ơn bạn đã chấp nhận câu trả lời của tôi. Bao nhiêu người đã giúp đỡ? – celion