से ओपनसीएल कर्नेल को कॉल करना मैंने एक पोस्ट में देखा है कि हम एक ओपनसीएल कर्नेल से फ़ंक्शन को कॉल कर सकते हैं। लेकिन मेरी परिस्थिति में, मुझे उस जटिल कार्य को समानांतर (सभी उपलब्ध थ्रेडों द्वारा संचालित) की आवश्यकता है, तो क्या मुझे यह कार्य कर्नेल भी बनाना है और इसे मुख्य कर्नेल से फ़ंक्शन की तरह सीधे कॉल करना है? या इस स्थिति के लिए क्या संभव समाधान है? अग्रिम धन्यवादकिसी अन्य ओपनसीएल कर्नेल
उत्तर
आप अपने कर्नेल से सहायक कार्यों को कॉल कर सकते हैं और उन्हें कर्नेल के समान तरीके से समांतर किया जाएगा, उन्हें अपने कर्नेल कोड के अंदर रेखांकित करें। इसलिए, प्रत्येक कार्य आइटम उस कार्य सेट के लिए सहायक कार्य का आह्वान करेगा जो इसे संभालता है।
float4 helper_function(float4 input)
{
return input.x + input.y + input.z + input.w;
}
__kernel kernel_function(const float4* arr, float4* out)
{
id = get_global_id(0);
out[id] = helper_function(arr[id]);
}
अगर मैं अपने प्रश्न समझ में सही ढंग से, आप कर्नेल के अंदर से एक बफर के ऊपर एक अलग पूर्ण पारित करना चाहते हैं। मुझे नहीं लगता कि कर्नेल के भीतर से यह संभव है, इसलिए आपको "आंतरिक" पास के लिए एक अलग कर्नेल के रूप में कोड बनाना होगा और उस कर्नेल को अपने होस्ट कोड से अलग से कॉल करना होगा। उस कर्नेल से आउटपुट को होस्ट मेमोरी पर वापस पढ़ना नहीं है, लेकिन आपके कर्नेल कॉल के बीच डिवाइस मेमोरी में रह सकता है।
OpenCL 2.0 spec गतिशील paralelism के लिए एक नई सुविधा जोड़ा।
6.13.17 Enqueuing Kernels
OpenCL 2.0 allows a kernel to independently enqueue to the same device, without host
interaction. ...
डिवाइस पर नीचे my_func_B enqueus my_func_A उदाहरण में:
kernel void
my_func_A(global int *a, global int *b, global int *c)
{
...
}
kernel void
my_func_B(global int *a, global int *b, global int *c)
{
ndrange_t ndrange;
// build ndrange information
...
// example – enqueue a kernel as a block
enqueue_kernel(get_default_queue(), ndrange, ^{my_func_A(a, b, c);});
...
}
- 1. ओपनसीएल कर्नेल
- 2. प्रोफाइलिंग ओपनसीएल कर्नेल
- 3. ओपनसीएल - क्या कर्नेल के भीतर से किसी अन्य फ़ंक्शन को आमंत्रित करना संभव है?
- 4. बड़े ओपनसीएल कर्नेल का निर्माण कैसे करें?
- 5. ओपनसीएल: CL_MEM_USE_HOST_PTR
- 6. ओपनसीएल कर्नेल को बिटस्ट्रीम में कैसे संकलित करें?
- 7. ओपनसीएल
- 8. ओपनसीएल कर्नेल के अंदर "memcpy" को प्रतिस्थापित करना चाहिए?
- 9. ओपनसीएल
- 10. ओपनसीएल
- 11. ओपनसीएल
- 12. ओपनसीएल
- 13. ओपनसीएल
- 14. ओपनसीएल
- 15. ओपनसीएल
- 16. ओपनसीएल प्रदर्शन अनुकूलन
- 17. ओपनसीएल घटनाक्रम और कमांड कतार
- 18. ओपनसीएल में मेमोरी प्रबंधन
- 19. किसी अन्य
- 20. किसी अन्य
- 21. किसी अन्य
- 22. किसी अन्य
- 23. किसी अन्य
- 24. किसी अन्य
- 25. किसी अन्य
- 26. किसी अन्य
- 27. किसी अन्य
- 28. किसी अन्य
- 29. ओपनसीएल एएमडी बनाम एनवीआईडीआईए प्रदर्शन
- 30. ओपनसीएल + एनवीडिया
sramij जवाब देने के लिए जोड़ा जा रहा है, कर्नेल से ही एक और गिरी बुला गतिशील समानता के रूप में कहा जाता है। इसके लिए आपको ओपनसीएल 2.0 का समर्थन करने वाले डिवाइस की आवश्यकता है। http://stackoverflow.com/questions/12913640/opencl-dynamic-parallelism-gpu-spawned-threads का संदर्भ ले सकते हैं – Meluha