2012-02-29 17 views
5

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

+0

यहां एक नज़र डालें, समान चर्चा: stackoverflow.com/questions/9208535/how-to-handle-a-variable-number-of-algorithms-in-a- कर्नेल – rdoubleui

उत्तर

11

हार्डवेयर उपयोग और प्रदर्शन पर रजिस्टर दबाव का प्रभाव है।

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

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

अंतिम गाइड को मापने के लिए प्रदर्शन किया जाना चाहिए। इस तरह की चीजों के लिए कोई सार्वभौमिक नियम नहीं है। बेंचमार्किंग निश्चित रूप से जानने का एकमात्र तरीका है।

+0

ऐप्पल सहमत है: https: // डेवलपर। apple.com/library/mac/documentation/Performance/Conceptual/OpenCL_MacProgGuide/TuningPerformanceOntheGPU/TuningPerformanceOntheGPU.html –

3

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

3

ओपनसीएल में कोड करने का सही तरीका अपने कोड को समानांतर कार्यों में अलग करना है, और उनमें से प्रत्येक एक कर्नेल है। यह है, प्रत्येक "लूप के लिए" एक कर्नेल होना चाहिए। कुछ बार एक सिंगल सीपीयू कोड फ़ंक्शन ओसीएल में 4 कर्नेल कार्यान्वयन के परिणामस्वरूप हो सकता है।

यदि आपको कर्नेल निष्पादन के बीच डेटा स्टोर करने की आवश्यकता है तो केवल ओपनसीएल बफर का उपयोग करें और होस्ट पर कॉपी न करें (यह DEVICE < -> HOST बाधा हल करता है)।

यदि दोनों कार्य विभिन्न डेटा पर कार्य करते हैं तो आप एक एकल कर्नेल लिख सकते हैं, लेकिन यह संचालन की जटिलता पर निर्भर करता है।