cuda memcheck无法检测R包中的内存泄漏

cuda memcheck无法检测R包中的内存泄漏,r,memory-leaks,cuda,valgrind,R,Memory Leaks,Cuda,Valgrind,我正在构建CUDAAcceleratedR包,我想用CUDAMemCheck进行调试。因此,在(GitHub分支的consived\u memory\u leak中),我通过注释掉对cudaFree的必要调用,在someCUDAcode.c中创建了一个内存泄漏。然后,我看看cuda memcheck是否能找到漏洞 $ cuda-memcheck --leak-check full Rscript -e 'library(rcppcuda); hello()' ========= CUDA-ME

我正在构建CUDAAcceleratedR包,我想用
CUDAMemCheck
进行调试。因此,在(GitHub分支的
consived\u memory\u leak中),我通过注释掉对
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-d“valgrind--tool=memcheck--leak check=full”--香草
是使用
valgrind
的正确方法。所以我用
库(rcppcuda)创建了一个
test.R
文件;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
R-d“cuda memcheck--完全泄漏检查”--香草
最后

$ 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—香草图书馆(rcppcuda);你好()
类“MyClass”的对象
插槽“x”:
[1]  1  2  3  4  5  6  7  8  9 10
槽“y”:
[1]  1  2  3  4  5  6  7  8  9 10
[1] “对象已更改。”
类“MyClass”的对象
插槽“x”:
[1] 500   2   3   4   5   6   7   8   9  10
槽“y”:
[1]    1 1000    3    4    5    6    7    8    9   10
> 
======泄漏摘要:0个分配中泄漏了0个字节
======错误摘要:0个错误
$

是否可以使
cuda memcheck
适用于R软件包?我知道我以为自己已经找到了答案,但当时我并没有验证
cuda memcheck
给我的答案。

这不是有效的cuda代码:

extern "C" void someCUDAcode() {
  int a;
  CUDA_CALL(cudaMalloc((void**) &a, sizeof(int)));
  mykernel<<<1, 1>>>(1);
//  CUDA_CALL(cudaFree(&a));
}
  • 当我们想要释放以前分配的指针时,我们只传递指针,而不是它的地址:

    CUDA_CALL(cudaFree(a));
    
  • 最后,cuda memcheck的命令行帮助(
    cuda memcheck--help
    )指出:

    --泄漏检查
    [默认值:否]

    打印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
    $
    
    $cat t786.cu
    #包括
    #定义CUDA_调用(x){if((x)!=cudaSuccess){\
    printf(“在%s处的CUDA错误:%d\n”,\uuuuu文件\uuuuuu,\uuuuu行\uuuuu)\
    printf(“%s\n”,cudaGetErrorString(cudaGetLastError());}
    __全局无效mykernel(int a){
    int id=threadIdx.x;
    int b=a;
    b++;
    id++;
    }
    int main(){
    int*a;
    cudamu CALL(cudamaloc((void**)和a,sizeof(int));
    mykernel(1);
    //CUDA_CALL(cudaFree(a));
    cudaDeviceReset();
    }
    $nvcc-o t786 t786.cu
    $cuda memcheck—泄漏检查已满。/t786
    ==========CUDA-MEMCHECK
    =========在0x402500000处泄漏了4个字节
    =========在Cudamaloc时间将主机回溯保存到驱动程序入口点
    =======主机帧:/lib64/libcuda.so.1(cummalloc_v2+0x17f)[0x13629f]
    =======主机帧:./t786[0x2DB3]
    =======主机帧:./t786[0x610b]
    =======主机帧:./t786[0x3deaf]
    =======主机帧:./t786[0x2646]
    =======主机帧:/lib64/libc.so.6(libc\u start\u main+0xf5)[0x21d65]
    =======主机帧:./t786[0x2539]
    =========
    ======泄漏摘要:1次分配中泄漏了4个字节
    ======错误摘要:0个错误
    $
    
    这是无效的CUDA代码:

    extern "C" void someCUDAcode() {
      int a;
      CUDA_CALL(cudaMalloc((void**) &a, sizeof(int)));
      mykernel<<<1, 1>>>(1);
    //  CUDA_CALL(cudaFree(&a));
    }
    
  • 当我们想要释放以前分配的指针时,我们只传递指针,而不是它的地址:

    CUDA_CALL(cudaFree(a));
    
  • 最后,cuda memcheck的命令行帮助(
    cuda memcheck--help
    )指出:

    --泄漏检查
    [默认值:否]

    打印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
    $
    
    $cat t786.cu
    #包括
    #定义CUDA_调用(x){if((x)!=cudaSuccess){\
    printf(“在%s处的CUDA错误:%d\n”,\uuuuu文件\uuuuuu,\uuuuu行\uuuuu)\
    printf(“%s\n”,cudaGetErrorString(cudaGetLastError());}
    __全局无效mykernel(int a){
    int id=threadIdx.x;
    int b=a;
    b++;
    id++;
    }
    int main(){
    int*a;
    cudamu CALL(cudamaloc((void**)和a,sizeof(int));
    mykernel(1);
    //CUDA_CALL(cudaFree(a));
    cudaDeviceReset();
    }
    $nvcc-o t786 t786.cu
    $cuda memcheck—泄漏检查已满。/t786
    ==========CUDA-MEMCHECK
    =========在0x402500000处泄漏了4个字节
    =========在Cudamaloc时间将主机回溯保存到驱动程序入口点
    =======主机帧:/lib64/libcuda.so.1(cummalloc_v2+0x17f)[0x13629f]
    =======主机帧:./t786[0x2DB3]
    =======主机帧:./t786[0x610b]
    =======主机帧:./t786[0x3deaf]
    =======主机帧:./t786[0x2646]
    =======主机帧:/lib64/libc.so.6(libc\u start\u main+0xf5)[0x21d65]
    =======主机帧:./t786[0x2539]
    =========
    ======泄漏摘要:1次分配中泄漏了4个字节
    ======错误摘要:0个错误
    $