"वैश्वीकरण" क्या है?


189

अब कई बार, मैंने इस शब्द का माटलैब, फोरट्रान ... कुछ अन्य में सामना किया है ... लेकिन मुझे कभी यह स्पष्टीकरण नहीं मिला कि इसका क्या मतलब है, और यह क्या करता है? इसलिए मैं यहां पूछ रहा हूं कि वेक्टराइजेशन क्या है, और उदाहरण के लिए इसका क्या मतलब है, कि "एक लूप वेक्टर हो गया है"?


1
@geoffspear लिंक लगता है कि en.wikipedia.org/wiki/Array_programming
मुझे

जवाबों:


223

कई CPU में "वेक्टर" या "SIMD" निर्देश सेट होते हैं जो एक ही ऑपरेशन को एक साथ दो, चार या अधिक डेटा के टुकड़ों पर लागू करते हैं। आधुनिक x86 चिप्स में SSE निर्देश हैं, कई PPC चिप्स में "Altivec" निर्देश हैं, और यहां तक ​​कि कुछ ARM चिप्स में वेक्टर निर्देश सेट है, जिन्हें NEON कहा जाता है।

"वेक्टराइजेशन" (सरलीकृत) एक लूप को फिर से लिखने की प्रक्रिया है ताकि किसी सरणी एन के एक तत्व को संसाधित करने के बजाय, यह सरणी के 4 तत्वों को एक साथ एन / 4 बार संसाधित करे (कहे)।

(मैंने 4 चुना क्योंकि यह आधुनिक हार्डवेयर को सीधे समर्थन देने की सबसे अधिक संभावना है; शब्द "वैश्वीकरण" का उपयोग उच्च स्तर के सॉफ़्टवेयर परिवर्तन का वर्णन करने के लिए भी किया जाता है जहां आप केवल लूप को पूरी तरह से दूर कर सकते हैं और तत्वों के बजाय सरणियों पर संचालन का वर्णन कर सकते हैं। इसमें वे शामिल हैं)


वेक्टराइजेशन और लूप अनरोलिंग के बीच का अंतर: निम्नलिखित बहुत सरल लूप पर विचार करें जो दो सरणियों के तत्वों को जोड़ता है और परिणामों को तीसरे सरणी में संग्रहीत करता है।

for (int i=0; i<16; ++i)
    C[i] = A[i] + B[i];

इस लूप को अनरोल करने से यह कुछ इस तरह से बदल जाएगा:

for (int i=0; i<16; i+=4) {
    C[i]   = A[i]   + B[i];
    C[i+1] = A[i+1] + B[i+1];
    C[i+2] = A[i+2] + B[i+2];
    C[i+3] = A[i+3] + B[i+3];
}

दूसरी ओर, इसे बनाना कुछ इस तरह का उत्पादन करता है:

for (int i=0; i<16; i+=4)
    addFourThingsAtOnceAndStoreResult(&C[i], &A[i], &B[i]);

जहां "addFourThingsAtOnceAndStoreResult" वेक्टर निर्देशों को निर्दिष्ट करने के लिए आपके संकलक जो भी आंतरिक उपयोग करता है उसके लिए एक प्लेसहोल्डर है। ध्यान दें कि कुछ संकलक इस तरह से बहुत सरल छोरों को ऑटो करने में सक्षम हैं , जिन्हें अक्सर एक संकलन विकल्प के माध्यम से सक्षम किया जा सकता है। अच्छे वेक्टर कोड उत्पन्न करने के लिए अधिक जटिल एल्गोरिदम को अभी भी प्रोग्रामर की मदद की आवश्यकता होती है।


11
इस और पाश के बीच अंतर क्या है?
जेरेमी पॉवेल

1
क्या यह सच नहीं है कि एक संकलक के पास अनियंत्रित लूप के लिए एक आसान काम ऑटो-वेक्टरिंग होगा?
निकोस अथानासीउ

@ निकोसअंथासियाउ: यह प्रशंसनीय है, लेकिन आम तौर पर एक संकलक बोलना या तो लूप को ऑटोवेट करने में सक्षम होना चाहिए, क्योंकि वे दोनों काफी सरल हैं।
स्टीफन कैनन

1
@StephenCanon कोई भी यह जांच सकता है कि क्या कुछ लाइनों को वेक्टर किया गया है या नहीं? यदि कोई objdump का उपयोग करेगा, तो objdump के आउटपुट में क्या दिखेगा?
user1823664

3
@ शुक्लास्वाग: वैश्वीकरण एक ऐसी चीज है जो संकलक आपके लिए कर सकते हैं, लेकिन यह भी कुछ ऐसा है जो प्रोग्रामर स्पष्ट रूप से स्वयं करते हैं। ओएस शामिल नहीं है।
स्टीफन कैनन

32

वेक्टराइजेशन एक स्केलर प्रोग्राम को वेक्टर प्रोग्राम में बदलने के लिए शब्द है। वेक्टर किए गए प्रोग्राम एक निर्देश से कई ऑपरेशन चला सकते हैं, जबकि स्केलर केवल एक ही बार में ऑपरेंड के जोड़े पर काम कर सकता है।

से विकिपीडिया :

स्केलर दृष्टिकोण:

for (i = 0; i < 1024; i++)
{
   C[i] = A[i]*B[i];
}

सदिश दृष्टिकोण:

for (i = 0; i < 1024; i+=4)
{
   C[i:i+3] = A[i:i+3]*B[i:i+3];
}

स्केलर दृष्टिकोण के समान ही नहीं है? आपका सिंटैक्स और लूप एडवांसिंग अलग है, लेकिन नीचे आप अभी भी इसे 4 गुना बढ़ा रहे हैं। लेकिन किसी तरह यह तेजी से होगा शायद सीपीयू के निर्देश हैं जो कुछ चाल करता है जिसे वैश्वीकरण कहा जाता है।
mskw

लगता है कि मैं यहां अपने प्रश्न का उत्तर दूंगा। वेक्टराइजेशन दृष्टिकोण में वाक्यविन्यास जब कंपाइलर देखता है कि, यह इसे अनुकूलित सीपीयू निर्देशों में अनुवाद करेगा जो वैक्टर को गुणा करता है। SIMD की तरह।
mskw

10

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


7

वैश्वीकरण का वैज्ञानिक कंप्यूटिंग में बहुत उपयोग किया जाता है जहां डेटा के विशाल हिस्से को कुशलतापूर्वक संसाधित करने की आवश्यकता होती है।

वास्तविक प्रोग्रामिंग एप्लिकेशन में, मुझे पता है कि इसका उपयोग NUMPY में किया जाता है (अन्य के बारे में सुनिश्चित नहीं)।

Numpy (अजगर में वैज्ञानिक कंप्यूटिंग के लिए पैकेज), n- आयामी सरणी के शीघ्र हेरफेर के लिए वैश्वीकरण का उपयोग करता है , जो आम तौर पर धीमी गति से होता है यदि एरे को संभालने के लिए अंतर्निहित अजगर विकल्पों के साथ किया जाता है।

हालाँकि, स्पष्टीकरण के टन बाहर हैं, यहाँ क्या कथन के रूप में दिखाया गया है?

वैश्वीकरण कोड में किसी भी स्पष्ट लूपिंग, अनुक्रमण, आदि की अनुपस्थिति का वर्णन करता है - ये चीजें, निश्चित रूप से "पर्दे के पीछे" अनुकूलित, पूर्व-संकलित सी कोड में हो रही हैं। वेक्टरकृत कोड के कई फायदे हैं, जिनमें से हैं:

  1. वेक्टर कोड अधिक संक्षिप्त और पढ़ने में आसान है

  2. कोड की कम पंक्तियों का आमतौर पर कम बग होता है

  3. कोड अधिक बारीकी से मानक गणितीय संकेतन से मिलता-जुलता है (इसे आसान बनाने के लिए, आमतौर पर, गणितीय निर्माणों को सही ढंग से कोड करने के लिए)

  4. वैश्वीकरण के परिणामस्वरूप अधिक "पायथोनिक" कोड है। वैश्वीकरण के बिना, हमारा कोड लूप के लिए पढ़ने के लिए अक्षम और मुश्किल से भरा होगा।


4

वैरिफिकेशन, सरल शब्दों में, एल्गोरिदम को अनुकूलित करने का मतलब है ताकि यह प्रोसेसर में SIMD निर्देशों का उपयोग कर सके।

AVX, AVX2 और AVX512 निर्देश सेट (इंटेल) हैं जो एक निर्देश में कई डेटा पर एक ही ऑपरेशन करते हैं। उदाहरण के लिए। AVX512 का मतलब है कि आप एक बार में 16 पूर्णांक मान (4 बाइट) पर काम कर सकते हैं। इसका मतलब यह है कि यदि आपके पास 16 पूर्णांक के वेक्टर हैं और आप प्रत्येक पूर्णांक में उस मान को दोगुना करना चाहते हैं और फिर उसमें 10 जोड़ दें। आप या तो सामान्य रजिस्टर [a, b, c] पर मूल्यों को 16 बार लोड कर सकते हैं और एक ही ऑपरेशन कर सकते हैं या आप SIMD रजिस्टरों [xmm, ymm] पर सभी 16 मानों को लोड करके एक ही ऑपरेशन कर सकते हैं और एक बार ऑपरेशन कर सकते हैं। यह वेक्टर डेटा की गणना को गति देता है।

वैश्वीकरण में हम अपने डेटा को रीमॉडेल करके अपने लाभ के लिए इसका उपयोग करते हैं ताकि हम उस पर SIMD संचालन कर सकें और कार्यक्रम को गति प्रदान कर सकें।

केवल वैश्वीकरण के साथ समस्या से निपटने की स्थिति है। क्योंकि स्थितियां निष्पादन के प्रवाह को शाखा देती हैं। यह मास्किंग द्वारा नियंत्रित किया जा सकता है। एक अंकगणितीय ऑपरेशन में हालत मॉडलिंग करके। जैसे। अगर हम 10 को जोड़ना चाहते हैं यदि यह अधिक है तो 100 है। हम या तो कर सकते हैं।

if(x[i] > 100) x[i] += 10; // this will branch execution flow.

या हम सिचुएशनल ऑपरेशन में कंडीशन को मॉडल कर सकते हैं, जिससे एक वेक्टर वेक्टर सी स्थिति बन जाएगी।

c[i] = x[i] > 100; // storing the condition on masking vector
x[i] = x[i] + (c[i] & 10) // using mask

हालांकि यह बहुत ही मामूली उदाहरण है ... इस प्रकार, c हमारी मास्किंग वेक्टर है जिसका उपयोग हम बाइनरी ऑपरेशन को उसके मूल्य के आधार पर करने के लिए करते हैं। यह निष्पादन प्रवाह की शाखा से बचता है और वैश्वीकरण को सक्षम बनाता है।

वैश्वीकरण उतना ही महत्वपूर्ण है जितना कि समानांतरकरण। इस प्रकार, हमें इसका यथासंभव उपयोग करना चाहिए। सभी आधुनिक दिनों के प्रोसेसर में भारी गणना कार्यभार के लिए SIMD निर्देश हैं। हम अपने कोड को वैश्वीकरण का उपयोग करके इन SIMD निर्देशों का उपयोग करने के लिए अनुकूलित कर सकते हैं, यह आधुनिक प्रोसेसर पर उपलब्ध कई कोर पर चलने के लिए हमारे कोड को parrallelizing के समान है।

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


0

इंटेल के लोगों द्वारा मुझे लगता है कि इसे समझ पाना आसान है।

वैश्वीकरण एक एल्गोरिथ्म को एक बार में एक मूल्य पर संचालन से एक बार में मूल्यों के सेट पर संचालन करने की प्रक्रिया है । आधुनिक सीपीयू वेक्टर ऑपरेशन के लिए प्रत्यक्ष समर्थन प्रदान करते हैं जहां एक ही निर्देश कई डेटा (SIMD) पर लागू होता है।

उदाहरण के लिए, 512 बिट रजिस्टर वाला सीपीयू 16 32- बिट एकल परिशुद्धता डबल्स और एक एकल गणना कर सकता है।

एक बार में एक निर्देश को निष्पादित करने की तुलना में 16 गुना तेज। इसे थ्रेडिंग और मल्टी-कोर सीपीयू के साथ जोड़कर परिमाण प्रदर्शन लाभ के आदेशों की ओर जाता है।

लिंक https://software.intel.com/en-us/articles/vectorization-a-key-tool-to-improve-performance-on-modern-cpus

जावा में इसके लिए एक विकल्प 2020 की Jdk 15 या 2021 में JDK 16 में देर से शामिल किया गया है।

https://bugs.openjdk.java.net/browse/JDK-8201271


-4

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


12
"सिंगल प्रोसेसर कंप्यूटर पर कोई प्रदर्शन लाभ नहीं होगा": यह सच नहीं है। अधिकांश आधुनिक प्रोसेसरों में वेक्टराइज़ेशन (SSE, Altivec। आदि) के लिए हार्डवेयर सपोर्ट है (जैसा कि स्टीफेनटाइरॉन द्वारा नाम दिया गया है), जो इस्तेमाल होने पर महत्वपूर्ण स्पीडअप दे सकता है।
सेल्के

धन्यवाद, मैं भूल गया कि समानांतरकरण उस स्तर पर भी किया जा सकता है।
लैरी वतनबे
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.