2012-04-10 6 views
9

OpenCL मानक निम्नलिखित विकल्पों को परिभाषित करता है और डिवाइस के बारे में जानकारी संकलित गिरी पाने के लिए एल्गोरिथ्म है:क्या इष्टतम कार्य समूह का आकार और कार्यसमूह की संख्या निर्धारित करने

  • CL_DEVICE_MAX_COMPUTE_UNITS

  • CL_DEVICE_MAX_WORK_GROUP_SIZE

  • CL_KERNEL_WORK_GROUP_SIZE

  • CL_KERNEL_PREFERRED_W ORK_GROUP_SIZE_MULTIPLE

इस मूल्यों को देखते हुए, मैं काम समूह और कार्य समूहों की संख्या के अधिकतम आकार गणना कैसे कर सकते हैं?

उत्तर

7

आप इन मानों को अपने एल्गोरिदम के लिए प्रयोगात्मक रूप से खोजते हैं। कठिन संख्या पाने के लिए एक प्रोफाइलर का प्रयोग करें।

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

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

एएलयू लाने के लिए इष्टतम अनुपात किसी भी डिवाइस के लिए 1: 1 है। यह अभ्यास में शायद ही कभी हासिल किया जाता है, इसलिए आप एएलयू/सिम बैंकों को संतृप्त रखना चाहते हैं। इसका मतलब है एएलयू: जब भी संभव हो तो 1 से अधिक होना चाहिए। 1 से कम का मतलब है कि आपको स्मृति विलंबता को बेहतर तरीके से छिपाने के लिए एक बड़े कार्य समूह आकार का प्रयास करना चाहिए।

+0

मैं कई उपकरणों का समर्थन करने का लक्ष्य रख रहा हूं। क्या इसका मतलब है, मुझे कर्नेल एनक्यूइंग के लिए इष्टतम मूल्य प्राप्त करने के लिए उनमें से प्रत्येक पर अपने कर्नल का परीक्षण करना होगा? – Kentzo

+0

आपके द्वारा एक्सेस किए जाने वाले उपकरणों पर अपने एल्गोरिदम का परीक्षण करें - परिणाम बहुत भिन्न नहीं हो सकते हैं। मैं सुझाव देता हूं कि आप इसे लक्षित करने के लिए प्रत्येक प्रमुख आर्किटेक्चर से एक डिवाइस पर कोशिश कर रहे हैं। यदि आप ऑप्टिमाइज़ करने का प्रयास करने के लिए रनटाइम पर पैरा को समायोजित करने में सक्षम हैं। यह विकास के दौरान आपके द्वारा खोजे गए इष्टतम मूल्यों को ट्विक कर सकता है। वास्तविक हार्डवेयर संख्याओं के बारे में अंतिम उपयोगकर्ता/क्लाइंट से फीडबैक प्राप्त करने से आप सबसे आम उपकरणों पर सुधार पर ध्यान केंद्रित कर सकते हैं। – mfa

+0

सामान्य रूप से 'CL_DEVICE_MAX_COMPUTE_UNITS' का उपयोग करके आपको इष्टतम प्रदर्शन नहीं मिलेगा (जब तक कि आप कार्यसमूहों के बीच बहुत अधिक सिंक्रनाइज़ेशन नहीं करते हैं, लेकिन यह आमतौर पर किसी भी तरह का बुरा विचार है)। मैं आम तौर पर अच्छे मूल्यों के लिए प्रलेखन से पूछता हूं, लेकिन मैंने प्रदर्शन को प्रभावित करने वाले अधिक कार्यसमूहों को कभी नहीं देखा है, इसलिए अधिक वाहक। ध्यान दें कि मेमोरी विलंबता को छिपाने के लिए उच्च कार्य समूह को चुनने के बारे में हिस्सा केवल (gpus के लिए) केवल सत्य है यदि आप पर्याप्त कार्यसमूहों (जैसे CL_DEVICE_MAX_COMPUTE_UNITS का उपयोग नहीं करते हैं, क्योंकि सीयू आमतौर पर एक समय में एक कार्यसमूह को अधिक बनाए रख सकते हैं)। – Grizzly

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