以编程方式获取GPU内存使用情况

16
我正在寻找一种可靠的方法来确定当前GPU内存使用情况,最好是用C++/C。我已经找到了许多获取使用情况的方法,比如以下几种方法:
  • Direct Draw
  • DxDiag
  • WMI
  • DXGI
  • D3D9
这些方法精度不够(大多数误差在一百MB左右)。我尝试过nvapi.h,但没有看到任何可以用于查询内存的东西。我之前认为上述方法是唯一的选择,但后来我遇到了一个称为GPU-Z的工具,它能够给我准确的内存读数,误差不到1MB,即使我的580GTX运行OpenCL并且负载接近满载。我可以通过分配更多的内存来验证自己是否达到内存使用峰值,此时OpenCL会返回Object_Allocation fail
查看GPU-Z的导入项,除了以下内容外,我没有发现其他有趣的东西:

kernel32.dll: LoadLibraryA, GetProcAddress, VirtualAlloc, VirtualFree

我的猜测是必须使用LoadLibraryA来加载一个dll以查询GPU内存和传感器信息。如果这个dll存在,那么它在哪里?如果可能的话,我正在寻找AMD和NVidia的解决方案(使用不同的API也可以)。

1
"我大部分的一百兆字节" - 你正在使用什么已知的好参考资料? - Brian Cain
我使用GPU-Z作为我的参考,因为它给了我所需的准确性。 - roboto1986
你有什么信心证明 GPU-Z 是正确的,而其他工具是错误的? - Brian Cain
2
很好仔细检查GPU-Z(就像我也做了一样),但正如我在帖子中提到的那样,如果我的580-GTX内存使用接近顶部(似乎有3GB限制),那么我在OpenCL中会遇到分配失败的问题。当我为我的GPU创建上下文时,我还发现它占用了60MB的内存,而当我的GPU未被使用时,我的内存使用量为0MB(我的580仅在440gtx进行显示时进行计算)。GPU-Z可能是错误的,但为什么它与其他方法不同呢?我还从我的算法中知道每个代码部分分配了多少内存,这与GPU-Z读数一致。 - roboto1986
你找到如何在AMD显卡上实现这个了吗? - Tsury
不好意思,我记得我曾经使用上面列出的一些方法来计算平均值,对我来说已经足够了。 - roboto1986
3个回答

13

cudaMemGetInfo(在这里有文档)只需要使用CUDA运行时API即可获取当前设备的空闲内存和总内存。

正如Erik所指出的那样,NVML中也有类似的功能。


谢谢!我会尝试这个。我很快会标记正确答案。 - roboto1986
我试过了,这种方法可以给我想要的精度,而不必安装其他的SDK :) 现在,对于ATI卡来说,我还是没有运气。如果你有什么想法,请告诉我。否则,我可能会选择DX方法。 - roboto1986

2

谢谢提供信息。然而,我使用nvmlUnitGetCount()无法获得正确的设备数量,它返回了0个设备。我调用了nvmlInit(),返回状态是成功的,然后我接着调用了nvmlUnitGetCount(),返回状态也是成功的,但它返回了0个设备。有什么想法吗? - roboto1986
当OpenCL给我0个设备/平台时,我会重新安装显示驱动程序,这通常有效。除此之外,我没有其他建议。抱歉。 - Erik Smistad

2

我以前没见过这个,谢谢。我需要时间来测试它 :) - roboto1986

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