2012-06-03 26 views
5

मैं एमएस विजुअल स्टूडियो में एसएसई 2 निर्देश सेट के साथ काम कर रहा हूं। मैं 16-बिट डेटा के साथ कुछ गणना करने के लिए इसका उपयोग कर रहा हूं।एक 128-बिट निरंतर कुशलता से परिभाषित करने के लिए कैसे?

मान लीजिए मेरे पास एसएसई रजिस्टर में 8 मान लोड हैं। मैं उन सभी को एक स्थिर (उदा। 42) जोड़ना चाहता हूं। यहां बताया गया है कि मैं अपने कोड को कैसे देखना चाहूंगा।

__m128i values; // 8 values, 16 bits each 
const __m128i my_const_42 = ???; // What should i write here? 
values = _mm_add_epi16(values, my_const_2); // Add 42 to the 8 values 

अब, मैं निरंतर परिभाषित कैसे कर सकता हूं? निम्नलिखित दो तरीके काम करते हैं, लेकिन एक अक्षम है, और दूसरा बदसूरत है।

  1. my_const_42 = _mm_set_epi16(42, 42, 42, 42, 42, 42, 42, 42) - संकलक "बनाने" के 8 आदेशों उत्पन्न निरंतर
  2. my_const_42 = {42, 0, 42, 0, 42, 0, 42, 0, 42, 0, 42, 0, 42, 0, 42, 0} - समझने के लिए क्या चल रहा है मुश्किल; बदलकर 42 बदलना -42 छोटा नहीं है

128-बिट निरंतर अधिक आसानी से व्यक्त करने का कोई तरीका है?

+1

शायद दूसरी विधि के लिए मैक्रो का उपयोग करना ठीक है – valdo

उत्तर

8

युद्ध के नब्बे प्रतिशत सही आंतरिक खोज रहे हैं। एमएसडीएन लाइब्रेरी बहुत अच्छी तरह व्यवस्थित है, this page से शुरू करें। वहाँ से, इस तरह अंदर घुसते हैं:

  • तुम्हें पता है आप "MMX, SSE और SSE2 intrinsics" उपयोग करना चाहते हैं, तो उस लिंक
  • तुम्हें पता है आप "स्ट्रीमिंग SIMD एक्सटेंशन 2" का उपयोग करना चाहते क्लिक करें, उस पर क्लिक करें लिंक
  • अगला आकर्षक कड़ी है "पूर्णांक मेमोरी और प्रारंभ" जब से तुम चल बिन्दु नहीं करना चाहती
  • आप दो प्रासंगिक लिंक, लोड और सेट संचालन मिलेगा
  • लोड केवल आपके जो आपके द्वारा पहले
  • पाया हो जाता है

सेट सुनहरा है, _mm_set1_epi16 (short w)

2

एसएसई (या एनईओएन) में स्थिरांक बनाने के बारे में कुछ ध्यान देने योग्य है। स्मृति निष्पादन की तुलना में स्मृति से डेटा लोड करना बेहद धीमा है। यदि आपको स्थिरता की आवश्यकता है जो कोड के माध्यम से बनाना संभव है, तो यह तेज़ विकल्प है। कोड के माध्यम से बनाए गए स्थिरांक के कुछ उदाहरण यहां दिए गए हैं:

xmmTemp = _mm_cmpeq_epi16(xmmA, xmmA); // FFFF 
xmmTemp = _mm_slli_epi16 (mmxTemp, 7); // now it has 0xFF80 (-128) 

xmmTemp = _mm_cmpeq_epi16(xmmA, xmmA); // FFFF 
xmmTemp = _mm_slli_epi16 (mmxTemp, 15); // 0x8000 
xmmTemp = _mm_srli_epi16 (mmxTemp, 11); // 0x10 (positive 16) 
संबंधित मुद्दे