以编程方式获取GPU内存使用情况
Get GPU memory usage programmatically
我正在寻找一种可靠的方法来确定当前的GPU内存使用情况,最好是在c++/C中。我已经找到了许多方法来获得使用,如以下方法:
- 直接画
- 一种诊断工具
- WMI
- DXGI
- d3d 9
这些方法不够精确(大多数相差100兆字节)。我尝试了nvapi.h
,但我没有看到任何我可以用来查询内存的东西。我认为只有上面列出的方法是唯一的选择,但后来我遇到了一个叫做GPU-Z
的工具,即使OpenCL在我的580GTX上几乎满负荷运行,它也能给我准确的内存读数到最近的兆字节。在OpenCL返回Object_Allocation fail
返回代码之前,我可以通过分配更多兆字节来验证我处于内存使用的峰值。
查看从GPU-Z导入的内容,除了:
kernel32.dll: LoadLibraryA, GetProcAddress, VirtualAlloc, VirtualFree
我的猜测是LoadLibraryA
必须用于加载查询GPU内存和传感器的dll。如果这个dll存在,它在哪里?如果可能的话,我正在寻找AMD和NVidia的解决方案(使用不同的api是可以的)。
cudaMemGetInfo
(在这里记录)只需要cuda运行时API来获取当前设备上的空闲内存和总内存。
正如Erik指出的,在NVML中也有类似的功能。
查看NVIDIA管理库https://developer.nvidia.com/nvidia-management-library-nvml:中的nvmlDeviceGetMemoryInfo函数
"以字节为单位检索设备上可用的已用、空闲和总内存量。"
不知道AMD有没有类似的东西
D3DKMTQueryStatistics是你需要的。
类似的问题已经问过这里:如何查询GPU使用DirectX?
- 如何在没有死锁和/或争用的情况下正确使用 std::mutex C++?
- 在集合的情况下使用emplace_hint的用例是什么?
- 在没有堆的情况下用两种方法构造对象
- 如何在不中断的情况下正确使用C++中的切换用例语句中的Fallthrough
- 给定一个填充无符号字符**的 C 函数,如何在没有中间副本的情况下用数据填充 std::vector
- 在这种情况下,有没有办法用单个解决方案替换两个仅在类型上不同的相似函数?
- 为什么在一种情况下,我会收到带有字符串文字的已弃用转换警告,而在另一种情况下却没有?
- 不能在没有对象的情况下调用成员函数,但我用对象调用函数
- 在不先显式调用析构函数的情况下,在旧对象上使用placement new是否危险
- 无法在前面有多余空格的情况下获取要打印的数组.只有第一个值会用空格打印
- 在可疑的情况下发出叮当警告:函数'foo'可以用属性"noreturn"声明吗?
- 如何在没有任何JavaScript知识的情况下用PNaCl编写C++HTML5应用程序
- 如何在不使用开关大小写的情况下用C++编写菜单驱动的程序
- 在什么情况下,运算符=应该用左值/右值重载而不是复制和交换来实现
- 在没有测试用例的情况下提升单元测试框架
- 在这种情况下,为函数赋值有什么用
- 如何在没有_setmode的情况下用C++输出unicode
- 如何在没有STL的情况下用c++中的Key创建和访问内存块
- 如何在不锁定文件的情况下用C++编写文件
- clang与gcc运行时的区别:用clang构建的c++类模板在没有复制构造函数的情况下崩溃,用复制构造函数构建的gcc