Memory leaks Valgrind和CUDA:报告的泄漏是真实的吗?
我的应用程序中有一个非常简单的CUDA组件。Valgrind报告了大量泄漏,仍然可以联系到,所有这些都与Cudamaloc电话有关 这些泄密是真的吗?我为每个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
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