我猜cudaMalloc
函数的签名可以通过一个例子更好地解释。它基本上是通过指向缓冲区的指针(指向指针)来分配缓冲区,就像以下方法:
int cudaMalloc(void **memory, size_t size)
{
int errorCode = 0;
*memory = new char[size];
return errorCode;
}
正如你所看到的,该方法接受一个指向指针的memory
,并将新分配的内存保存在其中。然后它返回错误代码(在此情况下为整数,但实际上是枚举类型)。
cudaMalloc
函数也可以设计如下:
void * cudaMalloc(size_t size, int * errorCode = nullptr)
{
if(errorCode)
errorCode = 0;
char *memory = new char[size];
return memory;
}
在第二种情况下,错误代码通过指针隐式设置为null(对于那些不关心错误代码的人)。然后返回分配的内存。
第一种方法可以直接使用当前的cudaMalloc。
float *p;
int errorCode;
errorCode = cudaMalloc((void**)&p, sizeof(float));
第二个可以按以下方式使用:
float *p;
int errorCode;
p = (float *) cudaMalloc(sizeof(float), &errorCode);
这两种方法在功能上是等效的,尽管它们有不同的签名,但cuda团队决定采用第一种方法,返回错误代码并通过指针分配内存,而大多数人认为第二种方法可能是更好的选择。