/ / CUDA: केवल एक ही काम शुरू करना है - समानांतर-प्रसंस्करण, gpgpu, cuda

CUDA: समानांतर प्रसंस्करण, gpgpu, cuda के साथ शुरू करने के लिए केवल एक ही काम

बुरा शीर्षक के लिए क्षमा करें। मैं कुछ भी बेहतर नहीं कर सकता था।

CUDA के कार्यक्रमों को मैंने देखा हैपूर्वनिर्धारित डेटा जो समानांतर होने के लिए तैयार है। एक सामान्य उदाहरण दो मैट्रिसेस का योग है जहां दो मैट्रिस पहले से ही भरे हुए हैं। लेकिन उन कार्यक्रमों के बारे में जो नए कार्यों को उत्पन्न करते हैं। मैं इसे CUDA में कैसे मॉडल करूं? मैं एक परिणाम कैसे पास कर सकता हूं ताकि अन्य धागे उस पर काम करना शुरू कर सकें।

उदाहरण के लिए: कहते हैं कि मैं एक काम पर एक कर्नेल चलाता हूं। यह नौकरी 10 नए स्वतंत्र रोजगार उत्पन्न करती है। उनमें से प्रत्येक 10 नए स्वतंत्र नौकरी और इतने पर उत्पन्न करता है। यह एक कार्य की तरह लगता है जो अत्यधिक समानांतर है क्योंकि प्रत्येक कार्य स्वतंत्र है। समस्या यह है कि मुझे पता नहीं है कि CUDA में इसे कैसे बनाया जाए। मैंने इसे CUDA में करने की कोशिश की है जहाँ मैं एक कर्नेल में थोड़ी देर के लूप का उपयोग करता हूँ ताकि यदि कोई थ्रेड गणना शुरू कर सके तो मतदान जारी रख सके। प्रत्येक सूत्र को एक काम सौंपा गया था। लेकिन वह काम नहीं आया। लग रहा था कि यह लूप को नजरअंदाज कर रहा है।

कोड उदाहरण:

On host:
fill ready array with 0
ready[0] = 1;

On device:
__global__ void kernel(int *ready, int *result)
{
int tid = threadIdx.x;
if(tid < N)
{
int condition = ready[tid];
while(condition != 1)
{
condition = ready[tid];
}

result[tid] = 3;// later do real computation

//children jobs is now ready to work
int childIndex = tid * 10;
if(childIndex < (N-10))
{
ready[childIndex + 1] = 1; ready[childIndex + 2] = 1;
ready[childIndex + 3] = 1; ready[childIndex + 4] = 1;
ready[childIndex + 5] = 1; ready[childIndex + 6] = 1;
ready[childIndex + 7] = 1; ready[childIndex + 8] = 1;
ready[childIndex + 9] = 1; ready[childIndex +10] = 1;
}
}
}

उत्तर:

जवाब के लिए 8 № 1

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

मैं CUDA समानांतर कमी का उदाहरण दूंगा। दिखाता है कि कई गुठली में विघटित कैसे करें। केवल अंतर यह है कि आप कर्नेल के बीच कम काम करने के बजाय अधिक कर रहे होंगे।


उत्तर № 2 के लिए 1

लगता है जैसे आप उपयोग कर सकते हैं CUDA गतिशील समानांतरवाद.

इससे आप दूसरे के अंदर कर्नेल लगा सकते हैंकर्नेल, अर्थ, जब पहला कर्नेल खत्म हो गया है, और 10 कार्य उत्पन्न कर रहा है, ठीक इसके पहले, आप अगले कर्नेल को लागू कर सकते हैं जो उन कार्यों को संभालेंगे।