2013-07-30 23 views
5

cudaStreamAddCallback() öğesini kullanarak cuda rutinimi senkronize etmeye çalışıyorum, ancak belgelerin açık olmaması nedeniyle bunu uygulayamıyorum. cuda-C-programlama-rehber geri arama olarak tanımlanan gerektiğini söylüyor:cudaStreamAddCallback() yöntemini sınıf üyesi yöntemiyle nasıl kullanabilirim?

void CUDART_CB MyCallback(void *data){} 

ve ayarlanması gerekir cudaStreamCallbackBlocking gibi bayrakları bahsediyor; Cuda_Toolhit_Reference_Manual ve cuda_runtime_api.h geri arama bir diğer uygulama gerektirirken:

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

ve bayrak ileride kullanılmak üzere olduğunu belirterek bağımsız değişken olarak bir 0 gerektirir. Ayrıca, aşağıdaki gibi işlevini çağırarak:

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

ve iletisini alıyorum 64bit için derlemeye çalışırken VS 2010 kullanıyorsanız çalışma: Boşluğun”türü argüman (__ stdcall CMyClass :: *) (cudaStream_t akışı, cudaError_t status, void * userData) ”," cudaStreamCallback_t "türünde bir parametreyle uyumsuz.

Birisi bu işlevi zaten uygulamış ve burada bir pasaj yayınlarken ikilemden kurtulmama yardımcı olabilir mi?

+0

Sen (ilgili [örnek kodda] ilginizi çekebilir http://docs.nvidia.com/cuda/cuda-: sınıf yöntemi kullanmak istiyorsanız yöntemini çağıracak sarıcı işlevi uygulamak gerekir numuneler/index.html # basit-cuda-geri aramaları). –

+0

Robert çok fazla tnx. Google aramalarım sırasında bu örnekleri bulamadım. Bunu yarın araştıracağım. – GregPhil

cevap

9

Bir sınıf yöntemini cudaStreamAddCallback'a geçirirsiniz, ancak üye olmayan bir işlev (global veya statik) olmalıdır.

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

Evet, kesinlikle haklısınız. Bu tavsiye için Tnx! – GregPhil

İlgili konular