Valgrind和CUDA:据报道泄漏是真的吗?

jsj*_*jsj 11 valgrind memory-leaks cuda

我的应用程序中有一个非常简单的CUDA组件.Valgrind报告了许多泄漏和仍然可达,这些都与cudaMalloc调用有关.

这些泄漏真的存在吗?我呼吁cudaFree每一个人cudaMalloc.这个valgrind无法解释GPU内存分配吗?如果这些泄漏不是真的,我可以抑制它们并让valgrind只分析应用程序的非gpu部分吗?

extern "C"
unsigned int *gethash(int nodec, char *h_nodev, int len) {
    unsigned int *h_out = (unsigned int *)malloc(sizeof(unsigned int) * nodec);

    char *d_in;
    unsigned int *d_out;

    cudaMalloc((void**) &d_in, sizeof(char) * len * nodec);
    cudaMalloc((void**) &d_out, sizeof(unsigned int) * nodec);

    cudaMemcpy(d_in, h_nodev, sizeof(char) * len * nodec, cudaMemcpyHostToDevice);

    int blocks = 1 + nodec / 512;


    cube<<<blocks, 512>>>(d_out, d_in, nodec, len);

    cudaMemcpy(h_out, d_out, sizeof(unsigned int) * nodec, cudaMemcpyDeviceToHost);

    cudaFree(d_in);
    cudaFree(d_out);
    return h_out;

}
Run Code Online (Sandbox Code Playgroud)

Valgrind输出的最后一位:

...
==5727== 5,468 (5,020 direct, 448 indirect) bytes in 1 blocks are definitely lost in loss record 506 of 523
==5727==    at 0x402B965: calloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==5727==    by 0x4843910: ??? (in /usr/lib/nvidia-319-updates/libcuda.so.319.60)
==5727==    by 0x48403E9: ??? (in /usr/lib/nvidia-319-updates/libcuda.so.319.60)
==5727==    by 0x498B32D: ??? (in /usr/lib/nvidia-319-updates/libcuda.so.319.60)
==5727==    by 0x494A6E4: ??? (in /usr/lib/nvidia-319-updates/libcuda.so.319.60)
==5727==    by 0x4849534: ??? (in /usr/lib/nvidia-319-updates/libcuda.so.319.60)
==5727==    by 0x48191DD: cuInit (in /usr/lib/nvidia-319-updates/libcuda.so.319.60)
==5727==    by 0x406B4D6: ??? (in /usr/lib/i386-linux-gnu/libcudart.so.5.0.35)
==5727==    by 0x406B61F: ??? (in /usr/lib/i386-linux-gnu/libcudart.so.5.0.35)
==5727==    by 0x408695D: cudaMalloc (in /usr/lib/i386-linux-gnu/libcudart.so.5.0.35)
==5727==    by 0x804A006: gethash (hashkernel.cu:36)
==5727==    by 0x804905F: chkisomorphs (bdd.c:326)
==5727== 
==5727== LEAK SUMMARY:
==5727==    definitely lost: 10,240 bytes in 6 blocks
==5727==    indirectly lost: 1,505 bytes in 54 blocks
==5727==      possibly lost: 7,972 bytes in 104 blocks
==5727==    still reachable: 626,997 bytes in 1,201 blocks
==5727==         suppressed: 0 bytes in 0 blocks
Run Code Online (Sandbox Code Playgroud)

mir*_*han 6

这是一个众所周知的问题,valgrind报告了一堆CUDA的误报.避免看到它的最好方法是使用valgrind抑制,你可以在这里阅读所有内容:http: //valgrind.org/docs/manual/manual-core.html#manual-core.suppress

如果你想快速开始更接近你的具体问题,那么在Nvidia开发论坛上有一个有趣的帖子.它有一个指向样本抑制规则文件的链接. https://devtalk.nvidia.com/default/topic/404607/valgrind-3-4-suppressions-a-little-howto/


小智 5

尝试使用cuda-memcheck --leak-check full. Cuda-memcheck 是一组工具,可为 CUDA 应用程序提供与 Valgrind 类似的功能。它作为 CUDA 工具包的一部分安装。您可以cuda-memcheck在此处获取有关如何使用的更多文档:http : //docs.nvidia.com/cuda/cuda-memcheck/

请注意,这cuda-memcheck不是 valgrind 的直接替代品,也不能用于检测主机端内存泄漏或缓冲区溢出。