2012-04-25 15 views
6

x86-64 के एसएसई निर्देश (वेक्टर निर्देश) सामान्य निर्देशों को बेहतर प्रदर्शन करते हैं। क्योंकि मैं जो देख रहा हूं वह यह है कि एसएसई निर्देशों को निष्पादित करने के लिए आवश्यक भार और स्टोर वेक्टर गणना के कारण हमारे पास होने वाले किसी भी लाभ को कम कर रहे हैं। तो क्या कोई मुझे एक उदाहरण एसएसई कोड दे सकता है जहां यह सामान्य कोड से बेहतर प्रदर्शन करता है।एसएसई निर्देश सामान्य निर्देशों से बेहतर प्रदर्शन करते हैं

इसकी शायद क्योंकि मैं प्रत्येक पैरामीटर अलग से गुजर रहा हूँ, इस तरह ...

__m128i a = _mm_set_epi32(pa[0], pa[1], pa[2], pa[3]); 
__m128i b = _mm_set_epi32(pb[0], pb[1], pb[2], pb[3]); 
__m128i res = _mm_add_epi32(a, b); 

for(i = 0; i < 4; i++) 
po[i] = res.m128i_i32[i]; 

नहीं है वहाँ एक तरह से मैं एक बार में सभी 4 पूर्णांकों पारित कर सकते हैं, मैं पूरी 128 बाइट्स पारित मतलब एक बार में pa का? और एक बार में res.m128i_i32po असाइन करें?

+1

मूल रूप से, जब भी आप एक अत्यंत उच्च अभिकलन/लोड स्टोर है अनुपात। – Mysticial

+2

हाँ, आप निश्चित रूप से '_mm_set_epi32()' का उपयोग नहीं करना चाहते हैं। '_mm_load_si128()' का प्रयोग करें।और यदि आप डेटा को संरेखित नहीं कर सकते हैं, तो आप प्रदर्शन दंड पर '_mm_loadu_si128()' का उपयोग कर सकते हैं। – Mysticial

+1

डेटा संरेखित करें? तुम्हारा इससे क्या मतलब है? – pythonic

उत्तर

10

एक जवाब में सारांश की टिप्पणियां:

आप मूल रूप से एक ही जाल है कि सबसे पहले टाइमर पकड़ता में गिर गए हैं। असल में आपके उदाहरण में दो समस्याएं हैं:

  1. आप _mm_set_epi32() का दुरुपयोग कर रहे हैं।
  2. आपके पास बहुत कम गणना/लोड-स्टोर अनुपात है। (अपने उदाहरण में 3 करने के लिए 1)

_mm_set_epi32() एक बहुत ही महंगा लिए स्वाभाविक है। हालांकि इसका उपयोग करना सुविधाजनक है, यह एक भी निर्देश को संकलित नहीं करता है। _mm_set_epi32() का उपयोग करते समय कुछ कंपाइलर (जैसे वीएस -2010) बहुत खराब प्रदर्शन कोड उत्पन्न कर सकते हैं।

इसके बजाय, चूंकि आप स्मृति के संगत ब्लॉक लोड कर रहे हैं, तो आपको _mm_load_si128() का उपयोग करना चाहिए। यह आवश्यक है कि सूचक 16 बाइट्स के साथ गठबंधन किया गया हो। यदि आप इस संरेखण की गारंटी नहीं दे सकते हैं, तो आप _mm_loadu_si128() का उपयोग कर सकते हैं - लेकिन प्रदर्शन दंड के साथ। आदर्श रूप से, आपको अपने डेटा को सही ढंग से संरेखित करना चाहिए ताकि _mm_loadu_si128() का उपयोग करने के लिए उपयोग करने की आवश्यकता न हो।


एसएसई के साथ वास्तव में कुशल होना, आप भी अपनी गणना/लोड-स्टोर अनुपात को अधिकतम करना चाहते हैं। एक लक्ष्य जो मैं शूट करता हूं वह प्रति स्मृति-पहुंच के लिए 3 - 4 अंकगणितीय निर्देश है। यह काफी उच्च अनुपात है। आम तौर पर आपको कोड को दोबारा सुधारना होगा या इसे बढ़ाने के लिए एल्गोरिदम को फिर से डिजाइन करना होगा। डेटा पर गुजरने का संयोजन एक आम दृष्टिकोण है।

लूप अनोलिंग अक्सर प्रदर्शन को अधिकतम करने के लिए आवश्यक होती है जब आपके पास लंबी निर्भरता श्रृंखला वाले बड़े पाश निकायों होते हैं।


एसओ प्रश्नों के कुछ उदाहरण जो सफलतापूर्वक एसएसई का उपयोग स्पीडअप प्राप्त करने के लिए करते हैं।

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