2013-02-14 55 views
5

में एक धागे से बाहर निकलें मैं सोच रहा हूं कि मैं थ्रेड से कैसे बाहर निकल सकता हूं, जिसका धागा सूचकांक बड़ा है। मैं दो संभावनाओं को देखने:CUDA में विचलन - कर्नेल

int i = threadIdx.x; 
if(i >= count) 
    return; 
// do logic 

या

int i = threadIdx.x; 
if(i < count) { 
    // do logic 
} 

मुझे पता है, कि दोनों सही हैं, लेकिन जो एक और प्रदर्शन पर असर पड़ेगा?

+0

दोनों की सिफारिश नहीं करता हूं, दोनों आपको एक ही प्रदर्शन देंगे। – sgarizvi

उत्तर

3

हालांकि दोनों प्रदर्शन के मामले में समान हैं, आपको ध्यान रखना चाहिए कि पहले व्यक्ति की अनुशंसा नहीं की जाती है।

कर्नेल के भीतर एक थ्रेड लौटाएं आपके शेष कोड में एक अप्रत्याशित व्यवहार हो सकता है।

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

CUDA द्वारा उदाहरण पुस्तक, अध्याय 5, थ्रेड सहयोग:

लेकिन __syncthreads के मामले में(), परिणाम कुछ हद तक दुखद है। CUDA वास्तुकला की गारंटी देता है कि कोई धागा ब्लॉक में हर धागा जब तक __syncthreads() से परे एक निर्देश को आगे बढ़ाएंगे __syncthreads()

इसलिए, यह मुख्य रूप से एक कर्नेल के भीतर धागे तुल्यकालन से संबंधित है निष्पादित किया गया है। आप बहुत अच्छा प्रश्न/इस विषय के बारे में यहाँ उत्तर मिल सकता है: Can I use __syncthreads() after having dropped threads?

मैं अंतिम ध्यान दें, मैं भी उपयोग किया है कि बुरा व्यवहार और कोई समस्या नहीं दिखाई दिया के रूप में है, लेकिन कोई गारंटी नहीं है कि समस्याओं भविष्य में उत्पन्न होने है । यह ऐसा कुछ है जो मैं

+2

आपका क्या मतलब अप्रत्याशित व्यवहार है, समस्या क्या है? मैंने इसे ट्यूटोरियल में देखा है और मैंने इसका भी उपयोग किया है और अब तक मुझे कोई समस्या नहीं दिखाई दे रही है। –

+0

कृपया अपने दावे के लिए एक संदर्भ प्रदान करें। – RoBiK

+0

@ जॉर्ज एप्रिलिस समस्या मुख्य रूप से _good प्रथाओं और एक ब्लॉक के भीतर भविष्य सिंक्रनाइज़ेशन से संबंधित है। – pQB