2

(void **)&x 和 (void *)x 有什么区别?我会给你一些代码,请帮助我。

float *xd;
int size=width*width*size(float);
cudaMalloc((void **)&x,size); 1
cudaMalloc((void *)x,size);   2
cudaMalloc(&x,size);          3
cudaMalloc(*x,size);          4

cudaFree(xd);

我只是想知道区别。

cudaMalloc() 函数的第一个参数是分配后必须指向分配对象的指针变量的地址。指针变量的地址应该转换为 (void **) 因为函数需要一个通用指针值;内存分配函数是一个通用函数,不限于任何特定类型的对象。该地址允许 cudaMalloc() 函数将分配对象的地址写入指针变量。3 cudaMalloc() 函数的第二个参数给出了要分配的对象的大小,以字节为单位。这第二个参数的用法与 C malloc() 函数的 size 参数一致。

4

2 回答 2

6

它们几乎完全不同。

这:

(void **)&x

获取 的地址x并将其转换为void**(指向 的指针的指针void)。

这:

(void *)x

获取 的值并将x其转换为void*

它们都是指针,但它们指向内存中完全不同的位置(除非x碰巧包含它自己的地址),并且它们属于不同的类型。

如果您想向我们展示代码,向我们展示实际编译的代码会很有帮助。复制并粘贴您的实际源代码;不要重新输入。您还没有向我们展示x(is xda typo for x?) 的声明,并且size(float)是语法错误(您的意思是sizeof(float)?)。

于 2012-08-13T03:30:36.043 回答
3

为了让你更好地理解为什么cudaMalloc经常写作(void**)&var,请考虑以下几点:

cudaMalloc在 GPU 上分配内存。它所指的内存类型是void*因为它并不真正关心数据类型。

一旦我们在cudaMalloc刚刚分配的内存中获得了该内存的地址,我们需要以某种方式将其返回给调用者。但是所有 CUDA API 函数都返回错误代码(或成功代码),并且任何其他返回的数据都必须通过参数引用传回。

C 语言没有按引用传递,因此您实际上需要将指针传递给您希望函数存储结果的变量。由于要存储指针值,因此需要传递一个指向指针的指针。因此void**键入。

如果想以类似的方式封装 malloc,可以这样写:

void myMalloc(void** ret, size_t size) {
    void* mem = malloc(size);
    *ret = mem;
}

现在,如果您传递(void**)&varmyMalloc,该函数将能够覆盖var--- 的值,因为ret它将指向var变量。

这是否使它更清楚?

于 2012-08-13T11:00:42.603 回答