0
我测试的动态分配,即cudaMemGetInfo不是常量?
__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的可用内存减少(我没有通过给内核发出有用的评论来减少)。当我在内核中添加一个删除(temp)时,似乎不会减少浪费的内存量,我仍然会减少~30Mo。为什么?
- 循环后使用cudaFree(temp)或cudadeviceReset()也没有多大帮助。为什么?以及如何释放内存?
好的,谢谢!我对cuda环境的概念仍然有困难,但我正在阅读文档。 –
@FrançoisLaenen:上下文是给定GPU上的主机进程/线程特定的“会话”。每个上下文在GPU上都有自己的虚拟地址空间,CUDA运行时支持,代码和数据将加载到该空间中。在运行时API中,这大部分是隐藏的,但如果您查看驱动程序API文档,则可以看到显式调用管理上下文。 – talonmies
好吧,我现在好了。举例来说,cudaMalloc从主机返回的指针将不会被另一个上下文使用,因为它将被加载到第一个上下文的VAS中? –