2013-02-03 39 views
42

OpenMP 4.0 "omp simd" नामक एक नया निर्माण प्रस्तुत करता है। पुराने "समांतर" पर इस निर्माण का उपयोग करने का क्या फायदा है? दूसरे पर एक बेहतर विकल्प कब होगा?बनाम omp simd के समानांतर: प्रत्येक का उपयोग कब करें?

संपादित करें: सिम निर्देश से संबंधित एक दिलचस्प paper यहां है।

+0

ओपनएमएम यूंटिल संस्करण 3.0 को सिमड किया गया था, फिर उन्होंने उस अवधारणा को छोड़ दिया। मुझे लगता है कि नई प्रगति पुराने कोड के साथ पिछड़ा संगतता के लिए है जो सिम के कुछ पहलुओं पर निर्भर थी। ओपनएमपी डॉक्स के बारे में कुछ कहना नहीं चाहिए? –

+4

यह 'समांतर सिमड' नहीं है; आप 'समांतर' _or_ 'simd' का उपयोग करते हैं, जो भेद पर संकेत देता है। निचे देखो। –

+0

@ जेडी: यह निश्चित रूप से एक टाइपो था। फिक्स्ड, धन्यवाद –

उत्तर

32

लिंक्ड (p 13, लाइनों 19 + 20) मानक अपेक्षाकृत स्पष्ट है

किसी भी धागा एक SIMD निर्माण का सामना करना पड़ता है, निर्माण के साथ जुड़े पाश की पुनरावृत्ति द्वारा क्रियान्वित किया जा सकता सिम लेन जो धागे के लिए उपलब्ध हैं।

SIMD एक सब-थ्रेड चीज है। इसे अधिक ठोस बनाने के लिए, एक सीपीयू पर आप निर्देशों का विशेष रूप से वेक्टरलाइजेशन लूप पुनरावृत्तियों के भाग के लिए अनुरोध कर सकते हैं जो अलग-अलग थ्रेड से संबंधित हैं। यह समानांतरता के कई स्तरों को उजागर कर रहा है जो प्लेटफॉर्म-स्वतंत्र तरीके से एक मल्टीकोर प्रोसेसर के भीतर मौजूद हैं। उदाहरण के लिए इस intel blog post पर चर्चा (त्वरक सामग्री के साथ) देखें।

तो मूल रूप से, आप अलग-अलग धागे पर काम वितरित करने के लिए omp parallel का उपयोग करना चाहेंगे, जो कई कोरों में माइग्रेट कर सकते हैं; और आप प्रत्येक कोर के भीतर वेक्टर पाइपलाइनों (कहने) का उपयोग करने के लिए omp simd का उपयोग करना चाहेंगे। आम तौर पर omp parallel काम के कोसर-अनाज वाले समांतर वितरण से निपटने के लिए "बाहर" पर जायेगा और omp simd ठीक-ठीक समांतरता का फायदा उठाने के लिए इसके अंदर तंग लूप के आसपास जाएगा।

33

एक साधारण जवाब:

OpenMP केवल कई कोर के लिए एक से अधिक थ्रेड का फायदा उठाने के लिए इस्तेमाल किया। यह नया simd विस्तार आपको आधुनिक CPUs जैसे कि इंटेल के AVX/SSE और ARM के NEON पर सिम निर्देश का स्पष्ट रूप से उपयोग करने की अनुमति देता है।

(ध्यान दें कि डिज़ाइन द्वारा एक सिम निर्देश को एक थ्रेड और एकल कोर में निष्पादित किया जाता है। हालांकि, सिमड का अर्थ जीपीजीपीयू के लिए काफी विस्तारित किया जा सकता है। लेकिन, लेकिन मुझे नहीं लगता कि आपको GPGPU पर विचार करने की आवश्यकता है ओपनएमपी 4.0 के लिए।)

तो, एक बार जब आप सिमड निर्देशों को जानते हैं, तो आप इस नए निर्माण का उपयोग कर सकते हैं।


एक आधुनिक सीपीयू में, मोटे तौर पर वहाँ समानांतरवाद के तीन प्रकार हैं: (1) शिक्षा स्तर के समानांतरवाद (आईएलपी), (2) धागा स्तरीय समानांतरवाद (TLP), और (3) SIMD निर्देश (हम कह सकता है कि यह वेक्टर-स्तर या तो है)।

आईएलपी स्वचालित रूप से आपके आउट-ऑफ-ऑर्डर CPUs या कंपाइलर्स द्वारा किया जाता है। आप ओपनएमपी के parallel for और अन्य थ्रेडिंग लाइब्रेरी का उपयोग कर टीएलपी का फायदा उठा सकते हैं। तो, सिम के बारे में क्या? इंट्रिनिक्स उन्हें उपयोग करने का एक तरीका था (साथ ही साथ कंपाइलर्स 'स्वचालित वेक्टरेशन)। ओपनएमपी का simd सिमड का उपयोग करने का एक नया तरीका है।

एक बहुत ही सरल उदाहरण लें:

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

ऊपर कोड दो एन आयामी वैक्टर की राशि की गणना करता है।जैसा कि आप आसानी से देख सकते हैं, A[] सरणी पर (loop-carried) data dependency नहीं है। यह लूप embarrassingly parallel है।

इस लूप को समानांतर करने के कई तरीके हो सकते हैं। उदाहरण के लिए, ओपनएमपी 4.0 तक, इसे केवल parallel for निर्माण का उपयोग करके समांतर किया जा सकता है। प्रत्येक थ्रेड एकाधिक कोर पर N/#thread पुनरावृत्तियों का प्रदर्शन करेगा।

हालांकि, आपको लगता है कि इस तरह के सरल जोड़ के लिए कई धागे का उपयोग करना एक ओवरकिल होगा। यही कारण है कि वेक्टरेशन है, जिसे ज्यादातर सिम निर्देशों द्वारा कार्यान्वित किया जाता है।

एक SIMD का उपयोग करते हुए इस तरह होगा:

for (int i = 0; i < N/8; ++i) 
    VECTOR_ADD(A + i, B + i, C + i); 

इस कोड को मानता है कि (1) SIMD निर्देश (VECTOR_ADD) है 256-बिट या 8-तरफा (8 * 32 बिट); और (2) N 8.

एक 8-तरफा सिमड निर्देश का अर्थ है कि एक वेक्टर में 8 आइटम एक मशीन निर्देश में निष्पादित किए जा सकते हैं। ध्यान दें कि इंटेल का नवीनतम एवीएक्स ऐसे 8-मार्ग (32-बिट * 8 = 256 बिट्स) वेक्टर निर्देश प्रदान करता है।

सिम में, आप अभी भी एक कोर का उपयोग करते हैं (फिर से, यह केवल पारंपरिक सीपीयू के लिए है, जीपीयू नहीं)। लेकिन, आप हार्डवेयर में एक छिपी समानांतरता का उपयोग कर सकते हैं। आधुनिक सीपीयू सिमड निर्देशों के लिए हार्डवेयर संसाधनों को समर्पित करते हैं, जहां प्रत्येक सिम लेन समानांतर में निष्पादित किया जा सकता है।

आप एक ही समय में थ्रेड-स्तर समांतरता का उपयोग कर सकते हैं। उपर्युक्त उदाहरण parallel for द्वारा आगे समानांतर किया जा सकता है।

(हालांकि, मुझे संदेह है कि कितने लूप वास्तव में सिमडिज्ड लूप में परिवर्तित हो सकते हैं। ओपनएमपी 4.0 विनिर्देश इस पर थोड़ा अस्पष्ट लगता है। इसलिए, असली प्रदर्शन और व्यावहारिक प्रतिबंध वास्तविक कंपाइलर्स के कार्यान्वयन पर निर्भर होंगे।)


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

+2

"लेकिन, लेकिन मुझे नहीं लगता कि आपको ओपनएमपी 4.0 के लिए जीपीजीपीयू पर विचार करने की आवश्यकता है।" वास्तव में, कोई करता है - ओपनएमपी 4.0 में जीपीजीपीयू (और अन्य प्रकार के त्वरक) के लिए एक प्रस्तावित समर्थन है, लेकिन यह एक अलग [टीआर] (http://www.openmp.org/mp- दस्तावेज़ों में है) /TR1_167.pdf) और मुख्य पाठ का हिस्सा नहीं है (लगता है कि उन्होंने ऐसा इसलिए किया क्योंकि पाठ के बारे में मुख्य समीक्षा पाठ में शामिल होने के लिए पाठ को लगभग उतना ही पॉलिश नहीं किया गया था जब एससी'12 सम्मेलन हुआ था)। –

+0

यह बहुत अच्छी जानकारी है। – minjang

+0

"सिमड निर्माण आपको सिमड निर्देशों का उपयोग करने की अनुमति देता है" झूठा रूप से तात्पर्य है कि सिमड निर्माण का उपयोग न करने से सिम निर्देशों के उपयोग को अस्वीकार कर दिया जाता है। – Jeff

1

कंपाइलर्स को सिमड क्लॉज की उपस्थिति पर समानांतर क्षेत्र में सिमड ऑप्टिमाइज़ेशन करने की आवश्यकता नहीं है। कंपाइलर्स मैं परिचित हूं, नेस्टेड लूप, समांतर बाहरी, वेक्टर आंतरिक, पहले जैसा ही समर्थन करता हूं।
अतीत में, बाहरी समांतर लूप (पतन खंड के साथ एकाधिक लूप) को शामिल करने वाले लूप-स्विचिंग अनुकूलन को रोकने के लिए ओपनएमपी निर्देश आमतौर पर लिया जाता था। ऐसा लगता है कि कुछ कंपाइलर्स में बदल गया है। ओपनएमपी 4 एक गैर-वेक्टरिज़ेबल आंतरिक लूप के साथ समानांतर बाहरी पाश के अनुकूलन सहित नई संभावनाएं खोलता है, जिसमें स्ट्रिप खनन के प्रकार, जब ओएमपी समानांतर [के लिए] सिम सेट होता है। अगर कभी सिमड क्लॉज के बिना किया जाता है तो ifort कभी बाहरी लूप वेक्टरेशन के रूप में रिपोर्ट करता है। इसके बाद ओएमपी समानांतर सिमड की तुलना में धागे की एक छोटी संख्या के लिए अनुकूलित किया जा सकता है, जो कि सिम वेक्टर चौड़ाई से अधिक धागे की आवश्यकता होती है। सिमड क्लॉज के बिना, इस तरह के भेद को अनुमानित किया जा सकता है, संकलक को 100 या 300 जैसे लूप गिनती के लिए अनुकूलित करने के लिए कहा जाता है, जबकि सिमड क्लॉज बिना शर्त सिम अनुकूलन का अनुरोध करता है। सिमड के लिए gcc 4.9 omp समानांतर काफी प्रभावी लग रहा था जब मेरे पास 24-कोर प्लेटफ़ॉर्म था।