可以使用cudaMalloc
/ cudaFree
分配CUDA设备内存。这很好,但很原始。
我很想知道,设备内存是否以某种方式虚拟化?是否有与mmap
等效的操作,更重要的是mremap
的设备内存操作?
如果设备内存是虚拟化的,我希望应该存在这些类型的功能。当多个进程争用有限的视频资源时,似乎现代GPU驱动程序实现了分页,这表明它以某种方式虚拟化......
有谁知道我可以在哪里阅读更多相关信息?
编辑:
好的,我的问题有点笼统。我已经阅读了手册中有关映射系统内存以进行设备访问的内容。然而,我对设备分配的内存更感兴趣。
具体问题:
- 有没有可能重新映射设备内存? (即,增加设备分配)
- 是否可以将设备分配的内存映射到系统内存?
- 使用映射固定内存会有一些性能危险吗?内存是否根据需要复制在设备上,还是总是通过pci-e总线获取内存?
我有99%的时间GPU使用内存的情况;因此它应该是设备本地的,但是将设备内存映射到系统内存以进行偶尔的结构化回读可能很方便,而不必实现笨拙的深层复制。
是的,存在统一的记忆,但是我对显式分配感到满意,除非我想要偷偷摸摸的回读,这是奇怪的时刻。
我发现这本手册的细节很普遍。
答案 0 :(得分:3)
CUDA提供了一个很好的CUDA C Programming Guide作为它的主要手册,其中有Mapped Memory部分以及Unified Memory Programming部分。
回复您发布的其他问题,并按照您的提示离开UM:
有没有办法重新映射设备内存? (即,增加设备分配)
没有直接的方法。您必须手动创建所需大小的新分配,并将旧数据复制到该分配,然后释放旧分配。如果您希望这么做很多,并且不介意与之相关的重大开销,您可以查看thrust device vectors,这将隐藏一些手工劳动并允许您调整分配的大小一个矢量风格的.resize()
操作。然而,没有什么魔力,所以推力只是一个建立在CUDA C之上的模板库(用于CUDA设备后端),因此它将执行cudaMalloc
和{{1}的序列操作,就像你手动"。
是否可以将设备分配的内存映射到系统内存?
暂且不说UM,不。设备内存无法映射到主机地址空间。
使用映射固定内存会有一些性能危险吗?内存是否根据需要复制在设备上,还是总是通过pci-e总线获取内存?
不,主机映射数据永远不会在设备内存中重复,除了L2缓存之外,GPU所需的映射数据将始终通过PCI-E总线获取