2009-10-04 17 views
20

क्या कोड को सदिश बनाना अच्छा विचार है? इसे कब करना है इसके संदर्भ में अच्छे अभ्यास क्या हैं? नीचे क्या होता है?वेक्टरनाइज़ेशन का क्या अर्थ है?

+4

यह भी देखें: http://stackoverflow.com/questions/1422149/what-is-vectorization/ –

उत्तर

35

vectorization का मतलब संकलक पता लगाता है कि है कि अपने स्वतंत्र निर्देश एक SIMD अनुदेश के रूप में क्रियान्वित किया जा सकता। सामान्य उदाहरण है कि अगर आप की तरह

for(i=0; i<N; i++){ 
    a[i] = a[i] + b[i]; 
} 

कुछ करना यह (सदिश अंकन का उपयोग) के रूप में vectorized किया जाएगा

for (i=0; i<(N-N%VF); i+=VF){ 
    a[i:i+VF] = a[i:i+VF] + b[i:i+VF]; 
} 

मूल रूप से संकलक एक ऑपरेशन है कि कम से सरणी के VF तत्वों पर किया जा सकता उठाता है एक ही समय और एन ऑपरेशन एन बार करने के बजाय यह एन/वीएफ बार करता है।

यह प्रदर्शन बढ़ाता है, लेकिन वास्तुकला पर अधिक आवश्यकता रखता है।

+3

तो क्या कोई प्रोग्रामर वेक्टरेशन सुनिश्चित करने के लिए कुछ भी कर सकता है (ऑप्टिमाइज़ेशन चालू करने के अलावा)? – Jacob

+1

जहां तक ​​मुझे पता है कि कंपाइलर्स ऑटो-वेक्टरेशन में सीमित हैं, इसलिए आपकी सबसे अच्छी शर्त यह है कि यह आपके कोड को जितना छोटा हो सके उतना छोटा रखें। इसके अलावा आप यह देखने के लिए उत्पन्न असेंबली कोड देख सकते हैं कि कंपाइलर वेक्टरकृत है या नहीं। – Zed

+1

@jacob: आप वास्तव में इसे "सुनिश्चित" नहीं कर सकते हैं, हो सकता है कि आप वेक्टरिज़ को संकलक को स्पष्ट रूप से बताए जाने के तरीके http://openmp.org/ पर एक नज़र डालें। –

3

यह एसएसई कोड जनरेशन है।

आप इसे matrix1 में नाव मैट्रिक्स कोड के साथ एक पाश है [मैं] [जे] matrix2 [मैं] [जे] और संकलक SSE कोड उत्पन्न करता है।

+1

SEE एकमात्र वेक्टर निर्देश सेट नहीं है। पीपीसी में Altivec है और अन्य आर्किटेक्चर के पास अपने स्वयं के वेक्टर निर्देश भी हैं। – Amok

11

ऊपर उल्लेख किया है, vectorization SIMD निर्देश, जो बड़े रजिस्टरों में पैक अलग डेटा के समान कार्रवाई कर सकते हैं का उपयोग करने के लिए किया जाता है।

लूप के ऑटोवॉक्साइज करने के लिए एक कंपाइलर को सक्षम करने के लिए एक सामान्य दिशानिर्देश यह सुनिश्चित करना है कि कोई प्रवाह नहीं है और एक लूप के विभिन्न पुनरावृत्तियों में एंटी-निर्भरता बी/डब्ल्यू डेटा तत्व हैं।

http://en.wikipedia.org/wiki/Data_dependency

इंटेल सी ++/फोरट्रान compilers जैसे कुछ compilers autovectorizing कोड में सक्षम हैं। यदि यह एक लूप को सदिश करने में सक्षम नहीं था, तो इंटेल कंपाइलर रिपोर्टिंग करने में सक्षम है कि वह ऐसा क्यों नहीं कर सका। वहाँ की रिपोर्ट है कोड ऐसी है कि वह vectorizable हो जाता है संशोधित करने के लिए इस्तेमाल किया जा सकता (यह मानते हुए यह संभव है)

निर्भरता किताब में गहराई में कवर कर रहे हैं 'आधुनिक आर्किटेक्चर के लिए अनुकूलन संकलनकर्ता: एक निर्भरता आधारित दृष्टिकोण'

3

vectorization जरूरत एकल रजिस्टर तक ही सीमित नहीं है जो बड़े डेटा को पकड़ सकता है। '4 x 32' बिट डेटा रखने के लिए '128' बिट रजिस्टर का उपयोग करना। यह वास्तुशिल्प सीमाओं पर निर्भर करता है। कुछ आर्किटेक्चर में अलग-अलग निष्पादन इकाइयां होती हैं जिनके पास स्वयं के रजिस्ट्रार होते हैं। उस स्थिति में, उस निष्पादन इकाई को डेटा का एक हिस्सा खिलाया जा सकता है और परिणाम उस निष्पादन इकाई से संबंधित एक रजिस्टर से लिया जा सकता है।

उदाहरण के लिए, नीचे दिए गए मामले पर विचार करें।

के लिए

(i = 0; मैं < एन; i ++)
{
एक [i] = एक [i] + बी [i];
}



मैं एक वास्तुकला जो दो निष्पादन इकाइयां हैं, तो मेरी वेक्टर आकार दो के रूप में परिभाषित किया गया है पर काम कर रहा हूँ है। पाश ऊपर उल्लेख किया है के लिए के रूप में

reframed जा (i = 0; मैं < (एन/2), मैं + = 2)
{
एक [i] = एक [i] + बी [i ];


एक [i + 1] = a [i + 1] + b [i + 1];
}

नोट: कथन के लिए 2 वेक्टर आकार से लिया गया है।

जैसा कि मेरे पास दो निष्पादन इकाइयां हैं, लूप के अंदर दो कथन दो निष्पादन इकाइयों में खिलाए जाएंगे। योग निष्पादन इकाइयों में अलग से जमा किया जाएगा। अंत में संचित मूल्यों (दो निष्पादन इकाइयों से) का योग किया जाएगा।

अच्छी प्रथाएं
1. निर्भरता (लूप के विभिन्न पुनरावृत्तियों के बीच) की बाधाओं को लूप को सदिश करने से पहले जांच की जानी चाहिए।
2. फ़ंक्शन कॉल को रोकने की आवश्यकता है।
3. सूचक पहुंच एलियासिंग बना सकती है और इसे रोकने की जरूरत है।

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