2013-07-30 9 views
5

Próbuję zsynchronizować moją procedurę cuda za pomocą funkcji cudaStreamAddCallback(), ale nie mogę jej zaimplementować, również dlatego, że dokumentacja nie jest jednoznaczna. CUDA-C-programowanie-przewodnik mówi, że zwrotna musi być zdefiniowany jako:Jak mogę użyć metody cudaStreamAddCallback() z metodą członka klasy?

void CUDART_CB MyCallback(void *data){} 

i mówi o flagi takich jak cudaStreamCallbackBlocking, który musi być ustawiony; natomiast Cuda_Toolhit_Reference_Manual i cuda_runtime_api.h wymagające innego realizację callback:

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

i wspomnieć, że flaga jest do wykorzystania w przyszłości i wymagają 0 jako argumentu. Ponadto wywołanie funkcji następujące:

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

i pracy przy użyciu VS 2010 próbuje skompilować dla 64bit dostaję komunikat: argument typu „void (__ stdcall CMyClass :: *) (strumień cudaStream_t, cudaError_t status, void * userData) "jest niekompatybilny z parametrem typu" cudaStreamCallback_t ".

Czy ktoś już zaimplementował tę funkcję i byłby w stanie pomóc mi wyjść z mojego dylematu, publikując tutaj krótki opis?

+0

Możesz być zainteresowany odpowiednim [przykładowym kodem] (http://docs.nvidia.com/cuda/cuda- samples/index.html # simple-cuda-callbacks). –

+0

Robert tnx dużo. Nie znalazłem tych przykładów podczas wyszukiwania w Google. Zbadam to jutro. – GregPhil

Odpowiedz

9

Przekazujesz metodę klasy do cudaStreamAddCallback, ale powinna ona być funkcją nieczłonkową (globalną lub statyczną). Jeśli chcesz użyć metody klasy, powinieneś zaimplementować funkcję opakowania, która wywoła metodę:

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

Tak, masz absolutną rację. Tnx za tę radę! – GregPhil

Powiązane problemy