Memory leaks Valgrind和CUDA:报告的泄漏是真实的吗?

Memory leaks Valgrind和CUDA:报告的泄漏是真实的吗?,memory-leaks,cuda,valgrind,Memory Leaks,Cuda,Valgrind,我的应用程序中有一个非常简单的CUDA组件。Valgrind报告了大量泄漏,仍然可以联系到,所有这些都与Cudamaloc电话有关 这些泄密是真的吗?我为每个cudamaloc调用cudaFree。这是valgrind无法解释GPU内存分配的原因吗?如果这些泄漏不是真实的,我可以抑制它们并让valgrind只分析应用程序的非gpu部分吗 extern "C" unsigned int *gethash(int nodec, char *h_nodev, int len) { unsign

我的应用程序中有一个非常简单的CUDA组件。Valgrind报告了大量泄漏,仍然可以联系到,所有这些都与Cudamaloc电话有关

这些泄密是真的吗?我为每个
cudamaloc
调用
cudaFree
。这是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;

}

我不会相信valgrind或任何其他泄漏检测器(如VLD)和CUDA。我肯定他们设计时没有考虑GPU分配。我不知道Nvidia的Nsight这些天是否有这种能力(我已经有6个月没有做GPU编程了),但这是我在CUDA调试中使用的最好的东西,说实话,这是一个非常糟糕的错误


您发布的代码不应该造成泄漏。

valgrind报告大量CUDA内容的误报是一个众所周知的问题。避免看到它的最好方法是使用valgrind抑制,您可以在此处阅读:

<>如果你想开始更接近你的特定问题,英伟达DEV论坛上有一个有趣的帖子。它有一个指向示例抑制规则文件的链接。

尝试使用
cuda memcheck——完全泄漏检查
。Cuda memcheck是一组工具,为Cuda应用程序提供与Valgrind类似的功能。它是作为CUDA工具包的一部分安装的。您可以在此处获得有关如何使用cuda memcheck的更多文档:


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

为了补充scarl3tt的答案,这可能对某些应用程序过于笼统,但如果您想使用valgrind而忽略大部分cuda问题,使用选项--suppressions=valgrind-cuda.supp,其中valgrind-cuda.supp是具有以下规则的文件:

{
   alloc_libcuda
   Memcheck:Leak
   match-leak-kinds: reachable,possible
   fun:*alloc
   ...
   obj:*libcuda.so*
   ...
}

{
   alloc_libcufft
   Memcheck:Leak
   match-leak-kinds: reachable,possible
   fun:*alloc
   ...
   obj:*libcufft.so*
   ...
}

{
   alloc_libcudaart
   Memcheck:Leak
   match-leak-kinds: reachable,possible
   fun:*alloc
   ...
   obj:*libcudart.so*
   ...
}

由于我没有50%的声誉,我不能对@Vyas的回答发表评论

我感到奇怪的是cuda memcheck无法观察到cuda内存泄漏

我只是写了一个非常简单的cuda内存泄漏代码,但是当使用
cuda memcheck--leak check full
时,它不会泄漏。它是:

#include <iostream>
#include <cuda_runtime.h>

using namespace std;

int main(){
    float* cpu_data;
    float* gpu_data;
    int buf_size = 10 * sizeof(float);

    cpu_data = (float*)malloc(buf_size);
    for(int i=0; i<10; i++){
        cpu_data[i] = 1.0f * i;
    }

    cudaError_t cudaStatus = cudaMalloc(&gpu_data, buf_size);

    cudaMemcpy(gpu_data, cpu_data, buf_size, cudaMemcpyHostToDevice);

    free(cpu_data);
    //cudaFree(gpu_data);

    return 0;
}

cuda memcheck-h
:“--泄漏检查[默认值:否]打印cuda分配的泄漏信息。注意:程序必须以cudaDeviceReset()结束才能工作。”
#include <iostream>
#include <cuda_runtime.h>

using namespace std;

int main(){
    float* cpu_data;
    float* gpu_data;
    int buf_size = 10 * sizeof(float);

    cpu_data = (float*)malloc(buf_size);
    for(int i=0; i<10; i++){
        cpu_data[i] = 1.0f * i;
    }

    cudaError_t cudaStatus = cudaMalloc(&gpu_data, buf_size);

    cudaMemcpy(gpu_data, cpu_data, buf_size, cudaMemcpyHostToDevice);

    free(cpu_data);
    //cudaFree(gpu_data);

    return 0;
}
========= CUDA-MEMCHECK
========= ERROR SUMMARY: 0 errors