我正在构建CUDA加速的R包,我想用cuda-memcheck进行调试。因此,在这个最小的例子 (在deliberate_memory_leak GitHub分支中)中,我通过注释掉对cudaFree的必要调用,在someCUDAcode.c中创建了一个内存泄漏。然后,我看看cuda-memcheck是否能找到漏洞。
$ cuda-memcheck --leak-check full Rscript -e 'library(rcppcuda); hello()'
========= CUDA-MEMCHECK
An object of class "MyClass"
Slot "x":
[1] 1 2 3 4 5 6 7 8 9 10
Slot "y":
[1] 1 2 3 4 5 6 7 8 9 10
[1] "Object changed."
An object of class "MyClass"
Slot "x":
[1] 500 2 3 4 5 6 7 8 9 10
Slot "y":
[1] 1 1000 3 4 5 6 7 8 9 10
========= LEAK SUMMARY: 0 bytes leaked in 0 allocations
========= ERROR SUMMARY: 0 errors
$不走运。然后,我在R扩展手册中看到,R -d "valgrind --tool=memcheck --leak-check=full" --vanilla < mypkg-Ex.R是使用valgrind的正确方式。因此,我用test.R创建了一个library(rcppcuda); hello()文件,并尝试了这一点。
R -d "cuda-memcheck --leak-check full" --vanilla < test.R
*** Further command line arguments ('--vanilla ') disregarded
*** (maybe use 'run --vanilla ' from *inside* cuda-memcheck --leak-check full)
========= CUDA-MEMCHECK
Fatal error: you must specify '--save', '--no-save' or '--vanilla'
========= LEAK SUMMARY: 0 bytes leaked in 0 allocations
========= ERROR SUMMARY: 0 errors最后,
$ cuda-memcheck --leak-check full R --vanilla < test.R
========= CUDA-MEMCHECK
R version 3.2.0 (2015-04-16) -- "Full of Ingredients"
Copyright (C) 2015 The R Foundation for Statistical Computing
Platform: x86_64-unknown-linux-gnu (64-bit)
R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.
Natural language support but running in an English locale
R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.
Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.
> library(rcppcuda); hello()
An object of class "MyClass"
Slot "x":
[1] 1 2 3 4 5 6 7 8 9 10
Slot "y":
[1] 1 2 3 4 5 6 7 8 9 10
[1] "Object changed."
An object of class "MyClass"
Slot "x":
[1] 500 2 3 4 5 6 7 8 9 10
Slot "y":
[1] 1 1000 3 4 5 6 7 8 9 10
>
========= LEAK SUMMARY: 0 bytes leaked in 0 allocations
========= ERROR SUMMARY: 0 errors
$是否有可能使cuda-memcheck为R包工作?我知道我以为我已经想好了这里,但那时,我并没有验证cuda-memcheck给我的答案。
发布于 2015-06-10 22:52:38
这是无效的数据自动化系统代码:
extern "C" void someCUDAcode() {
int a;
CUDA_CALL(cudaMalloc((void**) &a, sizeof(int)));
mykernel<<<1, 1>>>(1);
// CUDA_CALL(cudaFree(&a));
}cudaMalloc操作时,我们使用C中的指针,而不是普通的变量,如下所示:
int *a;CUDA_CALL(cudaMalloc((void**) &a,sizeof(Int);cuda-memcheck --help)的命令行帮助指示:
-泄漏-检查<full|no>默认值:否
打印用于CUDA分配的泄漏信息。
注意:程序必须以cudaDeviceReset()结尾才能工作。( 文档中也有类似的注释。)
我认为第3项是你代码中缺少的关键成分。对代码的以下修改为我生成了一个适当的报告:
$ cat t786.cu
#include <stdio.h>
#define CUDA_CALL(x) {if((x) != cudaSuccess){ \
printf("CUDA error at %s:%d\n",__FILE__,__LINE__); \
printf(" %s\n", cudaGetErrorString(cudaGetLastError()));}}
__global__ void mykernel(int a){
int id = threadIdx.x;
int b = a;
b++;
id++;
}
int main() {
int *a;
CUDA_CALL(cudaMalloc((void**) &a, sizeof(int)));
mykernel<<<1, 1>>>(1);
// CUDA_CALL(cudaFree(a));
cudaDeviceReset();
}
$ nvcc -o t786 t786.cu
$ cuda-memcheck --leak-check full ./t786
========= CUDA-MEMCHECK
========= Leaked 4 bytes at 0x402500000
========= Saved host backtrace up to driver entry point at cudaMalloc time
========= Host Frame:/lib64/libcuda.so.1 (cuMemAlloc_v2 + 0x17f) [0x13629f]
========= Host Frame:./t786 [0x2dbb3]
========= Host Frame:./t786 [0x610b]
========= Host Frame:./t786 [0x3deaf]
========= Host Frame:./t786 [0x2646]
========= Host Frame:/lib64/libc.so.6 (__libc_start_main + 0xf5) [0x21d65]
========= Host Frame:./t786 [0x2539]
=========
========= LEAK SUMMARY: 4 bytes leaked in 1 allocations
========= ERROR SUMMARY: 0 errors
$https://stackoverflow.com/questions/30768379
复制相似问题