为什么cudaFree不需要数据结构的地址?

mah*_*ood 0 c memory-management cuda

我对工作方式有疑问cudaFree。在下面的代码中,为了在设备上分配数组,cudaMalloc需要数组的地址。这是通过使用&array_d.

int *array_d;
cudaMalloc((void**)&array_d, sizeof(int) * 100);
cudaFree(array_d);
Run Code Online (Sandbox Code Playgroud)

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

woh*_*tad 5

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

该地址实际上由 确定cudaMalloc,因此在调用它时需要另一级间接。
这就是为什么你传递的&array_d是指针本身的地址(而不是指向的内存块的地址),并cudaMalloc用新分配的块的地址填充它。

cudaFree确实需要这个地址,才能知道要释放哪个内存块。
但它不会修改这个地址。因此,传递array_d自身就足够了(因为它保存着这个地址)。

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

+----------+      +----------+  
| &array_d |  ->  | array_d  |  ->  memory block on GPU
+----------+      +----------+  
Run Code Online (Sandbox Code Playgroud)

请注意,这是一个保存驻留在GPU 内存array_d中的内存块地址的指针。但指针本身存储在主机内存中(在您的情况下位于堆栈上)。 是该指针的地址(即主机内存中的地址)。&array_d