आमतौर पर आप अपने पाश में 4 आंशिक योग पैदा करते हैं और फिर बस पाश के बाद, उदाहरण के लिए 4 तत्वों भर में क्षैतिज योग
#include <cassert>
#include <cstdint>
#include <emmintrin.h>
float vsum(const float *a, int n)
{
float sum;
__m128 vsum = _mm_set1_ps(0.0f);
assert((n & 3) == 0);
assert(((uintptr_t)a & 15) == 0);
for (int i = 0; i < n; i += 4)
{
__m128 v = _mm_load_ps(&a[i]);
vsum = _mm_add_ps(vsum, v);
}
vsum = _mm_hadd_ps(vsum, vsum);
vsum = _mm_hadd_ps(vsum, vsum);
_mm_store_ss(&sum, vsum);
return sum;
}
नोट: ऊपर के उदाहरण a
के लिए 16 बाइट गठबंधन होना चाहिए और n
4. की एक बहु होना चाहिए a
के संरेखण की गारंटी नहीं हो सकते हैं तो _mm_load_ps
के बजाय _mm_loadu_ps
का उपयोग करें। यदि n
4 के एकाधिक होने की गारंटी नहीं है तो किसी भी शेष तत्वों को जमा करने के लिए फ़ंक्शन के अंत में एक स्केलर पाश जोड़ें।
स्रोत
2013-07-20 10:31:24
क्या आपने कुछ भी कोशिश की? – harold
क्या आप वास्तव में जेनरेट कोड देखते हैं? जीसीसी के साथ कम से कम मेरा अनुभव यह है कि जब संभव हो तो एसएसई निर्देशों को करने में यह बहुत अच्छा काम करता है - लेकिन इसकी आवश्यकता हो सकती है -ओ 3। –