2011-08-25 15 views
10

मैं एक ट्यूटोरियल यहाँ स्थित के साथ अनुसरण कर रही हूं:ओपनसीएल - क्या कर्नेल के भीतर से किसी अन्य फ़ंक्शन को आमंत्रित करना संभव है?

__kernel void vector_add_gpu (__global const float* src_a, 
        __global const float* src_b, 
        __global float* res, 
      const int num) 
{ 
    /* get_global_id(0) returns the ID of the thread in execution. 
    As many threads are launched at the same time, executing the same kernel, 
    each one will receive a different ID, and consequently perform a different computation.*/ 
    const int idx = get_global_id(0); 

    /* Now each work-item asks itself: "is my ID inside the vector's range?" 
    If the answer is YES, the work-item performs the corresponding computation*/ 
    if (idx < num) 
     res[idx] = src_a[idx] + src_b[idx]; 
} 

1) कहो: http://opencl.codeplex.com/wikipage?title=OpenCL%20Tutorials%20-%201

गिरी वे सूचीबद्ध किया है इस है, जो उत्पादन चर में दो नंबर और यह भंडार की राशि की गणना करता है उदाहरण के लिए कि ऑपरेशन किया गया ऑपरेशन एक सारांश से कहीं अधिक जटिल था - कुछ ऐसा जो अपने कार्य को वारंट करता है। आइए इसे कॉम्प्लेक्सऑप (इन 1, इन 2, आउट) कहते हैं। मैं इस फ़ंक्शन को कार्यान्वित करने के बारे में कैसे जाउंगा जैसे vector_add_gpu() कॉल कर सकते हैं और इसका उपयोग कर सकते हैं? क्या आप उदाहरण कोड दे सकते हैं?

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

+1

बस एक टिप्पणी। यह ओपनसीएल सीयूडीए नहीं है। आपको वर्कग्रुप आकार के गुणकों का उपयोग करने के लिए मजबूर नहीं किया जाता है। मैं अक्सर बकवास बदसूरत 'अगर (idx DarkZeros

उत्तर

3

आपके पास कर्नेल में उपयोग के लिए सहायक कार्य हो सकते हैं, OpenCL user defined inline functions देखें। आप कर्नेल में फ़ंक्शन पॉइंटर्स पास नहीं कर सकते हैं।

+4

मुझे यह पसंद है कि आपका नाम भी एडम एस –

18

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

उदाहरण

float4 hit(float4 ray_p0, float4 ray_p1, float4 tri_v1, float4 tri_v2, float4 tri_v3) 
{ 
//logic to detect if the ray intersects a triangle 
} 

__kernel void detection(__global float4* trilist, float4 ray_p0, float4 ray_p1) 
{ 
int gid = get_global_id(0); 
float4 hitlocation = hit(ray_p0, ray_p1, trilist[3*gid], trilist[3*gid+1], trilist[3*gid+2]); 
} 
+0

क्या है 'पॉइंटर्स सहायक कार्यों को कॉल करते समय उपयोग करने के लिए भी उपलब्ध नहीं हैं?' – Nigel

+0

ओपनक्ल कर्नेल पॉइंटर्स के भीतर किसी कर्नेल में या कर्नेल से फ़ंक्शन को कॉल करते समय कहीं भी उपयोग नहीं किया जा सकता है। पॉइंटर्स उन चेतावनी में से एक हैं। पॉइंटर पासिंग की आवश्यकता नहीं होने का एक कारण यह है कि कार्यों को एक अलग स्मृति पते को सौंपने के बजाय हमेशा रेखांकित किया जाता है। –

संबंधित मुद्दे