2014-11-07 10 views
14

मैं ओपनसीएल में कार्य-समूह के उद्देश्य को वास्तव में समझ नहीं पा रहा हूं।ओपनसीएल: कार्य समूह अवधारणा

मैं समझता हूं कि वे कार्य आइटम (माना जाता है, हार्डवेयर धागे) का समूह हैं, जिन्हें समानांतर में निष्पादित किया जाता है।

हालांकि, कोरसर उपखंड की आवश्यकता क्यों है? क्या थ्रेड के केवल ग्रिड (और, डी फैक्टो, केवल एक डब्ल्यू-जी) के लिए ठीक नहीं होगा?

क्या वर्क-ग्रुप बिल्कुल भौतिक कोर पर मैप करना चाहिए? उदाहरण के लिए, टीईएसएलए सी 1060 कार्ड में 240 कोर हैं। कार्य समूह इस पर कैसे मानचित्र करेंगे ??

साथ ही, जहां तक ​​मैं समझता हूं, कार्य समूह के अंदर कार्य-वस्तुएं सिंक्रनाइज़ हो सकती हैं, स्मृति स्मृति के लिए धन्यवाद। क्या कार्य-समूह सिंक्रनाइज़ कर सकते हैं या यह भी आवश्यक है? क्या वे साझा स्मृति के माध्यम से एक दूसरे से बात करते हैं या यह केवल काम के सामान के लिए है (इस पर यकीन नहीं है)?

उत्तर

16

यहां भ्रम का हिस्सा मुझे लगता है कि शब्दावली के लिए नीचे आता है। जीपीयू लोग अक्सर कोर कहते हैं, वास्तव में नहीं हैं, और जीपीयू लोग अक्सर थ्रेड कहलाते हैं, केवल एक निश्चित अर्थ में हैं।

कोर एक कोर, GPU के विपणन मामले में एक सीपीयू कोर की तरह कुछ का उल्लेख कर सकते हैं, या यह एक SIMD इकाई की एक एकल लेन का उल्लेख कर सकते - प्रभाव में एक सिंगल कोर x86 CPU इस के चार कोर की जाएगी सरल प्रकार यही कारण है कि जीपीयू कोर गणना इतनी अधिक हो सकती है। यह वास्तव में एक उचित तुलना नहीं है, आपको अधिक सीधे तुलनीय कोर गिनती प्राप्त करने के लिए 16, 32 या इसी तरह की संख्या से विभाजित करना होगा।

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

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

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

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

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

1

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

इसके अलावा, आमतौर पर ओपनसीएल डिवाइस अच्छे समांतरता को प्राप्त करने के लिए एकल निर्देश एकाधिक डेटा (सिम) एक्सटेंशन का उपयोग करते हैं। सिम एक्सटेंशन के साथ समानांतर में एक कार्य समूह चलाया जा सकता है।

Should a Work-Group exactly map to a physical core ? 

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

Can work-groups synchronize or is that even needed ? 

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

2

कार्य समूहों का एक लाभ वे साझा स्थानीय स्मृति का उपयोग प्रोग्रामर-परिभाषित कैश के रूप में कर सकते हैं। वैश्विक मेमोरी से पढ़ा गया मान साझा कार्य-समूह स्थानीय मेमोरी में संग्रहीत किया जा सकता है और उसके बाद कार्य समूह में किसी भी कार्य आइटम द्वारा त्वरित रूप से पहुंचा जा सकता है। एक अच्छा उदाहरण जीवन का खेल है: प्रत्येक सेल अपने आप पर निर्भर करता है और इसके आसपास 8। यदि प्रत्येक कार्य आइटम इस जानकारी को पढ़ता है तो आपके पास 9 x वैश्विक मेमोरी पढ़ी जाएगी। कार्य समूह और साझा स्थानीय मेमोरी का उपयोग करके आप 1x ग्लोबल मेमोरी रीड से संपर्क कर सकते हैं (किनारों पर अनावश्यक पढ़ने के बाद से केवल दृष्टिकोण)।

3

ओपनसीएल this paper की शब्दावली की और समझ के लिए वास्तव में बहुत सारे अच्छे उत्तर हैं, वास्तव में सभी अवधारणाओं का वर्णन करता है।

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