Is there a way to use the CUDA thrust library with the Valgrind memory leak checker?
The reason I ask is because this simple program:
#include <thrust/device_vector.h>
int main(){
thrust::device_vector<int> D(5);
assert( D.size() == 5 );
}
compiled with:
$ /usr/local/cuda-11.1/bin/nvcc device_vector.cu -o device_vector.cu.x
Makes Valgrind believe that there are multiple possible memory leaks.
I know they must be false positives and that valgrind is not made to detect GPU memory leaks but I wonder if there is a flag or a standard way to make both tools work together (e.g. to detect CPU memory leaks).
If there is a standard set of Valgrind exceptions around I will gladly use them, but I wanted to ask before playing wack-a-mole.
$ valgrind ./device_vector.cu.x
==765561== Memcheck, a memory error detector
==765561== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==765561== Using Valgrind-3.15.0 and LibVEX; rerun with -h for copyright info
==765561== Command: ./device_vector.cu.x
==765561==
==765561== Warning: noted but unhandled ioctl 0x30000001 with no size/direction hints.
==765561== This could cause spurious value errors to appear.
==765561== See README_MISSING_SYSCALL_OR_IOCTL for guidance on writing a proper wrapper.
==765561== Warning: noted but unhandled ioctl 0x27 with no size/direction hints.
==765561== This could cause spurious value errors to appear.
==765561== See README_MISSING_SYSCALL_OR_IOCTL for guidance on writing a proper wrapper.
==765561== Warning: noted but unhandled ioctl 0x25 with no size/direction hints.
==765561== This could cause spurious value errors to appear.
==765561== See README_MISSING_SYSCALL_OR_IOCTL for guidance on writing a proper wrapper.
==765561== Warning: noted but unhandled ioctl 0x37 with no size/direction hints.
==765561== This could cause spurious value errors to appear.
==765561== See README_MISSING_SYSCALL_OR_IOCTL for guidance on writing a proper wrapper.
==765561== Warning: noted but unhandled ioctl 0x17 with no size/direction hints.
==765561== This could cause spurious value errors to appear.
==765561== See README_MISSING_SYSCALL_OR_IOCTL for guidance on writing a proper wrapper.
==765561== Warning: set address range perms: large range [0x200000000, 0x300200000) (noaccess)
==765561== Warning: set address range perms: large range [0x681f000, 0x2681e000) (noaccess)
==765561== Warning: noted but unhandled ioctl 0x19 with no size/direction hints.
==765561== This could cause spurious value errors to appear.
==765561== See README_MISSING_SYSCALL_OR_IOCTL for guidance on writing a proper wrapper.
==765561== Warning: set address range perms: large range [0x10006000000, 0x10106000000) (noaccess)
==765561== Warning: noted but unhandled ioctl 0x49 with no size/direction hints.
==765561== This could cause spurious value errors to appear.
==765561== See README_MISSING_SYSCALL_OR_IOCTL for guidance on writing a proper wrapper.
==765561== Warning: noted but unhandled ioctl 0x21 with no size/direction hints.
==765561== This could cause spurious value errors to appear.
==765561== See README_MISSING_SYSCALL_OR_IOCTL for guidance on writing a proper wrapper.
==765561== Warning: noted but unhandled ioctl 0x1b with no size/direction hints.
==765561== This could cause spurious value errors to appear.
==765561== See README_MISSING_SYSCALL_OR_IOCTL for guidance on writing a proper wrapper.
==765561== Warning: noted but unhandled ioctl 0x44 with no size/direction hints.
==765561== This could cause spurious value errors to appear.
==765561== See README_MISSING_SYSCALL_OR_IOCTL for guidance on writing a proper wrapper.
==765561==
==765561== HEAP SUMMARY:
==765561== in use at exit: 6,678,624 bytes in 8,647 blocks
==765561== total heap usage: 11,448 allocs, 2,801 frees, 40,718,174 bytes allocated
==765561==
==765561== LEAK SUMMARY:
==765561== definitely lost: 0 bytes in 0 blocks
==765561== indirectly lost: 0 bytes in 0 blocks
==765561== possibly lost: 22,216 bytes in 187 blocks
==765561== still reachable: 6,656,408 bytes in 8,460 blocks
==765561== suppressed: 0 bytes in 0 blocks
==765561== Rerun with --leak-check=full to see details of leaked memory
==765561==
==765561== For lists of detected and suppressed errors, rerun with: -s
==765561== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
The mentioned readme README_MISSING_SYSCALL_OR_IOCTL was not very helpful to me.
NOTE ADDED: CUDA comes with a memchecker called cuda-memcheck
which doesn't report memory leaks in the program above, however it doesn't seem to be a replacement for valgrind, since it doesn't detect the actual memory leak in a simple cpu program:
#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];
}
question from:
https://stackoverflow.com/questions/65928467/how-to-use-thrust-and-valgrind-together-to-detect-memory-leaks