【发布时间】:2011-05-06 16:31:21
【问题描述】:
我正在编写一个在 GPU 上运行的 JOCl.org(与 jogamps jocl 不同)。正在处理足够的数据,我需要小心保持在 GPU 的全局内存限制之下。为此,我需要一种以编程方式确定 GPU 有多少内存的方法。我认为必须有一个简单的 JOCL 方法/变量来执行此操作,但由于某种原因,我似乎无法弄清楚它是什么。我查看了 CL.CL_MEM_SIZE 和 CL_DEVICE_GLOBAL_MEM_CACHE_SIZE 但它们都返回 4100 左右;我知道我目前正在使用一个假定包含 512 MB 的显卡。
另外,我似乎无法使用尽可能多的内存。在最坏的情况下,我必须运行一个内核来处理 2^22 个浮点数的帧,并且在内部需要两倍于帧大小的数据。如果我尝试缓存两帧(所以 2 帧 * 2^22 * 2^2 字节/浮点数 * 2 开销 = 2^26)我可以毫无困难地缓存,但是当我增加缓存时,我一次处理三个帧时间(或 2^25*3)我似乎内存不足。但是,我相信我应该只使用 512 MB 全局内存中的 ~100 个。我相信我在不使用时会正确释放内存,但显然我要么做错了什么,要么误解了 GPU 宣传的 512 MB。谁能帮我解释一下这个困惑?
有没有一种方法可以分析 GPU 以了解实际内存使用情况?
【问题讨论】:
-
1) 您是否在显示和计算上使用同一张卡?如果是这样,您可能无法访问完整的内存,因为某些内存将被显示屏锁定。
-
是的,我只有一张显卡。但是我怎么知道有多少内存“空闲”供我使用?
-
我不太确定opencl。但是 CUDA 有函数 cuGetMemInfo。可能这就是你正在寻找的开始..