问题
我目前正在寻找一个命令或工具(或其他东西),让我能够轻松地测量运行在Linux上的OpenGL应用程序的已分配视频内存量。具体来说,我正在使用Software-MESA驱动程序,目标是测量大型应用程序的一些代码和库更改的影响。
我已经知道我的程序版本之间有一些很大的差异,但现在我发现读取“已用内存”的唯一方法是使用nvidia-smi
等图形卡特定命令。这不是一个非常便携或“易于自动化的方式”,因为这些工具需要手动解释,也需要我在硬件上运行所有内容-而不是使用软件梅萨驱动程序!
因此,这里的问题在一个简单的(更多细节如下):
- 在Linux上的X11+OpenGL架构下,是否有可能准确地做到这一点?
- 在Linux上测量视频内存使用的可移植选项(或者也可以是不可移植选项)是什么?
在Linux上的X11+OpenGL架构下,是否有可能准确地完成此操作?
我对此感到疑惑,因为据我所知,图形上下文将从X11请求(或者你的帧缓冲区或者其他什么--我用的是Xvfb
),它会把OpenGL上下文和你的应用程序关联起来。存储器分配可能在X11服务器级别上完成并且不能容易地关联回单个应用程序。然而,这可能与梅萨OpenGL的软件实现完全不同,在这种情况下,一切都是在应用程序中完成的?!我实际上不知道...
在任何情况下,都可以通过跟踪OpenGL API调用并对所有缓冲区分配进行求和,在某种程度上近似应用程序的OpenGL相关显存使用。我假设GALLIUM_HUD会有一个选项,但在调用GALLIUM_HUD=help glxgears
时,我在列表中找不到任何显存相关选项。只有一堆传感器、温度、fps、cpufreq...根本没有内存测量...
或许还有别的原因,我漏掉了什么?
在Linux上测量视频内存使用的可移植选项(或者也可以是不可移植选项)有哪些?
为了测量Linux上的“一般视频内存使用”,我知道一个工具,例如,与我的NVIDIA卡:
nvidia-smi
gpustat
(https://github.com/wookayin/gpustat)
然而,这些工具依赖于我有一个nvidia卡。我想避免“在我的开发机器上工作”的问题,但是。另外:这取决于NVIDIA的功能,对于我部署的应用程序,我尝试使用Software-MESA驱动程序,两种OpenGL实现之间的有效内存负载可能不同!
因此,这些工具不是很好地工作。当然,作为近似值已经足够好了,也是我现在唯一知道可以使用的东西!
但也许还有其他的?有没有什么或一些“技巧”,也许跟踪/valgrind的内存使用软件梅萨?也许一些其他的工具或选项的OpenGL层?也许有人知道一些东西,让我做一些更好的形式的剖析,而不是解释nvidia-smi
输出手动!
就是这样,欢迎帮助!我会回去跟踪一些nvidia-smi
日志,直到那时-
1条答案
按热度按时间jgovgodb1#
使用
ATI_meminfo
和/或NVX_gpu_memory_info
在程序启动时获取GL空闲内存(“A”),然后在需要当前分配时再次获取(“B”)。A - B是实际分配的内存。Radeon RX 6700 XT上的梅萨22.3.3同时支持
ATI_meminfo
和NVX_gpu_memory_info
:然而,当经由
LIBGL_ALWAYS_SOFTWARE=true
强制软件渲染时,这些扩展被 * 不 * 报告;它所能做的最好的是GLX_MESA_query_renderer
的GLX_RENDERER_VIDEO_MEMORY_MESA
(Video memory:
线):