我正在测试动态分配,即
__device__ double *temp;
__global__
void test(){
temp = new double[125000]; //1MB
}
调用此函数 100 次以查看内存是否在减少:
size_t free, total;
CUDA_CHECK(cudaMemGetInfo(&free, &total));
fprintf(stdout,"\t### Available VRAM : %g Mo/ %g Mo(total)\n\n", free/pow(10., 6), total/pow(10., 6));
for(int t=0;t<100;t++){
test<<<1, 1>>>();
CUDA_CHECK(cudaDeviceSynchronize());
fprintf(stdout,"\t### Available VRAM : %g Mo/ %g Mo(total)\n\n", free/pow(10., 6), total/pow(10., 6));
}
CUDA_CHECK(cudaMemGetInfo(&free, &total));
fprintf(stdout,"\t### Available VRAM : %g Mo/ %g Mo(total)\n\n", free/pow(10., 6), total/pow(10., 6));
它实际上是。
- 注意:当尝试不调用函数和循环内的 cudaMemGetInfo 时,它从 800 减少到 650 个月,我得出的结论是控制台的输出大约需要 150 个月。确实,当尝试上面写的代码时,结果没有改变。但它是巨大的!
- 循环后我的可用内存减少了约 50Mo(我希望通过评论对内核的调用没有任何减少)。当我在内核中添加一个 delete(temp) 时,似乎并没有减少多少浪费的内存,我仍然减少了 ~30Mo。为什么?
- 在循环之后使用 cudaFree(temp) 或 cudadeviceReset() 也无济于事。为什么?以及如何释放内存?