如何使用 OpenGL 监控 Java 中的 GPU 使用情况?

Posted

技术标签:

【中文标题】如何使用 OpenGL 监控 Java 中的 GPU 使用情况?【英文标题】:How to use OpenGL to monitor GPU usage in Java? 【发布时间】:2019-04-08 22:23:57 【问题描述】:

我希望监控硬件的超时使用情况,并且遇到了 OpenGL,因为很多人都说这是一个可能的解决方案。

我正在努力寻找如何使用 OpenGL 获取 GPU 信息的示例或资源。

可以用Java完成吗?怎么做?

或者有其他选择吗?

【问题讨论】:

你要检索什么样的信息? 内存和正在使用的内存 恐怕您需要寻找 OpenGL 扩展才能实现这一目标(因此每个 GPU 供应商都应该为您提供)。它看起来不像 OpenGL API 的开箱即用功能。 JOGL - monitor GPU memory的可能重复 【参考方案1】:

OpenGL 主要是与 GPU 无关的 API,因此它没有关于 GPU 性能特征的准确信息,也没有提供某些东西的温度。另一方面,您可以使用glGetString 函数检索一些信息,这些信息可以帮助您更好地了解您正在处理的 GPU 类型。 GL_VENDORGL_RENDERER 值的组合对于平台来说是唯一的。

对于 Java,任何 OpenGL 包装器都应该是合适的,可能JOGL 是最著名的。


编辑。

虽然这并不常见,但不同的供应商都会提供您正在寻找的信息。我只能找到一些关于 GPU 内存的见解,但它给了其他人的希望:http://nasutechtips.blogspot.com/2011/02/how-to-get-gpu-memory-size-and-usage-in.html

【讨论】:

【参考方案2】:

如果有人想知道如何使用 GPU,我找到了一种使用 nvidia-smi 命令然后读取输出的方法。仅适用于 nvidia gpus tho,您可以更改命令以获取其他信息,例如内存或任何使用查询命令的信息

/**
* Returns current GPU usage percentage for NVIDIA GPU's
*/
public static int getGPUUsagePercentage() 
    try 
        Process process = Runtime.getRuntime().exec("nvidia-smi --query-gpu=utilization.gpu --format=csv");
        BufferedReader stdInput = new BufferedReader(new InputStreamReader(process.getInputStream()));
        stdInput.readLine();
        return Integer.parseInt(stdInput.readLine().replace(" %", ""));
     catch (Exception e) 
        e.printStackTrace();
        return -1;
    

【讨论】:

以上是关于如何使用 OpenGL 监控 Java 中的 GPU 使用情况?的主要内容,如果未能解决你的问题,请参考以下文章

Greenplum 监控与运维

基础概念记录

Greenplum 监控与运维

OPENGL ES 2.0 知识串讲 ——GLSL 语法(IV)

无法使用 gp 和 java 连接某些智能卡

如何使缩放图像在 Java/OpenGL 中看起来更好?