C++ 如何使用推力和valgrind一起检测内存泄漏?

C++ 如何使用推力和valgrind一起检测内存泄漏?,c++,memory-leaks,cuda,valgrind,thrust,C++,Memory Leaks,Cuda,Valgrind,Thrust,有没有办法将CUDA推力库与Valgrind内存泄漏检测器一起使用? 我问这个问题的原因是因为这个简单的程序: #include <thrust/device_vector.h> int main(){ thrust::device_vector<int> D(5); assert( D.size() == 5 ); } 使Valgrind相信存在多个可能的内存泄漏 我知道它们一定是误报,valgrind不是用来检测GPU内存泄漏的,但我想知道是否有一

有没有办法将CUDA推力库与Valgrind内存泄漏检测器一起使用?

我问这个问题的原因是因为这个简单的程序:

#include <thrust/device_vector.h>

int main(){
    thrust::device_vector<int> D(5);
    assert( D.size() == 5 );
}
使Valgrind相信存在多个可能的内存泄漏

我知道它们一定是误报,valgrind不是用来检测GPU内存泄漏的,但我想知道是否有一个标志或一个标准方法使这两个工具一起工作(例如,检测CPU内存泄漏)。

如果有一套标准的Valgrind异常,我会很乐意使用它们,但在玩“怪胎”游戏之前,我想问一下

$valgrind./device_vector.cu.x
==765561==Memcheck,内存错误检测器
==765561==2002-2017年版权(C)和GNU GPL'd,朱利安·苏厄德等人。
==765561==使用Valgrind-3.15.0和LibVEX;使用-h重新运行以获取版权信息
==765561==命令:./device_vector.cu.x
==765561== 
==765561==警告:注意到但未处理ioctl 0x3000001,没有大小/方向提示。
==765561==这可能会导致出现虚假值错误。
==765561==请参阅自述文件\u缺少\u系统调用\u或\u IOCTL以获取编写正确包装的指导。
==765561==警告:注意到但未处理ioctl 0x27,没有大小/方向提示。
==765561==这可能会导致出现虚假值错误。
==765561==请参阅自述文件\u缺少\u系统调用\u或\u IOCTL以获取编写正确包装的指导。
==765561==警告:注意到但未处理ioctl 0x25,没有大小/方向提示。
==765561==这可能会导致出现虚假值错误。
==765561==请参阅自述文件\u缺少\u系统调用\u或\u IOCTL以获取编写正确包装的指导。
==765561==警告:注意到但未处理ioctl 0x37,没有大小/方向提示。
==765561==这可能会导致出现虚假值错误。
==765561==请参阅自述文件\u缺少\u系统调用\u或\u IOCTL以获取编写正确包装的指导。
==765561==警告:注意到但未处理ioctl 0x17,没有大小/方向提示。
==765561==这可能会导致出现虚假值错误。
==765561==请参阅自述文件\u缺少\u系统调用\u或\u IOCTL以获取编写正确包装的指导。
==765561==警告:设置地址范围perms:大范围[0x200000000,0x300200000](无访问)
==765561==警告:设置地址范围perms:大范围[0x681f000,0x2681e000](无访问)
==765561==警告:注意到但未处理ioctl 0x19,没有大小/方向提示。
==765561==这可能会导致出现虚假值错误。
==765561==请参阅自述文件\u缺少\u系统调用\u或\u IOCTL以获取编写正确包装的指导。
==765561==警告:设置地址范围perms:大范围[0x100006000000,0x10106000000)(无访问)
==765561==警告:注意到但未处理ioctl 0x49,没有大小/方向提示。
==765561==这可能会导致出现虚假值错误。
==765561==请参阅自述文件\u缺少\u系统调用\u或\u IOCTL以获取编写正确包装的指导。
==765561==警告:注意到但未处理ioctl 0x21,没有大小/方向提示。
==765561==这可能会导致出现虚假值错误。
==765561==请参阅自述文件\u缺少\u系统调用\u或\u IOCTL以获取编写正确包装的指导。
==765561==警告:注意到但未处理ioctl 0x1b,没有大小/方向提示。
==765561==这可能会导致出现虚假值错误。
==765561==请参阅自述文件\u缺少\u系统调用\u或\u IOCTL以获取编写正确包装的指导。
==765561==警告:注意到但未处理ioctl 0x44,没有大小/方向提示。
==765561==这可能会导致出现虚假值错误。
==765561==请参阅自述文件\u缺少\u系统调用\u或\u IOCTL以获取编写正确包装的指导。
==765561== 
==765561==堆摘要:
==765561==在出口处使用:8647块中的6678624字节
==765561==总堆使用率:11448个allocs,2801个frees,40718174个字节分配
==765561== 
==765561==泄漏汇总:
==765561==肯定丢失:0个块中有0个字节
==765561==间接丢失:0个块中有0个字节
==765561==可能丢失:187个块中22216字节
==765561==仍可访问:8460块中的6656408字节
==765561==抑制:0个块中有0个字节
==765561==使用--leak check=full重新运行以查看泄漏内存的详细信息
==765561== 
==765561==对于检测到的和抑制的错误列表,请使用:-s重新运行
==765561==错误摘要:来自0个上下文的0个错误(已抑制:来自0的0)
提到的自述对我帮助不大


添加注释:CUDA附带一个名为
CUDA memcheck
的memchecker,它不会在上面的程序中报告内存泄漏,但是它似乎不是valgrind的替代品,因为它不会在简单的cpu程序中检测到实际内存泄漏:

#include <thrust/device_vector.h>

int main(){
//  thrust::device_vector<int> D(5);
//  assert( D.size() == 5 );
    
//  cudaDeviceSynchronize();
    std::allocator<int> alloc;
    int* p = alloc.allocate(10);
    p[0] = 2;
    return p[0];
}
#包括
int main(){
//推力:装置_矢量D(5);
//断言(D.size()=5);
//cudaDeviceSynchronize();
分配程序alloc;
int*p=分配分配(10);
p[0]=2;
返回p[0];
}

cuda memcheck
泄漏检查功能属于设备代码,而不是主机代码。因此,它不识别主机代码泄漏并不奇怪。它肯定不是valgrind的替代品。valgrind对主机代码起作用。
cuda memcheck
对设备代码起作用。因此,我并不认为这是唯一的区别你能找出这些IOCTL是什么以及它们是否需要特殊处理吗?如果你想为这些IOCTL添加Valgrind支持,你需要知道IOCTL是做什么的。如果你不知道它们做什么,那么你能做的最好的事情就是把它们当作无操作来处理,并希望这是足够的。这些都不是错误的se肯定。Valgrind并不是说有错误,只是说它无法识别这些IOCTL。这与
nvcc
无关,与推力关系不大。它与CUDA运行时API(和/或CUDA驱动程序API)有关库,它直接与主机操作系统以及GPU驱动程序交互