2013-07-30 3 views
5

Sto provando a sincronizzare la mia routine cuda usando cudaStreamAddCallback(), ma non riesco a implementarlo, anche perché la documentazione non è univoca. CUDA-C-programmazione-guida dice che la richiamata deve essere definito come:come posso utilizzare cudaStreamAddCallback() con un metodo membro della classe?

void CUDART_CB MyCallback(void *data){} 

e sta parlando di bandiere come il cudaStreamCallbackBlocking che deve essere impostato; mentre la Cuda_Toolhit_Reference_Manual e cuda_runtime_api.h richiede un'altra attuazione della richiamata:

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

e ricordare che il flag è per uso futuro e richiedono uno 0 come argomento. Inoltre, chiamando la funzione come segue:

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

e lavorare utilizzando VS 2010 cercando di compilare per 64bit sto ottenendo il messaggio: argomento di tipo “void (__ stdcall CMyClass :: *) (flusso cudaStream_t, cudaError_t status, void * userData) "non è compatibile con il parametro di tipo" cudaStreamCallback_t ".

Qualcuno ha già implementato questa funzione e sarebbe in grado di aiutarmi a uscire dal mio dilemma, pubblicando uno snippet qui?

+0

Potresti essere interessato al corrispondente [codice di esempio] (http://docs.nvidia.com/cuda/cuda- campioni/index.html # semplici-CUDA callback). –

+0

Robert tnx molto. Non ho trovato questo esempio durante la mia ricerca su google. Ho intenzione di indagare domani. – GregPhil

risposta

9

Si passa un metodo di classe a cudaStreamAddCallback, ma dovrebbe essere una funzione non membro (globale o statica). Se si desidera utilizzare il metodo di classe è necessario implementare la funzione wrapper che chiamerà il metodo:

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

Sì, hai assolutamente ragione. Grazie per questo consiglio! – GregPhil