在学习使用cuda的过程中,使用显存分配函数cudaMalloc函数时遇到一些问题,在这里总结下该函数第一个参数为什么有(void**)。
先看下如下代码:
void memory(int* p) {
p = (int*)malloc(10);
}
int main() {
int* a = 0x0001;
memory(a);
return 0;
}
该代码main函数执行完,指针a和指针p并没有指向相同的地址。在执行p = (int*)malloc(10);前,指针a和p都指向了0x0001。当执行完该语句,指针a依旧指向0x0001,但指针p指向了新分配的那段内存的首地址。原因就是,两个指针自身的地址不同,在实参往形参传递时,会复制一个副本,最终传过去的只是副本。
因此在CUDA中,用如下方式:
void memory(void** p) {
*p = malloc(10);
}
int main() {
int* a = 0x0001;
memory((void**) &a);
return 0;
}
在上面这段代码中,实参传递给形参的是指针a的地址,p指向a的地址,p=&a,*p=a,给*p分配内存相当于让a指向新内存的首地址。
参考文献