如何将cudaStreamAddCallback()与类成员方法一起使用?

Gre*_*hil 5 cuda visual-c++

我正在尝试使用cudaStreamAddCallback()来同步我的cuda例程,但是我无法实现它,因为文档不是明确的.cuda-C-programming-guide说回调必须定义为:

void CUDART_CB MyCallback(void *data){}
Run Code Online (Sandbox Code Playgroud)

并且正在谈论需要设置的cudaStreamCallbackBlocking之类的标志; 而Cuda_Toolhit_Reference_Manual和cuda_runtime_api.h需要另一个回调实现:

void CUDART_CB MyCallback (cudaStream_t stream, cudaError_t status, void *userData){}
Run Code Online (Sandbox Code Playgroud)

并提到该标志是供将来使用,并要求0作为参数.此外,调用函数如下:

cudaStreamAddCallback(GpuStream, MyCallback, &BufSwitchParams, 0);
Run Code Online (Sandbox Code Playgroud)

并使用VS 2010尝试编译64位我得到消息:类型为"void(__ stdcall CMyClass ::*)(cudaStream_t stream,cudaError_t status,void*userData)"的参数与"cudaStreamCallback_t"类型的参数不兼容.

有人已经实现了这个功能,并且可以帮助我摆脱困境,同时在这里发布一个片段吗?

jet*_*t47 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);
Run Code Online (Sandbox Code Playgroud)