我在第二个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中的任何一个,则代码运行良好。
谢谢!
答案 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标准,因此不能清晰地编译。