2013-07-30 31 views
5

Tôi đang cố gắng đồng bộ hóa cuda thường trình của tôi bằng cách sử dụng cudaStreamAddCallback(), nhưng tôi không thể thực hiện nó, cũng vì tài liệu không rõ ràng. The-C-lập trình hướng CUDA nói rằng callback phải được định nghĩa là:làm thế nào tôi có thể sử dụng cudaStreamAddCallback() với một phương pháp thành viên lớp học?

void CUDART_CB MyCallback(void *data){} 

và đang nói về cờ như cudaStreamCallbackBlocking mà cần phải được thiết lập; trong khi Cuda_Toolhit_Reference_Manual và cuda_runtime_api.h đòi hỏi một thực hiện khác của callback:

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

và nhắc rằng lá cờ là để sử dụng trong tương lai và yêu cầu 0 như là đối số. Hơn nữa, gọi hàm như sau:

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

và làm việc sử dụng VS 2010 cố gắng để biên dịch cho 64bit Tôi nhận được thông báo: đối số kiểu “void (__ stdcall CMyClass :: *) (cudaStream_t suối, cudaError_t status, void * userData) ”không tương thích với tham số kiểu" cudaStreamCallback_t ".

Có ai đó đã triển khai chức năng này và có thể giúp tôi thoát khỏi tình huống khó xử của tôi, trong khi đăng một đoạn trích ở đây không?

+0

Bạn có thể quan tâm đến [mẫu mã] có liên quan (http://docs.nvidia.com/cuda/cuda- samples/index.html # simple-cuda-callbacks). –

+0

Robert tnx rất nhiều. Tôi không tìm thấy ví dụ này trong khi tìm kiếm google của tôi. Tôi sẽ điều tra nó vào ngày mai. – GregPhil

Trả lời

9

Bạn chuyển một phương thức lớp tới cudaStreamAddCallback, nhưng nó phải là một hàm không phải là thành viên (toàn cầu hoặc tĩnh). Nếu bạn muốn sử dụng phương thức lớp, bạn nên triển khai hàm bao hàm sẽ gọi phương thức:

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

Vâng, bạn hoàn toàn đúng. Tnx cho lời khuyên này! – GregPhil

Các vấn đề liên quan