0

Web のほとんどのチュートリアル、ガイド、書籍、Q&A は CUDA 3 および 4.x に言及しているようです。そのため、特に CUDA 5.0 について質問しています。質問に...

2 つの CUDA デバイスを備えた環境用にプログラムしたいのですが、設計を単純にするために 1 つのスレッドのみを使用します (特にプロトタイプであるため)。次のコードが有効かどうかを知りたい:

float *x[2];
float *dev_x[2];

for(int d = 0; d < 2; d++) {
    cudaSetDevice(d);
    cudaMalloc(&dev_x[d], 1024);
}

for(int repeats = 0; repeats < 100; repeats++) {
    for(int d = 0; d < 2; d++) {
        cudaSetDevice(d);
        cudaMemcpy(dev_x[d],x[d],1024,cudaMemcpyHostToDevice);

        some_kernel<<<...>>>(dev_x[d]);

        cudaMemcpy(x[d],dev_x[d],1024,cudaMemcpyDeviceToHost);
    }
    cudaStreamSynchronize(0);
}

同じスレッドでcudaMalloc(...)交換が発生しても、テスト前の s が持続するかどうかを具体的に知りたいです。また、やcudaSetDevice()などのコンテキスト依存オブジェクトでも同じことが起こるかどうかを知りたいです。cudaEvent_tcudaStream_t

このスタイルのアプリケーションでマッピング エラーが発生し続けており、メモリ リークが不足していたり​​、API の使用法が間違っていたりすると、それが何であるかを見つけることができないため、私はそれを求めています。

注: 元のコードでは、すべての CUDA 呼び出しをチェックしています。コードを読みやすくするために、ここには入れませんでした。

4

1 に答える 1

1

これは単なるタイプミスですか?

for(int d = 0; d < 2; d++) {
    cudaSetDevice(0);  // shouldn't that be 'd'
    cudaMalloc(&dev_x, 1024);
}

すべての API 呼び出しの戻り値を確認してください。

于 2013-02-12T17:53:41.987 に答える