2013-07-30 5 views
5

मैं cudaStreamAddCallback() का उपयोग करके अपने cuda routine को सिंक्रनाइज़ करने का प्रयास कर रहा हूं, लेकिन मैं इसे कार्यान्वित नहीं कर सकता, क्योंकि दस्तावेज़ भी स्पष्ट नहीं है। CUDA-सी-प्रोग्रामिंग गाइड का कहना है कॉलबैक के रूप में परिभाषित किया जाना है कि:मैं कक्षा सदस्य विधि के साथ cudaStreamAddCallback() का उपयोग कैसे कर सकता हूं?

void CUDART_CB MyCallback(void *data){} 

और cudaStreamCallbackBlocking कि निर्धारित करने की आवश्यकता की तरह झंडे के बारे में बात की है, जबकि Cuda_Toolhit_Reference_Manual और cuda_runtime_api.h कॉलबैक का एक अन्य कार्यान्वयन की आवश्यकता होती है:

void CUDART_CB MyCallback (cudaStream_t stream, cudaError_t status, void *userData){} 

और उल्लेख है कि झंडा भविष्य में उपयोग के लिए है और तर्क के रूप में एक 0 की आवश्यकता है। इसके अलावा, इस प्रकार समारोह बुला:

cudaStreamAddCallback(GpuStream, MyCallback, &BufSwitchParams, 0); 

और VS 2010 का उपयोग कर 64 बिट मुझे संदेश मिल रहा के लिए संकलित करने के लिए कोशिश कर काम कर रहे: प्रकार की "शून्य तर्क (__ stdcall CMyClass :: *) (cudaStream_t धारा, cudaError_t स्थिति, शून्य * उपयोगकर्ता डेटा) "प्रकार" पैरामीटर के साथ असंगत है "cudaStreamCallback_t"।

क्या कोई इस फ़ंक्शन को पहले से ही कार्यान्वित कर चुका है और यहां एक स्निपेट पोस्ट करते समय मुझे मेरी दुविधा से बाहर निकलने में सक्षम होगा?

+0

आप प्रासंगिक [नमूना कोड] में रुचि (हो सकता है http://docs.nvidia.com/cuda/cuda-: आप आवरण समारोह है कि विधि फोन करेगा लागू करना चाहिए आप वर्ग विधि का उपयोग करना चाहते हैं नमूने/index.html # सरल-CUDA-कॉलबैक)। –

+0

रॉबर्ट टीएनएक्स बहुत कुछ। मुझे मेरी Google खोज के दौरान यह उदाहरण नहीं मिला। मैं कल इसकी जांच करने जा रहा हूं। – GregPhil

उत्तर

9

आप cudaStreamAddCallback पर कक्षा विधि पास करते हैं, लेकिन यह एक गैर-सदस्य कार्य (वैश्विक या स्थैतिक) होना चाहिए।

class MyClass 
{ 
public: 
    static void CUDART_CB Callback(cudaStream_t stream, cudaError_t status, void *userData); 

private: 
    void callbackFunc(); 
}; 

void CUDART_CB MyClass::Callback(cudaStream_t stream, cudaError_t status, void *userData) 
{ 
    MyClass* thiz = (MyClass*) userData; 
    thiz->callbackFunc(); 
} 

void MyClass::callbackFunc() 
{ 
    // implementation here 
} 

MyClass* obj = new MyClass; 
cudaStreamAddCallback(GpuStream, MyClass::Callback, obj, 0); 
+0

हां, आप बिल्कुल सही हैं। इस सलाह के लिए टीएनएक्स! – GregPhil

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

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