1

非常に簡単な質問がありますが、わかりません。私は4.2 cudaで作業しています。

次のコードがあります。

私のcudaClass.hで:

unsigned char *dev_trimapExpanded;

私のcudaClass.cppで:

void cudaClass::expansionTrimap() {
    printf("dev_trimapExpanded %d before function \n", dev_trimapExpanded);
    //Call cuda function
    cudaError_t cudaStatus = expansionTrimapCuda(dev_trimapExpanded, width, height);
    if (cudaStatus != cudaSuccess) {
        fprintf(stderr, "expansionTrimapCuda failed!\n");
    }

    printf("dev_trimapExpanded %d after function \n", dev_trimapExpanded);
}

私のファイルkernel.cuには次のものがあります:

cudaError_t expansionTrimapCuda(unsigned char *dev_trimapExpanded, size_t width, size_t height)
{
    size_t size = width*height;

    cudaError_t cudaStatus;

    // Choose which GPU to run on, change this on a multi-GPU system.
    cudaStatus = cudaSetDevice(0);
    if (cudaStatus != cudaSuccess) {
        fprintf(stderr, "cudaSetDevice failed!  Do you have a CUDA-capable GPU installed?");
        return cudaStatus;
    }

    printf("dev_trimapExpanded %d before cudaMalloc \n", dev_trimapExpanded);
    cudaStatus = cudaMalloc((void**)&dev_trimapExpanded, size);
    if (cudaStatus != cudaSuccess) {
        fprintf(stderr, "cudaMalloc dev_trimapExpanded failed!");
        return cudaStatus;
    }
    printf("dev_trimapExpanded %d after cudaMalloc \n", dev_trimapExpanded);

    return cudaStatus;
}

出力は次のとおりです。

dev_trimapExpanded 0 before function
dev_trimapExpanded 0 before cudaMalloc
dev_trimapExpanded 93323264 after cudaMalloc
dev_trimapExpanded 0 after function

私のポインターのアドレスは、通常の cudaMalloc 呼び出しの前に 0 ですが、関数の後にアドレスが 0 である理由がわかりません。ポインター dev_trimapExpanded のアドレスは変更されません。cudaMalloc のスコープは関数内のみですか? メモリも解放されていません。異なるカーネル呼び出し間でグローバル メモリを追跡するにはどうすればよいですか?

4

1 に答える 1

3

動作は完全に正しいです。問題は、関数を呼び出しているときに「参照」ではなく「値」でポインターを渡していることです。したがって、現在何が起こっているかというと、関数が呼び出されたときにポインターがコピーされ、コピーの値が関数内で変更されますが、関数が終了すると、古いポインターはまったく影響を受けません (すべての変更はコピー)。

代わりに、関数ヘッダーにこれを試してください:

cudaError_t expansionTrimapCuda(unsigned char *& dev_trimapExpanded, ... )

参照:ポインターへのポインター / ポインターへの参照

于 2012-10-05T02:51:21.977 に答える