为何cudaStreamCreateWithFlags会引发内存泄漏?且泄漏量恒定?
问题分析与解答
内存泄漏的原因
你代码里的核心问题是销毁CUDA流的函数名拼写错误:你写的是cudaStreamDestory,但CUDA runtime提供的正确函数是cudaStreamDestroy(末尾多了一个字母'y')。这个拼写错误会导致销毁流的逻辑完全没有执行——如果没开启严格编译检查,编译器甚至可能悄悄忽略这个未定义函数调用,每次循环创建的CUDA流资源都没有被释放,自然会被heaptrack检测为内存泄漏。
泄漏内存量恒定的原因
这是因为CUDA runtime内部维护了一个流对象缓存池。当你反复创建流时,runtime会优先复用之前已经创建但未被正确销毁的流对象,而不是每次都向系统申请新的内存。当循环次数达到一定值后,缓存池里的闲置流已经足够复用,就不会再分配新的内存,因此不管循环执行多少次,泄漏的内存总量都会保持恒定。
修复方案
把cudaStreamDestory改成正确的cudaStreamDestroy即可解决内存泄漏问题,修复后的代码如下:
for(int i = 0; i < 100; i++){ cudaStream_t stream_default; cudaError_t err = cudaStreamCreateWithFlags(&stream_default, cudaStreamDefault); // 修正后的销毁函数 cudaStreamDestroy(stream_default); }
内容的提问来源于stack exchange,提问作者张子阳
相关产品推荐
相关产品推荐

