我有一个关于cudaFree的工作方式的问题.在下面的代码中,为了在设备上分配数组,cudaMalloc需要数组的地址.这是通过使用&array_d完成的.

int *array_d;
cudaMalloc((void**)&array_d, sizeof(int) * 100);
cudaFree(array_d);

从逻辑上讲,当我们想要释放内存时,我们还必须将数组地址传递给cudaFree.否则,它如何知道必须释放内存的哪一部分呢?

推荐答案

array_d是一个指针,用于保存分配的内存块的地址(在本例中包含int).

This address is actually determined by cudaMalloc, and therefore you need another level of indirection when calling it.
This is why you pass &array_d which is the address of the pointer itself (not the address of the pointed memory block), and cudaMalloc fills it with the address of the newly allocated block.

cudaFree indeed requires this address, to know which memory block to free.
But it does not modify this address. Therefore it is sufficient to pass array_d itself (as it holds this address).

下图说明了3个实体之间的关系:

+----------+      +----------+  
| &array_d |  ->  | array_d  |  ->  memory block on GPU
+----------+      +----------+  

注意,array_d是保存驻留在GPU memory中的存储块的地址的指针.但是指针本身存储在host memory中(在本例中存储在堆栈上). &array_d是该指针的地址(即host memory中的地址).

C++相关问答推荐

char为16位且Short也为16位的c环境合法吗

变量的const视图是否定义良好?

为什么getchar()挂起了,尽管poll()返回了一个好的值?""

堆栈在作用域阻塞后会被释放吗?

无效指针值在函数调用之间莫名其妙地改变

当我运行/调试C程序时,Malloc()似乎正在将&q;r\r...&q;赋值给一个指针,我不确定为什么?

为什么net/if.h在ifaddrs.h之前?

文件权限为0666,但即使以超级用户身份也无法打开

struct -未知大小

对于C中给定数组中的每个查询,如何正确编码以输出给定索引范围(1到N)中所有数字的总和?

FRIDA-服务器成为端口扫描的目标?

如何在C中只对字符串(包含数字、单词等)中的数字进行重复操作?

这个空指针类型的转换是有效代码还是恶意代码?

为什么WcrTomb只支持ASCII?

`预期说明符-限定符-列表在‘(三元运算符中的’token`‘之前

从C中的函数返回静态字符串是不是一种糟糕的做法?

Tcl_GetDoubleFromObj在列表的迭代中是一个缺点

Leet代码运行时错误:代码不会在Leet代码上编译,而是在其他编译器中编译,如netbeans和在线编译器

使用 strtok 多次分割一个字符串会导致意外行为

函数的typedef是标准 C 语法吗?它与函数指针的typedef有何不同?