【问题标题】:CUDA program throwing memory leak errorCUDA程序抛出内存泄漏错误
【发布时间】:2011-08-15 15:48:33
【问题描述】:

我不明白为什么下面的简单代码在 c[0] = d 处失败

void test(char **a){
char **c;
cudaMemcpy(c,a, sizeof(char*), cudaMemcpyDeviceToHost);
char temp[2];
for(int i  = 0 ; i< 2; i++){
        temp[i ] = temp[i] & 0 ;
}
char *d;
cudaMalloc((void**)&d, 2*sizeof(char));
cudaMemcpy(d, temp, 2 * sizeof(char), cudaMemcpyHostToDevice);
c[0] = d;


}
void main(){

     char **a ;
    cudaMalloc((void**)&a, sizeof( char*));
    test(a);
}

【问题讨论】:

  • 你希望上面的代码做什么?它似乎没有执行任何有用的功能,它分配内存而不随后释放它。
  • @Paul:我只希望 a 的第一个元素指向全局内存中的 temp 副本。
  • @Paul:请告诉我为什么会引发编译时错误

标签: cuda parallel-processing nvidia


【解决方案1】:

您忘记为char **c 分配内存。因此,在导致错误的行中,c 是“死指针”,即等于 NULL 或引用不属于您的程序的内存部分。换句话说,c 指向一个空的、未分配的 C 字符串数组。处理c[0] 元素(假设是数组中的第一个字符串,它不存在)是非法的,并且会给你一个分段错误,因为你试图将一些东西(d 的值)写入你想要的位置不拥有。

解决办法是先分配内存再写入c[0]

c = new char *; //or "c = new char [5]"  if you want it to hold more strings
c[0] = d;

还记得您如何调用 CudaMalloc() 在 GPU 上为 ad 变量分配内存吗?您只需对 c 执行相同操作,但在主 RAM 中(即在主机上)

希望对你有帮助。

【讨论】:

    【解决方案2】:

    首先,从代码中根本不清楚您要做什么,因此将其添加到 Q 可能会有所帮助。其次,你从编译器得到的错误信息到底是什么?

    至于失败,可能是编译器不喜欢你尝试使用[] 访问c,因为它没有被声明为数组。我知道原则上它应该可以工作,但请尝试使用*c = d。这有帮助吗?

    附:就我个人而言,我总是使用命名法 devFoo 来表示任何指向设备内存的指针,所以我不会感到困惑,在较大的项目中,很容易忘记 abc 是指向主机还是设备内存。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-15
      • 2012-01-30
      • 1970-01-01
      • 2014-03-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多