CUDA统一内存预取显存异常下降及CPU访问后未释放问题咨询
CUDA Unified Memory 测试问题解答
问题1:首次预取小容量UM内存时显存下降幅度远大于实际分配大小的原因
你观察到的约128MB显存下降(计算可得:16804216832 - 16669999104 = 128MB)是CUDA驱动的UM内存池预分配策略导致的:
- Tesla P100属于Pascal架构,CUDA驱动为了降低频繁小容量UM内存分配的开销,会在UM内存第一次被映射到GPU时,预分配一块较大的连续显存作为UM专属的显存池,你申请的2KB数组只是从这个128MB的预分配池中分配的一小块,不会触发额外的显存占用。
- 后续再分配其他小容量UM内存并预取到GPU时,显存不会再出现大幅下降,只会从已有的预分配池中划取空间,只有当预分配池被占满后才会再次扩容。
问题2:UM内存预取到CPU后GPU显存未释放的原因
这是离散GPU UM的默认缓存策略导致的,和你理解的"访问即驱逐"逻辑有差异:
cudaMemPrefetchAsync的作用是将内存的最新副本同步到目标设备,并不会主动删除源设备上的副本;cudaMemAdviseSetPreferredLocation仅设置内存的优先存放位置,也不会强制回收另一端的副本。- 在GPU显存剩余充足的场景下,驱动会保留已迁移到CPU的UM内存的GPU侧副本作为缓存,若后续需要再次在GPU访问该内存,可直接使用缓存副本避免重复PCIe传输,只有当GPU显存出现不足时,驱动才会主动驱逐这些长期未访问的UM页面,释放对应的显存空间。
- 你可以尝试在预取到CPU后,再调用
cudaMalloc分配一块接近剩余显存大小的空间,就能观察到原UM内存占用的GPU显存被回收的现象。
内容的提问来源于stack exchange,提问作者Dhruv Deshmukh
相关产品推荐
相关产品推荐

