【CUDA】Host 与 Device 内存管理:cudaMalloc / cudaMemcpy / cudaFree + Host-Device 数据传输的开销意识
一、先建立一个核心认知:Host内存 和 Device内存 是两块彻底分开的物理内存CPU(Host)和GPU(Device)各自有自己独立的物理内存 (Host用的是主板上的内存条,Device用的是显卡上的显存), 这两块内存地址空间是彼此独立的: Host上用malloc(或new)申请的指针,指向的是主存地址, 只能在CPU代码里读写,GPU的kernel函数无法直接访问它 Device上用cudaMalloc申请的指针,指向的是显存地址, 只能在GPU的kernel代码里读写,CPU代码不能直接解引用它 这意味着:要让GPU处理某份数据,必须先把数据从Host内存 "搬"到Device内存里,GPU算完之后,如果CPU要用结果, 又得把结果从Device内存"搬"回Host内存。 这个"搬运"的过程,不是免费的,是有实打实的时间开销的, 这正是本节标题里"传输的开销意识"要强调的重点, 后面会专门展开讲为什么要在意这个开销。 (补充:存在一种叫"统一内存"Unified Memory的机制, 可以让Host和Device共用同一套地址、由系统自动搬运数据, 这是后面阶段四要学的进阶内容,本节先只讲最基础、 最明确的手动管理方式。)二、cudaMalloc:在Device上申请显存2.1 函数写法cudaError_t cudaMalloc(void **devPtr, size_t size);参数拆解: devPtr —— 是一个"指针的指针"(二级指针),