首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >cuda-memcheck未能检测到R包中的内存泄漏

cuda-memcheck未能检测到R包中的内存泄漏
EN

Stack Overflow用户
提问于 2015-06-10 22:26:32
回答 1查看 801关注 0票数 0

我正在构建CUDA加速的R包,我想用cuda-memcheck进行调试。因此,在这个最小的例子 (在deliberate_memory_leak GitHub分支中)中,我通过注释掉对cudaFree的必要调用,在someCUDAcode.c中创建了一个内存泄漏。然后,我看看cuda-memcheck是否能找到漏洞。

代码语言:javascript
复制
$ 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()文件,并尝试了这一点。

代码语言:javascript
复制
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

最后,

代码语言:javascript
复制
$ 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给我的答案。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-10 22:52:38

这是无效的数据自动化系统代码:

代码语言:javascript
复制
extern "C" void someCUDAcode() {
  int a;
  CUDA_CALL(cudaMalloc((void**) &a, sizeof(int)));
  mykernel<<<1, 1>>>(1);
//  CUDA_CALL(cudaFree(&a));
}
  1. 当我们想要执行cudaMalloc操作时,我们使用C中的指针,而不是普通的变量,如下所示: int *a;CUDA_CALL(cudaMalloc((void**) &a,sizeof(Int);
  2. 当我们想释放以前分配的指针时,我们只传递指针,而不是它的地址: CUDA_CALL(cudaFree(a));
  3. 最后,cuda (cuda-memcheck --help)的命令行帮助指示: -泄漏-检查<full|no>默认值:否 打印用于CUDA分配的泄漏信息。 注意:程序必须以cudaDeviceReset()结尾才能工作。

( 文档中也有类似的注释。)

我认为第3项是你代码中缺少的关键成分。对代码的以下修改为我生成了一个适当的报告:

代码语言:javascript
复制
$ 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
$
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30768379

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档