5

cudaStreamAddCallback() を使用して cuda ルーチンを同期しようとしていますが、ドキュメントが明確ではないため、実装できません。cuda-C-programming-guide によると、コールバックは次のように定義する必要があります。

void CUDART_CB MyCallback(void *data){}

設定する必要がある cudaStreamCallbackBlocking のようなフラグについて話しています。Cuda_Toolhit_Reference_Manual と cuda_runtime_api.h はコールバックの別の実装を必要とします:

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

フラグは将来使用するためのものであり、引数として 0 が必要であることに言及します。さらに、次のように関数を呼び出します。

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

VS 2010 を使用して 64 ビット用にコンパイルしようとすると、次のメッセージが表示されます: タイプ「void(__stdcall CMyClass::*)(cudaStream_t stream, cudaError_t status, void *userData)」の引数は、タイプ「cudaStreamCallback_t」のパラメーターと互換性がありません.

誰かがすでにこの機能を実装していて、ここにスニペットを投稿している間、私のジレンマから私を助けることができるでしょうか?

4

1 に答える 1

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);
于 2013-07-30T10:43:08.583 に答える