首先,我不明白如果我们必须使用双指针,那么为什么要创建一个普通的指针,然后使用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;
}
答案 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
),并修改存储的内容那个位置。