非常に簡単な質問がありますが、わかりません。私は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 のスコープは関数内のみですか? メモリも解放されていません。異なるカーネル呼び出し間でグローバル メモリを追跡するにはどうすればよいですか?