मैं एक 4 डी वेक्टर सामान्य करने की कोशिश कर रहा हूं।सरल सन्निकटन से एसएसई सामान्यीकरण धीमा?
मेरा पहला दृष्टिकोण एसएसई इंट्रिनिक्स का उपयोग करना था - कुछ ऐसा जो मेरे वेक्टर अंकगणित में 2 गुना गति प्रदान करता था। यहाँ बुनियादी कोड है: (v.v4 इनपुट है) (जीसीसी का उपयोग कर) (यह सब inlined है)
//find squares
v4sf s = __builtin_ia32_mulps(v.v4, v.v4);
//set t to square
v4sf t = s;
//add the 4 squares together
s = __builtin_ia32_shufps(s, s, 0x1B);
t = __builtin_ia32_addps(t, s);
s = __builtin_ia32_shufps(s, s, 0x4e);
t = __builtin_ia32_addps(t, s);
s = __builtin_ia32_shufps(s, s, 0x1B);
t = __builtin_ia32_addps(t, s);
//find 1/sqrt of t
t = __builtin_ia32_rsqrtps(t);
//multiply to get normal
return Vec4(__builtin_ia32_mulps(v.v4, t));
मैं disassembly की जाँच करें और यह मैं कैसे उम्मीद करेंगे की तरह दिखता है। मुझे वहां कोई बड़ी समस्या नहीं दिख रही है।
फिर भी, तो मैं यह एक सन्निकटन उपयोग करने की कोशिश: (मैं गूगल से यह मिल गया)
float x = (v.w*v.w) + (v.x*v.x) + (v.y*v.y) + (v.z*v.z);
float xhalf = 0.5f*x;
int i = *(int*)&x; // get bits for floating value
i = 0x5f3759df - (i>>1); // give initial guess y0
x = *(float*)&i; // convert bits back to float
x *= 1.5f - xhalf*x*x; // newton step, repeating this step
// increases accuracy
//x *= 1.5f - xhalf*x*x;
return Vec4(v.w*x, v.x*x, v.y*x, v.z*x);
यह SSE संस्करण की तुलना में थोड़ा तेजी से चल रहा है! (लगभग 5-10% तेज) इसके परिणाम भी बहुत सटीक हैं - लंबाई खोजने पर मैं 0.001 कहूंगा! लेकिन .. जीसीसी मुझे उस लंगड़ा प्रकार के कारण लंगड़ा सख्त एलियासिंग नियम दे रहा है। संशोधित संस्करण (कोई चेतावनी के साथ) धीमी चल रहा है
union {
float fa;
int ia;
};
fa = (v.w*v.w) + (v.x*v.x) + (v.y*v.y) + (v.z*v.z);
float faHalf = 0.5f*fa;
ia = 0x5f3759df - (ia>>1);
fa *= 1.5f - faHalf*fa*fa;
//fa *= 1.5f - faHalf*fa*fa;
return Vec4(v.w*fa, v.x*fa, v.y*fa, v.z*fa);
और अब !!:
तो मैं इसे संशोधित यह लगभग 60% गति चल रहा है जो एसएसई संस्करण चलाता है (लेकिन एक ही परिणाम)! ऐसा क्यों है?
तो यहाँ सवाल (रों) है:
- मेरी SSE implentation सही है?
- एसएसई सामान्य एफपीयू संचालन से वास्तव में धीमी है?
- तीसरा कोड इतना धीमा क्यों है?
यह जानने में मदद करेगा कि आप किस सीपीयू का उपयोग कर रहे हैं। जैसे पुराने x86 CPUs (पूर्व कोर 2) में बहुत खराब एसएसई क्षमताओं थी। –
मैं इंटेल पेंटियम ड्यूल-कोर – Pubby
पर हूं http://stackoverflow.com/questions/1528727/why-is-sse-scalar-sqrtx-slower-than-rsqrtx-x का डुप्लिकेट? – celion