我想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 的人决定采用第一种方法,返回错误代码并通过指针分配内存,而大多数人说第二种方法会是更好的选择。