为什么cudaMalloc()参数是二级指针
类似于这个例子
#include <iostream> using namespace std; void sw(int a,int b) { int tmp=a; a=b; b=tmp; } void sw1(int* a,int* b) { int tmp; tmp=*a; *a=*b; *b=tmp; } int main(void) { int a,b; a=1; b=2; sw(a,b); cout<<a<<b<<endl; sw1(&a,&b); cout<<a<<b<<endl; return 0; }
直接传值,函数对形参值的修改无法传出,因为形参的是在栈上创建的,函数结束后生命周期就结束了,所以想将修改的值传出来,就要传入要修改值的指针
同样,如果我想将device上分配的内存地址通过形参传出来,传入参数的形式就是指针的指针,也就是二级指针。
为什么一级指针不行呢?因为指针的数据类型是整形,如果我在device上分配的空间是float,传入的参数肯定是float,如果使用一级指针float*,那么我只能修改指针中的数据float,float跟我们想传出来的地址的数据类型(int)不一样,所以传入参数必须是二级指针。
当传入的是二级指针时,比如float**,我想将gpu上分配的float类型的地址传出来,我可以将它赋值给float*,float*的数据类型就是指针类型了
无情的摸鱼机器