第二次cudaMalloc之后的分段错误

时间:2019-01-16 12:24:13

标签: c cuda

我在第二个cudaMalloc之后获得了分段错误。

#include <cuda.h>
#include <cuda_runtime.h>

int main(){

  int n=16;

  float2* a;
  cudaMalloc((void **) a, n*sizeof(float2));
  float2* b;
  cudaMalloc((void **) b, n*sizeof(float2));

  return 0;
}

但是,如果我注释掉2个cudaMalloc中的任何一个,则代码运行良好。

谢谢!

2 个答案:

答案 0 :(得分:6)

您必须像这样将指针传递给指针:

float2* a;
cudaMalloc(&a, n*sizeof(float2));
float2* b;
cudaMalloc(&b, n*sizeof(float2));

否则,您只需将悬挂的指针转换为“指向指针的指针”,并且库会取消引用导致段错误的垃圾地址。

答案 1 :(得分:-1)

由于CUDA API损坏,正确的答案是在垃圾桶周围写一个包装器:

void* saneMalloc (size_t n)
{
  void* tmp;
  if (cudaMalloc(&tmp, n) == cudaSuccess)
    return tmp;
  return NULL;
}

...

float* a = saneMalloc(n);

您必须这样做,因为C中唯一的通用指针类型是void*。您可以将任何类型的指针转​​换为void*,但这对void**并不适用。因此,如果您有float,则不能float**传递给期望void**的函数。这是不兼容的指针类型。

具体来说,将参数传递给函数时,将根据简单赋值规则(C17 6.5.16.1)复制它们。将float**传递给期望void**的函数是违反简单分配规则的约束。该代码不符合C标准,因此不能清晰地编译。