如何将显存用作内存?

26
由于显卡提供大量的RAM(0.5GiB到2GiB),使用CUDAStream和更可移植的OpenCL API访问GPU并不那么困难,我想知道是否可以将显存用作RAM。显存可能比真实 RAM的延迟要大(来自CPU),但肯定比HDD快,因此它可能是缓存的最佳选择。
能否直接访问显存或至少通过薄内存管理层在自己的应用程序中访问显存(而不是为操作系统免费使用)?如果可以,这样做的首选方式是什么?

2
看看footy的答案,这是一个Linux特定的技巧。除此之外,你就没有运气了。OpenCL和类似的API不允许你使用图形内存作为额外的RAM或交换空间。相反,你用这些分配在显卡上的任何数量的RAM都会在系统RAM中保留一份副本,也就是说你实际上是“失去”了RAM而不是“获得了一些”。 - Damon
你提到的所有API都不支持从内核空间调用,它们仅限于用户空间。因此,如果您要尝试这样做,就需要通过单独的内核空间进程(例如Linux FUSE)使用用户空间驱动程序或守护程序。我投票关闭此问题,因为它确实与stackoverflow的主题无关。 - talonmies
@Damon,只有在您明确将影子副本保留在主内存中时才会出现这种情况。 - Jasper Bekkers
1
@Jasper Bekkers:不需要,驱动程序已经做到了这一点。与OpenGL类似,OpenCL可以保证您传递给它的数据(例如缓冲对象)不会在发生意外情况时神奇地消失。您的CL上下文与未知数量的其他CL和/或GL上下文、帧缓冲区等竞争图形卡上的内存。分辨率切换(以及其他数十个事件)可能意味着您的数据无效。如果驱动程序始终保留您交给它的所有数据的至少一个副本,那么它只能保持其完整性承诺。 - Damon
1
@talonmies 在自己的应用程序中使用显存是可以的。 应该使用某种放置 new。也许可以编写一个分配器,然后使用带有该分配器的 map<k,v>。 - mbx
你可以将其用作交换空间,而不是RAM:https://wiki.archlinux.org/title/Swap_on_video_RAM - mbx
1个回答

17

是的,你可以在Linux上将其用作交换内存。更多详情请参考这里

在Linux上,可以将其用作交换空间,甚至可以用作RAM磁盘。

警告

在家庭电脑上拥有快速交换或RAM磁盘很好,但需要注意,如果为X加载了二进制驱动程序,可能会导致整个系统冻结或产生图形故障,通常无法告诉驱动程序可以使用多少内存,因此它不知道上限。但是,可以使用VESA驱动程序,因为它提供了设置视频RAM大小的可能性。

因此,直接渲染或快速交换,由您选择。

与主板RAM和硬盘不同,没有已知具有ECC内存的视频卡。这对于图形渲染可能并不重要,但您绝对不想在其中放置关键数据或在服务器上使用此功能。


8
基于 Fermi 架构的某些 NVIDIA 图形卡,如 Quadro 和 Tesla 系列,支持 ECC。例如,Tesla C2050 和 C2070(请参见 http://www.nvidia.com/object/personal-supercomputing.html),以及 Quadro 5000(请参见 http://www.nvidia.com/docs/IO/40049/NV-DS-QUADRO-5000-Jul10-LR-final.pdf)。 - njuffa
在Windows系统中是否可能? - RaviSam
@RaviSam 不行 - 微软只允许页面文件在磁盘上。 - Andreas Hartmann

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接