为何cudaFree无需传入数据结构的地址?
关于cudaMalloc和cudaFree的参数差异及工作机制
1. 为什么cudaMalloc需要传&array_d(二级指针)
cudaMalloc的核心作用是在设备端分配内存,并将这段内存的起始地址写入主机端的指针变量中。
主机端的array_d是int*类型变量,本身存储的是一个地址值。如果直接传array_d(一级指针)给cudaMalloc,函数拿到的只是这个地址值的副本,无法修改原变量array_d的内容。因此必须传&array_d(指向指针变量的二级指针),让cudaMalloc能把分配好的设备内存地址写入array_d,让主机端获取到设备内存的入口地址。
你提供的代码执行后:
int *array_d; cudaMalloc((void**)&array_d, sizeof(int) * 100);
array_d中存储的就是设备上那段100个int大小内存的起始地址。
2. cudaFree如何通过array_d确定要释放的内存
cudaFree传入的array_d正是cudaMalloc返回的设备内存起始地址。CUDA运行时后台维护着一张设备内存分配记录表,记录了每一次cudaMalloc分配的内存块的起始地址、大小、状态等信息。
当调用cudaFree(array_d)时,CUDA运行时会根据传入的起始地址,在记录表中找到对应的内存块,标记为可回收,最终由设备端内存管理器完成实际的内存释放操作。
简单总结:cudaMalloc需要二级指针是为了修改主机端的指针变量,传递设备内存地址;cudaFree用一级指针是为了通过设备内存的起始地址,匹配并释放对应的内存块,二者参数差异完全是由各自的功能需求决定的。
内容的提问来源于stack exchange,提问作者mahmood
相关产品推荐
相关产品推荐

