2011-12-16 21 views
17

के घटक जोड़ना मैं एक एकल फ्लोट प्राप्त करने के लिए एसएसई रजिस्टर के चार घटक जोड़ना चाहता हूं। इस तरह मैं इसे अब करता हूं:एसएसई रजिस्टर

float a[4]; 
_mm_storeu_ps(a, foo128); 
float x = a[0] + a[1] + a[2] + a[3]; 

क्या कोई एसएसई निर्देश है जो सीधे इसे प्राप्त करता है?

+0

मुझे संदेह है कि यह अस्तित्व में है, लेकिन यदि ऐसा होता है, तो निर्देश 128-बिट आउटपुट रजिस्टर के 32-बिट क्षेत्र में परिणाम देगा, न कि 32-बिट रजिस्टर में। –

उत्तर

10

आप शायद HADDPS SSE3 अनुदेश, या अपने संकलक आंतरिक _mm_hadd_ps,

उदाहरण के लिए इस्तेमाल कर सकते हैं तो आपके पास दो रजिस्टरों v1 और v2 है, तो http://msdn.microsoft.com/en-us/library/yd9wecaa(v=vs.80).aspx

देखें:

v = _mm_hadd_ps(v1, v2); 
v = _mm_hadd_ps(v, v); 

अब, v [0] में v1 के घटक शामिल हैं, और v [1] में v2 के घटक शामिल हैं।

3

ठीक है, मुझे इस तरह के किसी भी फ़ंक्शन के बारे में पता नहीं है, लेकिन यह दो बार _mm_hadd_ps() का उपयोग करके किया जा सकता है।

4

यदि आप चाहते हैं कि आपका कोड प्री-एसएसई 3 सीपीयू (जो _mm_hadd_ps का समर्थन नहीं करता) पर काम करना चाहते हैं, तो आप निम्न कोड का उपयोग कर सकते हैं। यह अधिक निर्देशों का उपयोग करता है, लेकिन अधिकतर CPUs पर कम माइक्रोप्स को डीकोड करता है।

__m128 temp = _mm_add_ps(_mm_movehl_ps(foo128, foo128), foo128); 
float x; 
_mm_store_ss(&x, _mm_add_ss(temp, _mm_shuffle_ps(temp, 1))); 
संबंधित मुद्दे