मैं हाल ही में ओपनसीएल के साथ खेल रहा हूं, और मैं सरल कर्नेल लिखने में सक्षम हूं जो केवल वैश्विक स्मृति का उपयोग करते हैं। अब मैं स्थानीय मेमोरी का उपयोग शुरू करना चाहता हूं, लेकिन मुझे लगता है कि एक समय में आउटपुट के "खंड" की गणना करने के लिए get_local_size()
और get_local_id()
का उपयोग कैसे करें।मैं ओपनसीएल में स्थानीय मेमोरी का उपयोग कैसे करूं?
उदाहरण के लिए, मान लीजिए कि मैं ऐप्पल के ओपनसीएल हैलो वर्ल्ड उदाहरण कर्नेल को स्थानीय मेमोरी का उपयोग करने के लिए परिवर्तित करना चाहता हूं। आपको इसे कैसे करना होगा?
__kernel square(
__global float *input,
__global float *output,
const unsigned int count)
{
int i = get_global_id(0);
if (i < count)
output[i] = input[i] * input[i];
}
इस उदाहरण आसानी से कुछ पता चलता है कि कैसे स्थानीय स्मृति का उपयोग करते हैं, किसी अन्य साधारण उदाहरण क्या करेंगे बनाने के लिए में परिवर्तित नहीं किया जा सकता है: यहाँ मूल कर्नेल स्रोत है।
मैंने एनवीआईडीआईए प्रारंभिक सामग्री के माध्यम से पढ़ा है, और मुझे अभी भी उदाहरण बहुत जटिल हैं। मैं अपने पैरों को गीला करने के लिए स्थानीय स्मृति का उपयोग करने के लिए एक uber-सरल 1-आयामी उदाहरण की तलाश में हूं। – splicer
आपके अंतिम संपादन में कोड जोड़ने के लिए धन्यवाद! मुझे लगता है कि आपका कर्नेल काम नहीं कर रहा है .... मैं tempetKernelArg() temp के लिए कैसे उपयोग करूं? क्या मुझे tempreateBuffer() temp के लिए उपयोग करने की आवश्यकता है? इसके अलावा, आपके कर्नेल में कुछ टाइपो हैं: "temp * temp" "temp [ltid] * temp [ltid]" होना चाहिए, और अंतिम पंक्ति से पहले एक बंद ब्रेस डालना चाहिए। – splicer
हिम तेंदुए के तहत सीपीयू पर चल रहा है, मैंने clSetKernelArg (कर्नेल, 2, आकार (cl_float), NULL) की कोशिश की; लेकिन यह दुर्घटनाग्रस्त हो जाता है। कोई विचार? – splicer