我们都知道 malloc 以后要 free 掉资源,以免造成内存泄漏的问题。但有时候我们编程时会忽略另一种资源:Plan Handle
例如,我们使用CUFFT库的时候,通常有类似这样的代码:
cufftHandle fftPlan;
cufftPlan3d(&fftPlan, dim, dim, dim, CUFFT_C2C);
cufftExecC2C(fftPlan, input, input, CUFFT_FORWARD);
初看起来没什么问题。但实际上,这里缺少了一句用于释放资源的 cufftDestroy(fftPlan); 虽然不写这句运行也没有问题,然而此处造成了轻微的显存泄漏。如果这段代码被执行了很多次,你就会发现程序出错,报错的地方是某个CudaMalloc函数,显然,显存已经漏完了。
因此,当你发现程序可能有显存泄漏的问题,但是程序里没有未被 CudaFree 的 CudaMalloc,那么你可以找一找是否有没有被Destroy 的 plan handle