在OpenCL中如何确定可用设备内存?

9
我想在分配缓冲区之前知道设备上有多少可用内存。这个可能吗?我知道有 CL_DEVICE_GLOBAL_MEM_SIZE 表示总内存,CL_DEVICE_MAX_MEM_ALLOC_SIZE 表示单个对象的最大尺寸,但我想知道当前内存状态。
现在我可能需要使用OpenGL供应商特定的扩展来解决这个问题。
2个回答

4
没有办法也没有必要知道,GPU内存可以虚拟化,驱动程序会在需要时将内存从GPU中交换出来/交换回去。

5
知道没有方法是好的,但为什么要说没有必要呢?我不想交换内存,而且由于我也在使用GL,我不想占用所有的GL内存。 - nullspace
不需要,因为驱动程序会处理这个问题。GL资源也是虚拟化的。交换并不是真正的坏事,它只会在需要时将VRAM中的数据复制到RAM中,反之亦然。如果您发现没有足够的VRAM可用,您会怎么做? - Dr. Snoopy
1
目前,它正在崩溃GL子系统并等待TDR重新启动它。这可能是由于我的代码中的错误,但分配较小的缓冲区可以解决此问题。我想确定最佳缓冲区大小。因此,这更多是一种预防性措施。 - nullspace
1
这看起来像是GL/CL实现中的一个bug,你的代码不应该导致GL/CL实现崩溃。 - Dr. Snoopy
看起来“bug”实际上是我的内核花费太长时间完成,TDM会重置显示驱动程序。我禁用了TDM,一切正常工作。不太确定该怎么处理这个问题。 - nullspace
6
如果我不想进行交换,该怎么办?例如,我正在为一个三维动画软件(Maya)编写插件。如果场景中有两个角色,其中一个使用了所有的VRAM,我只希望另一个使用CPU设备。那么,当它们同时进行动画时,交换的开销不会影响性能吗? - Chad Vernon

2

2
这就是我最终使用的,对于ATI使用ATI_meminfo,但那是GL而不是CL。 - nullspace

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