为什么在cuda malloc中使用双指针?

时间:2017-03-18 06:34:33

标签: c cuda nvidia

首先,我不明白如果我们必须使用双指针,那么为什么要创建一个普通的指针,然后使用void **投射呢?为什么不首先简单地创建一个双指针?

其次为什么我们必须传递一个指针来接受cudamalloc返回的指针?为什么我们不能直接使用cudamalloc返回的指针?

我完全理解malloc是如何工作的。我也明白,与malloc不同,cuda返回错误代码,因此指针作为参考传递。但我没有得到任何东西吗?

请你从头开始解释关于cudamalloc的一切吗?

#include <iostream> 
#include "book.h" 

global void add( int a, int b, int c ) 
{ *c = a + b; } 

int main( void ) 
{
int c; 
int *dev_c; 

cudaMalloc( (void**)&dev_c, sizeof(int)); 

add<<<1,1>>>( 2, 7, dev_c ); 

cudaMemcpy( &c, dev_c, sizeof(int), 
cudaMemcpyDeviceToHost );

printf( "2 + 7 = %d\n", c ); 

cudaFree( dev_c ); 

return 0;
 } 

1 个答案:

答案 0 :(得分:1)

指针传递的示例:

void my_allocate_function(void **ptr_to_ptr, size_t size)
{
    *ptr_to_ptr = malloc(size);
}

int main(void)
{
    int *ptr;
    my_allocate_function(&ptr, sizeof *ptr);  // Allocate space for a single int
}

如果你将ptr(在main函数中)声明为“双指针”(即int **ptr)并在没有address-of运算符的情况下传递它,那么{{1将取消引用未初始化的指针并具有未定义的行为

如果my_allocate_function未通过引用获取指针,则它将修改局部变量,并且当函数返回并且对它们的所有更改都丢失时,局部变量超出范围。

有点“图形化”地看待它:

+------------+     +--------------------------+
| ptr_to_ptr | --> | ptr in the main function | --> ...
+------------+     +--------------------------+

通过解除引用my_allocate_function,我们可以访问ptr_to_ptr指向的位置(ptr_to_ptr函数中的变量ptr),并修改存储的内容那个位置。