PyTorch固定内存非阻塞H2D复制同步时机及安全场景咨询
固定内存到CUDA异步复制的安全性问题
根据PyTorch官方教程的说明:
此前我们假设CPU到GPU的异步复制是安全的,这在张量处于可分页内存时通常成立,因为CUDA会自动处理同步以确保读取时数据有效。但在其他情况则不成立:当张量位于固定内存时,调用主机到设备(H2D)传输后修改原副本可能导致GPU接收的数据损坏;类似地,GPU到CPU传输或非CUDA设备间传输时,若无显式同步无法保证GPU读取的数据有效。
通常仅当目标为CUDA设备且原张量为可分页内存时,异步设备复制无需显式同步才安全。
针对你提出的问题:
- 对于固定CPU内存到CUDA设备的异步复制场景,确实只有在复制完成前修改原固定内存才会引发竞态条件,导致数据不安全。因为异步复制是后台异步执行的,GPU会持续读取原固定内存直到复制完成,此时CPU修改原内存会让GPU拿到错误的数据。
- 你描述的操作流程是安全的:
- 创建固定内存的局部变量;
- 触发
non_blocking = True的复制; - 直到GC回收前不再触碰该变量。
原因是:既没有修改原固定内存,避免了竞态;同时局部变量在GC回收前会保持内存有效,GPU在异步复制过程中能稳定访问到原始数据,不会出现内存被提前释放或复用的问题。
内容的提问来源于stack exchange,提问作者Lifu Huang
相关产品推荐
相关产品推荐

