【发布时间】:2011-09-13 08:58:38
【问题描述】:
由于显卡提供大量 RAM(0.5GiB 到 2GiB)并且使用CUDA、Stream 和更便携的OpenCL 对 GPU 的 API 访问并不难,我想知道是否可以使用显卡内存作为 RAM。 Grahics RAM 可能比 real RAM 有更大的延迟(来自 CPU),但它肯定比 HDD 快,因此它可能是缓存的最佳选择。
是否可以直接访问图形内存,或者至少在自己的应用程序中使用薄内存管理层(而不是免费用于操作系统)?如果是这样,最好的方法是什么?
【问题讨论】:
-
查看 footy 的回答,这是一个 Linux 特定的 hack。除此之外,你没有运气。 OpenCL 和类似的 API 不允许您将图形内存用作额外的 RAM 或交换空间。相反,您在显卡上分配的任何数量的 RAM也作为系统 RAM 中的副本维护,即您实际上是“失去”了 RAM,而不是“获得了一些”。
-
你提到的API都不支持内核空间的调用,它们只是用户空间的。因此,如果您要尝试执行此操作,则需要通过单独的内核空间进程使用用户空间驱动程序或守护程序(想到 Linux FUSE)。我投票决定关闭它,因为它确实与 stackoverflow 无关。
-
@Damon,只有当你明确地在主内存中保留卷影副本时才会出现这种情况。
-
@Jasper Bekkers:不需要,驱动程序已经这样做了。 OpenCL,就像 OpenGL 一样,可以保证您传递给它的数据,例如如果发生意外情况,放入缓冲区对象不会神奇地消失。您的 CL 上下文与未知数量的其他 CL 和/或 GL 上下文、帧缓冲区等竞争显卡上的内存。分辨率切换(和十几个其他事件)可能意味着您的数据无效。驱动程序只有在始终保留您交给它的所有数据的至少一份副本时,才能信守其完整性承诺。
-
@talonmies 在自己的应用程序中使用图形 RAM 会很好。它应该使用某种新的放置。也许可以编写一个分配器,然后将 map
与该分配器一起使用。
标签: memory memory-management cuda opencl