मेरे पास कुछ कोड है जो काफी अच्छी तरह से चलता है, लेकिन मैं इसे बेहतर चलाने के लिए चाहता हूं। मेरे साथ बड़ी समस्या यह है कि इसे लूप के लिए घोंसला होना चाहिए। बाहरी एक पुनरावृत्तियों के लिए है (जो क्रमशः होना चाहिए), और आंतरिक एक विचार के तहत प्रत्येक बिंदु कण के लिए है। मैं वहाँ ज्यादा मैं बाहरी एक के बारे में क्या कर सकते हैं नहीं है पता है, लेकिन अगर वहाँ की तरह कुछ के अनुकूलन का एक तरीका है मैं सोच रहा हूँ: मैं 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;
}
}/*}}}*/
, हालांकि मैं के बारे में ज्यादा नहीं मिल सकता है यह, और मुझे पूरी तरह से यकीन नहीं है कि डेटा को सही तरीके से निकालने और पैक करने के लिए आवश्यक प्रसंस्करण आधे से अधिक निर्देश करने के लाभ के लायक होगा, क्योंकि जाहिर है कि एक समय में केवल दो युगल का उपयोग किया जा सकता है।
मैंने इसे शम और pthread_barrier के साथ कई धागे में तोड़ने की कोशिश की (विभिन्न चरणों को सिंक्रनाइज़ करने के लिए, जिसमें उपर्युक्त कोड एक है), लेकिन यह सिर्फ धीमा हो गया।
मेरा वर्तमान कोड बहुत तेज़ी से चला जाता है; यह एक सेकंड प्रति 10 एम कण * पुनरावृत्तियों के क्रम में है, और मैं जीप्रोफ से क्या कह सकता हूं, मेरे समय का 30% अकेले उस समारोह में खर्च किया जाता है (5000 कॉल; PART_COUNT = 8192 कण 1.8 सेकेंड लेते हैं)। मैं छोटी, निरंतर समय की चीजों के बारे में चिंतित नहीं हूं, यह सिर्फ 512 के कण * 50 के पुनरावृत्तियों * 1000 प्रयोगों ने पिछले हफ्ते एक सप्ताह से अधिक समय लिया था।
मुझे लगता है कि मेरा सवाल यह है कि यदि इन लंबे वैक्टरों से निपटने का कोई तरीका है जो उनके माध्यम से लूपिंग से अधिक कुशल है। मुझे लगता है कि ऐसा होना चाहिए, लेकिन मुझे यह नहीं मिल रहा है।
मेरे उत्तर को स्वीकार करने के लिए धन्यवाद। इनमें से कोई भी मदद किसने की? – celion