2011-02-15 12 views
11

मैं एसएसई (2/3) रजिस्टरों में संकलन समय निरंतर फ्लोट लोड करने का एक प्रभावी तरीका जानने का प्रयास कर रहा हूं। मैंने इस तरह के सरल कोड करने की कोशिश की है,लोड एसएसई रजिस्टरों में निरंतर फ्लोट

const __m128 x = { 1.0f, 2.0f, 3.0f, 4.0f }; 

लेकिन यह स्मृति से 4 movss निर्देश उत्पन्न करता है!

movss  xmm0,dword ptr [[email protected] (14048E534h)] 
movss  xmm1,dword ptr [[email protected] (14048E530h)] 
movaps  xmm6,xmm12 
shufps  xmm6,xmm12,0C6h 
movss  dword ptr [rsp],xmm0 
movss  xmm0,dword ptr [[email protected] (14048E52Ch)] 
movss  dword ptr [rsp+4],xmm1 
movss  xmm1,dword ptr [[email protected] (14048E528h)] 

.. में और स्मृति से बाहर ... (?!?!)

इस हालांकि कर जो scalars लोड

float Align(16) myfloat4[4] = { 1.0f, 2.0f, 3.0f, 4.0f, }; // out in global scope 

उत्पन्न करता है।

movaps  xmm5,xmmword ptr [::myarray4 (140512050h)] 

आदर्श रूप में, यह अच्छा होगा यदि मैं स्थिरांक उनके एक तरह से स्पर्श स्मृति को भी यह स्पष्ट नहीं होगा और सिर्फ तत्काल शैली के निर्देश के साथ यह करना है हो सकता है (उदाहरण के लिए स्थिरांक अनुदेश ही में संकलित)।

धन्यवाद

इस जैसे
+2

उच्च प्रदर्शन एसएसई/2 कोड के लिए, मैं अत्यधिक जीसीसी/आईसीसी का उपयोग करने का सुझाव देता हूं। इस बारे में अधिक जानकारी के लिए इसे पढ़ें - http://www.liranuna.com/sse-intrinsics-optimizations-in-popular-compilers/ – LiraNuna

उत्तर

6

यदि आप इसे एक लोड पर मजबूर करना चाहते हैं, तो आप कोशिश कर सकते हैं (gcc):

__attribute__((aligned(16))) float vec[4] = { 1.0f, 1.1f, 1.2f, 1.3f }; 
__m128 v = _mm_load_ps(vec); // edit by sor: removed the "&" cause its already an address 

यदि आपके पास Visual C++ है, तो __declspec(align(16)) का उपयोग करें उचित बाधा का अनुरोध करने के लिए।

अपने सिस्टम पर, यह (gcc -m32 -msse -O2 संकलित; सभी clutters कोड, लेकिन अभी भी एक movaps अंत में बरकरार रखे हुए है में कोई अनुकूलन) निम्नलिखित विधानसभा कोड (जीसीसी/एटी & टी सिंटेक्स) बनाता है:

andl $-16, %esp 
    subl $16, %esp 
    movl $0x3f800000, (%esp) 
    movl $0x3f8ccccd, 4(%esp) 
    movl $0x3f99999a, 8(%esp) 
    movl $0x3fa66666, 12(%esp) 
    movaps (%esp), %xmm0 

ध्यान दें कि यह स्टैकपॉइंटर को आवंटित करने से पहले और वहां स्थिरांक डालने से पहले स्टैकपोइंटर को संरेखित करता है। __attribute__((aligned)) बाहर छोड़कर, आपके कंपाइलर के आधार पर, गलत कोड बनाएं जो ऐसा नहीं करता है, इसलिए सावधान रहें, और डिस्सेप्लर की जांच करें।

इसके अतिरिक्त:
जब से तुम कैसे कोड में स्थिरांक डाल करने के लिए के लिए पूछ रहा है, बस उपरोक्त float सरणी के लिए एक static क्वालीफायर के साथ प्रयास करें।

movaps vec.7330, %xmm0 
    ... 
vec.7330: 
    .long 1065353216 
    .long 1066192077 
    .long 1067030938 
    .long 1067869798 
2

आम तौर पर स्थिरांक किसी भी छोरों या कोड का 'हॉट' भागों से पहले लोड किया जा जाएगा, इसलिए प्रदर्शन है कि महत्वपूर्ण नहीं होना चाहिए। लेकिन अगर आप इस तरह की चीज को लूप के अंदर करने से नहीं बच सकते हैं तो मैं पहले _mm_set_ps आज़माउंगा और देखें कि वह क्या उत्पन्न करता है। जीसीसी की बजाय आईसीसी की कोशिश करें, क्योंकि यह बेहतर कोड उत्पन्न करता है।

+0

मैं विजुअल स्टूडियो का उपयोग कर रहा हूं और _mm_set_ps अधिक movss उत्पन्न कर रहा है। मुझे लगता है कि विजुअल स्टूडियो कंपाइलर बस बहुत भयानक है। – coderdave

+2

@ कोडरडेव: हाँ विजुअल स्टूडियो बहुत खराब एसएसई कोड उत्पन्न करता है - एसएसई के लिए भी इसका उपयोग करना दर्द है क्योंकि इसमें सभी प्रकार के बेवकूफ एबीआई प्रतिबंध और अन्य परेशानियां हैं - जीसीसी या बेहतर आईसीसी का उपयोग करें यदि आप –

3

सबसे पहले, आप किस अनुकूलन स्तर पर संकलन कर रहे हैं? यह देखने के लिए असामान्य नहीं है कि -ऑन या ओ 1 पर कोडजन की तरह, लेकिन मैं इसे अधिकतर कंपाइलरों में -ओ 2 या उच्चतर के साथ देखकर आश्चर्यचकित हूं।

दूसरा, एसएसई में कोई तत्काल भार नहीं है। आप अंत में 0 या (int)-1, तार्किक संचालन के माध्यम से उत्पादन किया जा सकता है जो की तरह कुछ विशेष मूल्यों की अनदेखी कर एक जीपीआर के लिए एक लोड तत्काल कर सकते हैं, तो SSE है कि मूल्य ले जाते हैं, लेकिन आप एक वास्तविक लोड के बिना अन्य मूल्यों जादू नहीं कर सकते हैं (।

, यदि खराब कोड को ऑप्टिमाइज़ेशन के साथ उत्पन्न किया गया है और प्रदर्शन-महत्वपूर्ण स्थान पर, कृपया अपने कंपाइलर के खिलाफ एक बग दर्ज करें।

+0

कर सकते हैं तो मैं निश्चित रूप से संकलित हूं -02 तो ऐसा लगता है कि विजुअल स्टूडियो की कोड पीढ़ी खराब है। जैसे-जैसे मैं अधिक शोध करता हूं ऐसा लगता है कि यह सर्वसम्मति है और अधिकांश लोग एसएसई के लिए वीसी का उपयोग नहीं करते हैं और केवल असेंबली या अन्य कंपाइलर – coderdave

+0

@ कोडरडेव का उपयोग करते हैं: कृपया वीएस के खिलाफ एक बग दर्ज करें। एकमात्र तरीका है कि एमएस को पता चलेगा कि उन्हें समस्या के लिए संसाधनों को समर्पित करना है अगर लोग इसके बारे में शिकायत करते हैं। –

+0

जबकि एसएसई तत्काल भार नहीं करता है (शून्य के लिए 'pxor' या' pcmpeq' जैसे चालों को छोड़कर) यह स्मृति, '_mm_load_ps()' से लोड होता है, इसलिए स्टैक पर सरणी बनाने में कुछ भी गलत नहीं है और वहां से एसएसई रजिस्टर लोड हो रहा है। –

2

जनरेट कर रहा है स्थिरांक बहुत सरल है (और तेज) यदि चार नाव स्थिरांक ही कर रहे हैं: यह निम्नलिखित विधानसभा पैदा करता है। उदाहरण के लिए 1.f 0x3f800000 के लिए बिट पैटर्न है। एक तरीका यह SSE2

 register __m128i onef; 
     __asm__ ("pcmpeqb %0, %0" : "=x" (onef)); 
     onef = _mm_slli_epi32(onef, 25); 
     onef = _mm_srli_epi32(onef, 2); 

SSE4.1 साथ एक और दृष्टिकोण है,

 register uint32_t t = 0x3f800000; 
     register __m128 onef; 
     __asm__ ("pinsrd %0, %1, 0" : "=x" (onef) : "r" (t)); 
     onef = _mm_shuffle_epi32(onef, 0); 

ध्यान दें कि मैं possitive इस संस्करण SSE2 एक से किसी भी तेजी से होता है, तो नहीं कर रहा हूँ का उपयोग कर उत्पन्न किया जा सकता है, न है इसे प्रोफाइल किया, केवल परीक्षण का परीक्षण सही था।

यदि चार फ्लोट्स में से प्रत्येक के मान अलग-अलग होना चाहिए, तो प्रत्येक स्थिरांक को उत्पन्न और शफल या मिश्रित किया जा सकता है।

गीलेर या यह उपयोगी नहीं है यदि कैश मिस की संभावना है, तो स्मृति से निरंतर लोड करना तेज है। इस तरह की चालें vmx/altivec में बहुत उपयोगी होती हैं, लेकिन अधिकांश पीसी पर बड़े कैश इसे एसएसई के लिए कम उपयोगी बना सकते हैं।

एग्नेर फोग के अनुकूलन मैनुअल, पुस्तक 2, खंड 13.4, http://www.agner.org/optimize/ में इसकी अच्छी चर्चा है।

अंतिम नोट, उपरोक्त इनलाइन असेंबलर का उपयोग जीसीसी विशिष्ट है, कारण संकलक चेतावनी उत्पन्न किए बिना अनियमित चर के उपयोग की अनुमति देना है। वीसी के साथ, आपको पहले _mm_setzero_ps() के साथ चर शुरू करने की आवश्यकता हो सकती है या नहीं, तो उम्मीद है कि ऑप्टिमाइज़र इसे हटा सकता है।

संबंधित मुद्दे