मैं OpenCL में CUDA कोड का अनुवाद करने में कोशिश कर रहा हूँ और अभी मैं इन कार्यों/चर के साथ अटक कर रहा हूँ:CUDA के __syncthreads() और blockIdx.x के लिए ओपनसीएल एनालॉग क्या है?
__syncthreads()
blockIdx.x
मैं OpenCL में CUDA कोड का अनुवाद करने में कोशिश कर रहा हूँ और अभी मैं इन कार्यों/चर के साथ अटक कर रहा हूँ:CUDA के __syncthreads() और blockIdx.x के लिए ओपनसीएल एनालॉग क्या है?
__syncthreads()
blockIdx.x
असल में मैं इसे अपने स्वयं के द्वारा मिल गया! यहां एक उपयोगी आलेख है: http://www.netlib.org/utk/people/JackDongarra/PAPERS/parcocudaopencl.pdf
उत्तर है: __syncthreads() बाधा का उपयोग (CLK_LOCAL_MEM_FENCE); blockIdx.x के लिए get_group_id (0) का उपयोग करें!
__syncthreads()
->barrier(_)
लेकिन barrier(CLK_LOCAL_MEM_FENCE)
और barrier(CLK_GLOBAL_MEM_FENCE)
जांच इस question या अधिक जानकारी के लिए इस documentation के बीच अंतर समझना सुनिश्चित करें।
blockIdx.x
->get_group_id(0)
जो आप समूह/ब्लॉक के पहले/एक्स आयाम आईडी दे देंगे
वेब पर कई पृष्ठों है कि आप OpenCL के लिए CUDA पोर्टिंग के लिए मदद कर सकते हैं कर रहे हैं (उदाहरण के here के लिए)। मैं केवल टिप्पणी करना चाहता हूं, क्योंकि यह "बाधा" के लिए here इंगित करता है, कि barrier(CLK_LOCAL_MEM_FENCE)
और barrier(CLK_GLOBAL_MEM_FENCE)
हैं: मुख्य रूप से अंतर यह है कि जब आप स्थानीय (CUDA में साझा) मेमोरी का उपयोग कर रहे हैं तो पहला व्यक्ति स्मृति संचालन के सही क्रम को सुनिश्चित करता है और दूसरा जब आप वैश्विक स्मृति पर काम कर रहे हैं। अपने मामले के लिए सही का उपयोग करना सुनिश्चित करें।