2011-10-12 22 views
8

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

उत्तर

8

आप अपने कर्नेल से सहायक कार्यों को कॉल कर सकते हैं और उन्हें कर्नेल के समान तरीके से समांतर किया जाएगा, उन्हें अपने कर्नेल कोड के अंदर रेखांकित करें। इसलिए, प्रत्येक कार्य आइटम उस कार्य सेट के लिए सहायक कार्य का आह्वान करेगा जो इसे संभालता है।

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]); 
} 
+0

sramij जवाब देने के लिए जोड़ा जा रहा है, कर्नेल से ही एक और गिरी बुला गतिशील समानता के रूप में कहा जाता है। इसके लिए आपको ओपनसीएल 2.0 का समर्थन करने वाले डिवाइस की आवश्यकता है। http://stackoverflow.com/questions/12913640/opencl-dynamic-parallelism-gpu-spawned-threads का संदर्भ ले सकते हैं – Meluha

3

अगर मैं अपने प्रश्न समझ में सही ढंग से, आप कर्नेल के अंदर से एक बफर के ऊपर एक अलग पूर्ण पारित करना चाहते हैं। मुझे नहीं लगता कि कर्नेल के भीतर से यह संभव है, इसलिए आपको "आंतरिक" पास के लिए एक अलग कर्नेल के रूप में कोड बनाना होगा और उस कर्नेल को अपने होस्ट कोड से अलग से कॉल करना होगा। उस कर्नेल से आउटपुट को होस्ट मेमोरी पर वापस पढ़ना नहीं है, लेकिन आपके कर्नेल कॉल के बीच डिवाइस मेमोरी में रह सकता है।

2

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);}); 
... 
} 
संबंधित मुद्दे