2010-06-30 14 views
9

हैलो: क्या वैश्विक कार्य आकार (आयाम) ओपनसीएल में कार्य समूह आकार (आयाम) के एकाधिक होने की आवश्यकता है?क्या ग्लोबल वर्क साइज ओपनसीएल में वर्क ग्रुप साइज के कई होना चाहिए?

यदि हां, तो क्या मैट्रिस को संभालने का एक मानक तरीका कार्य समूह आयामों में से एक नहीं है? मैं दो संभावनाओं के बारे में सोच सकता हूं:

गतिशील रूप से कार्य समूह आयामों का आकार वैश्विक कार्य आयामों के कारक पर सेट करें। (यह एक कारक खोजने के ऊपरी हिस्से को ले जाएगा और संभावित रूप से कार्य समूह को गैर-इष्टतम आकार में सेट करेगा।)

वैश्विक कार्य के आयामों को कार्य समूह आयामों के निकटतम एकाधिक होने के लिए बढ़ाएं, सभी इनपुट रखते हुए और आउटपुट बफर एक ही है लेकिन सेगफॉल्टिंग से बचने के लिए कर्नेल में सीमाओं की जांच कर रहा है, यानी वांछित आउटपुट से बाहर काम की वस्तुओं पर कुछ भी नहीं। (यह बेहतर तरीका की तरह लगता है।)

दूसरा तरीका काम करेगा? क्या कोई बेहतर तरीका है? (या यह आवश्यक नहीं है क्योंकि कार्य समूह आयामों को वैश्विक कार्य आयामों को विभाजित करने की आवश्यकता नहीं है?)

धन्यवाद!

+0

दिलचस्प है कि आप इस सवाल से पूछ रहे हैं, क्योंकि मैं इसे खुद से पूछ रहा था। मेरा पहला अनुमान यह है कि आप एक निश्चित कार्य समूह का आकार रखते हैं और यदि शाखा द्वारा बाध्य हैं। – Stringer

उत्तर

7

लिंक चाड के लिए Thx। लेकिन वास्तव में, यदि आप पर पढ़ें:

local_work_size निर्दिष्ट है, तो मूल्यों global_work_size में निर्दिष्ट [0], ... global_work_size [work_dim - 1] समान रूप से local_work_size में निर्दिष्ट संबंधित मानों से भाज्य होना चाहिए [0 ], ... local_work_size [work_dim - 1]।

तो हाँ, स्थानीय कार्य आकार वैश्विक कार्य आकार का एक होना चाहिए।

मुझे यह भी लगता है कि वैश्विक कार्य आकार को निकटतम एकाधिक में असाइन करना और सीमाओं के बारे में सावधान रहना चाहिए, मैं इसे टिप्पणी करने के लिए चारों ओर एक टिप्पणी पोस्ट करूंगा।

1

मानक के अनुसार यह मैंने जो देखा उससे नहीं होना चाहिए। मुझे लगता है कि मैं इसे एक शाखा के साथ संभाल लेगा, लेकिन मुझे नहीं पता कि आप किस तरह का मैट्रिक्स ऑपरेशन कर रहे हैं।

http://www.khronos.org/registry/cl/specs/opencl-1.1.pdf#page=131

work_dim अहस्ताक्षरित मूल्यों की एक सरणी कि work_dim आयाम कि गिरी समारोह निष्पादित करेंगे में वैश्विक काम आइटम्स की संख्या का वर्णन को

global_work_size अंक। वैश्विक कार्य-वस्तुओं की कुल संख्या global_work_size[0] * ... * global_work_size[work_dim – 1] के रूप में गणना की गई है।

मूल्यों में global_work_size + मूल्यों global_work_offset में निर्दिष्ट पर सीमा sizeof(size_t) डिवाइस के लिए द्वारा दिए गए अधिक नहीं हो सकता जो गिरी निष्पादन कतारबद्ध हो जाएगा इसी निर्दिष्ट। sizeof(size_t) डिवाइस के लिए तालिका 4.3 में CL_DEVICE_ADDRESS_BITS का उपयोग करके निर्धारित किया जा सकता है। उदाहरण के लिए, CL_DEVICE_ADDRESS_BITS = 32, यानी डिवाइस एक 32-बिट पता अंतरिक्ष उपयोग करता है, हैं, तो size_t एक 32-बिट अहस्ताक्षरित पूर्णांक और global_work_size मूल्यों रेंज 1 .. में होना चाहिए है 2^32 - 1 इस सीमा के बाहर के मान CL_OUT_OF_RESOURCES त्रुटि लौटाते हैं।

1

यह एक पुरानी पोस्ट प्रतीत होता है, लेकिन मुझे इस पोस्ट को कुछ नई जानकारी के साथ अपडेट करने दें। उम्मीद है कि यह किसी और की मदद कर सकता है।

क्या ग्लोबल वर्क साइज (आयाम) को वर्क ग्रुप ओपनसीएल में आकार (आयाम) होना चाहिए?

उत्तर: ओपनसीएल 2.0 तक सही है। CL2.0 से पहले, आपका वैश्विक कार्य आकार स्थानीय कार्य आकार का एक बहु होना चाहिए, अन्यथा जब आप clEnqueueNDRangeKernel निष्पादित करते हैं तो आपको एक त्रुटि संदेश प्राप्त होगा।

लेकिन सीएल 2.0 से, अब इसकी आवश्यकता नहीं है। आप जो भी वैश्विक कार्य आकार का उपयोग कर सकते हैं जो आपके अनुप्रयोग आयामों को फिट करता है। हालांकि, कृपया याद रखें कि हार्डवेयर कार्यान्वयन अभी भी "पुराने" तरीके का उपयोग कर सकता है, जिसका अर्थ है वैश्विक कार्य समूह आकार को पैड करना। इसलिए, यह प्रदर्शन हार्डवेयर वास्तुकला पर अत्यधिक निर्भर करता है। आप विभिन्न हार्डवेयर/प्लेटफार्मों पर काफी अलग प्रदर्शन देख सकते हैं। इसके अलावा, आप अपने एप्लिकेशन को पुराने प्लेटफॉर्म का समर्थन करने के लिए संगत बनाना चाहते हैं जो केवल संस्करण 1.2 तक सीएल का समर्थन करता है। तो, मुझे लगता है कि इस नई सुविधा CL2.0 में जोड़ा सिर्फ आसान प्रोग्रामिंग के लिए है, बेहतर चलाया प्रदर्शन और पश्चगामी संगतता प्राप्त करने के लिए, मैं सुझाव है कि आप अभी भी निम्न विधि आप ने उल्लेख का उपयोग करें:

के आयामों बढ़ाएँ वैश्विक समूह कार्य समूह आयामों के निकटतम एकाधिक होने के लिए, सभी इनपुट और आउटपुट बफर को रखते हुए, लेकिन सेगफॉल्टिंग से बचने के लिए कर्नेल में सीमाओं की जांच करना, यानी वांछित आउटपुट से बाहर कार्य आइटमों पर कुछ भी नहीं है। (यह बेहतर तरीका की तरह दिखता है।)

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

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

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