सीयूडीए 9 में, एनवीआईडीआईए सहकारी समूह की अवधारणा पेश कर रहा है, जिससे आप उस समूह से संबंधित सभी धागे को सिंक्रनाइज़ कर सकते हैं। ऐसा समूह ग्रिड में सभी धागे पर फैल सकता है। इस तरह से आप सभी ब्लॉकों में सभी धागे सिंक्रनाइज़ करने में सक्षम हो जाएगा:
grid_group g = this_grid();
g.sync();
आप ग्रिड सिंक्रनाइज़ करने के लिए एक पास्कल या एक नए वास्तुकला की जरूरत है।
इस तरह के एक धागा ब्लॉक की तुलना में छोटे समूहों को सिंक्रनाइज़ करने का विवरण स्तर ताना के रूप में बुनियादी कार्यक्षमता,,, सभी आर्किटेक्चर पर समर्थित है, जबकि पास्कल और वोल्टा GPUs नए ग्रिड चौड़ा और बहु GPU को सिंक्रनाइज़ समूहों को सक्षम।
स्रोत: https://devblogs.nvidia.com/parallelforall/cuda-9-features-revealed/
CUDA 9 से पहले, वहाँ कोई देशी तरीका सभी ब्लॉकों से सभी धागे सिंक्रनाइज़ करने के लिए है। वास्तव में, सीयूडीए में ब्लॉक की अवधारणा यह है कि कुछ अन्य लॉक पहले से ही अपने काम को समाप्त करने के बाद ही लॉन्च किए जा सकते हैं, उदाहरण के लिए, यदि जीपीयू चल रहा है तो यह सब समानांतर में प्रक्रिया करने के लिए बहुत कमजोर है।
यदि आप सुनिश्चित करते हैं कि आप बहुत सारे ब्लॉक नहीं बनाते हैं, तो आप अपने आप के बीच सभी ब्लॉक सिंक्रनाइज़ करने का प्रयास कर सकते हैं, उदा। परमाणु संचालन का उपयोग कर सक्रिय रूप से इंतजार कर। हालांकि यह धीमा है, अपने जीपीयू मेमोरी कंट्रोलर को खा रहा है, इसे "हैक" माना जाता है और इससे बचा जाना चाहिए।
सबसे अच्छा तरीका जो मैं सुझा सकता हूं, सिंक्रनाइज़ेशन बिंदु पर अपने कर्नेल को समाप्त करना है, और उसके बाद एक नया कर्नेल लॉन्च करना जो आपके काम के साथ जारी रहेगा। ज्यादातर परिस्थितियों में यह वास्तव में निर्दिष्ट हैक का उपयोग करने से अधिक तेज़ (या कम से कम - गतिशील गति के साथ) प्रदर्शन करेगा।
हाँ! मूल उत्तर से 6 साल बाद, सीयूडीए का एक नया संस्करण मुझे इसकी समीक्षा करता है और एक और सकारात्मक समाधान देता है :) – CygnusX1