2012-09-05 13 views
5

के साथ कर्नेल को पास किए गए चर के लिए डिवाइस/होस्ट मेमोरी समेकन यदि कोई चर CL_MEM_USE_HOST_PTR के साथ कर्नेल को पास किया गया है, तो इसका मतलब यह है कि डिवाइस में चर में कोई भी परिवर्तन होस्ट मेमोरी में भी दिखाया जाएगा?ओपनसीएल: CL_MEM_USE_HOST_PTR

मैं ऐसे परिदृश्य में हूं जहां मैं जीपीयू के बजाए डिवाइस के रूप में सीपीयू का उपयोग कर रहा हूं, इसलिए कर्नेल को पास की गई सभी चीज़ों को CL_MEM_USE_HOST_PTR के साथ चिह्नित किया जाएगा।

यदि यह सत्य है, तो मुझे अब होस्ट करने के लिए सबकुछ पढ़ने की आवश्यकता नहीं है, जो बहुत सुविधाजनक है।

उत्तर

8

आपकी समझ, सही है एक संभावित ख़तरा को छोड़कर: documentation कहा गया है कि

OpenCL कार्यान्वयन बफर सामग्री डिवाइस स्मृति में host_ptr द्वारा की ओर इशारा किया कैश करने के लिए अनुमति दी जाती है। इस कैश की गई प्रति को का उपयोग किया जा सकता है जब किसी डिवाइस पर कर्नेल निष्पादित किए जाते हैं।

इसका मतलब है कि कर्नेल द्वारा किए गए डेटा में किए गए परिवर्तनों को तुरंत host_ptr में प्रतिबिंबित नहीं किया जा सकता है। वास्तव में, इस बात की कोई गारंटी नहीं है कि host_ptr में वैध डेटा होता है जबकि इसका उपयोग बफर के लिए किया जाता है।

वैध और अद्यतित डेटा रखने के लिए आपको सिंक्रनाइज़ेशन को मजबूर करना होगा। offcial प्रलेखन इस पल के बारे में थोड़ा अस्पष्ट है, लेकिन निश्चित रूप से buffer mapping/unmapping काम करता है:

तो बफर वस्तु mem_flags में CL_MEM_USE_HOST_PTR सेट के साथ बनाया जाता है, host_ptrclCreateBuffer में निर्दिष्ट की गारंटी है में नवीनतम बिट्स को रोकने के लिए clEnqueueMapBuffer कमांड पूरा हो गया है जब क्षेत्र मैप किया जा रहा है; और पॉइंटर मान clEnqueueMapBuffer द्वारा लौटाया गया host_ptr से बफर ऑब्जेक्ट बनाया गया है जब निर्दिष्ट किया जाएगा।

यहाँ एक उदाहरण Khronos group forum post से अनुकूलित है:

cl_mem device_output = clCreateBuffer(context, CL_MEM_READ_WRITE | CL_MEM_USE_HOST_PTR, size, original_output, NULL); 
// run the kernel 
void* pointer = clEnqueueMapBuffer(queue, device_output, CL_TRUE, CL_MAP_READ, size, 0, 0, NULL, NULL, NULL); 
// work with 'original_output' 
clEnqueueUnmapMemObject(queue, device_output, pointer, 0, NULL, NULL); 
clReleaseMemObject(device_output); 
+2

यह एक सूक्ष्म पकड़ लिया है और मैं इस से भी काट लिया गया है, तो यह अच्छी बात है कि आप इस लाया। – Ani

+0

@aland मुझे लगता है कि मैं बहुत देर से पूछ रहा हूं .. लेकिन स्मृति को मैप करने की बजाय, अगर मैं घटना का उपयोग कर इंतजार कर रहा हूं .. क्या यह होस्ट डिवाइस में मेरी उचित सरणी अपडेट करेगा? मेरे लिए यह काम कर रहा है (हो सकता है कि मैं कर्नेल खत्म करने के लिए घटना का उपयोग कर रहा हूं)। लेकिन फिर मैं मैपिंग छोड़ सकता हूँ? –

+1

@ विश्ववाडे बस निष्पादन खत्म करने के लिए कर्नेल की प्रतीक्षा कर रहे हैं [* नहीं * पर्याप्त] (http://www.khronos.org/message_boards/showthread.php/6912-Clarify-CL_MEM_USE_HOST_PTR?p=22099&viewfull=1#post22099)। आपका दृष्टिकोण काम कर सकता है, especitally अगर आप केवल सीपीयू का उपयोग कंप्यूट डिवाइस के रूप में करते हैं, लेकिन यह अभी भी अपरिभाषित व्यवहार है। – aland

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