使用python ctypes与nvapi交互(后续附演示代码)

2024-01-12

这是我之前问题的后续:有关 python ctypes 和 nvapi 的帮助 https://stackoverflow.com/questions/6163770/help-with-python-ctypes-and-nvapi

我正在发布另一个问题,因为我已经在上一个问题中选择了答案,并且问题现在已经改变了方向。

使用 python,我尝试查询 nvapi.dll 以获取我的 GPU 使用值。

这是在 C# 中执行此操作的方法(如下引用):http://code.google.com/p/open-hardware-monitor/source/browse/trunk/Hardware/Nvidia/NVAPI.cs http://code.google.com/p/open-hardware-monitor/source/browse/trunk/Hardware/Nvidia/NVAPI.cs

因为我只需要一小部分功能,所以我真的不想换成使用另一种语言。我认为 ctypes 应该能够做到这一点......我只是不知道如何做到这一点。我以前从未真正使用过Python ctypes。

为了查询 GPU 使用情况,我首先需要调用 NvAPI_Initialize 函数。还必须使用查询接口来引用该函数:

from ctypes import *
nvapi = WinDLL("nvapi.dll")
nvapi_QueryInterface = nvapi.nvapi_QueryInterface

使用上面的代码,我可以访问 nvapi_QueryInterface,但我不知道如何复制这部分:

private static void GetDelegate<T>(uint id, out T newDelegate)
  where T : class
{
    IntPtr ptr = nvapi_QueryInterface(id);
    if (ptr != IntPtr.Zero)
    {
        newDelegate =
          Marshal.GetDelegateForFunctionPointer(ptr, typeof(T)) as T;
    }
    else
    {
        newDelegate = null;
    }
}

引用 init 和 use 函数:

GetDelegate(0x0150E828, out NvAPI_Initialize);
GetDelegate(0x189A1FDF, out NvAPI_GPU_GetUsages);

我对此的理解可能仍然是错误的,但我花了很多时间试图弄清楚这一点,所以我希望有人可以帮助我朝正确的方向前进,因为我对如何进行有点迷失。

有人可以帮助我理解如何使这一小部分代码直接在 python 中工作吗?我只需要能够在一天结束时调用 NvAPI_GPU_GetUsages 函数。

Thanks.


为了查询gpu使用情况我 首先需要调用 NvAPI_初始化函数。

实际上涉及到两个初始化函数:第一个来自静态库nvapi.lib,它尝试动态加载nvapi.dll,定位一些函数并调用动态链接库中的第二个初始化函数。从调用 NvApi_Initialize 时涉及的步骤static库大致如下:

  1. 检查 nvapi.dll 是否已经存在 已加载,如果没有,则加载

  2. 使用 GetProcAddress 获取指向的指针nvapi_QueryInterface从DLL中 使用新获得的函数 查询带有Id的接口0x150E828。这将是第二次 初始化函数来自 动态库

  3. 调用获得的初始化函数。如果 功能成功(表示 通过返回值0),得到两个 新函数指针通过nvapi_QueryInterface, 使用 id0x33C7358C(我们称之为 ENTER)和0x593E8644 (EXIT).

因此,如果你想保持纯粹的 Python,你基本上必须使用 ctypes 复制这些步骤,这将非常简单。完成后,nvapi.dll中有一个清理函数,可以使用id查询0xD22BDD7E。如果您使用完该库,请记住调用此函数。

现在讨论真正的问题:不幸的是,没有功能NvAPI_GPU_GetUsages在 2010 年 12 月的 NVIDIA SDK 中。然而,有NvAPI_GPU_GetDynamicPstatesInfoEx这将允许您请求类型结构的数组NV_GPU_DYNAMIC_PSTATES_INFO_EX待填充,这又将包含给定域(即 GPU、帧缓冲区和视频引擎)最后一秒内的利用率(以时间百分比形式表示)。

基本上,如果你想检索 GPU 使用信息,你可以传输NV_GPU_DYNAMIC_PSTATES_INFO_EX结构体转Python(参见结构和联合 http://docs.python.org/library/ctypes.html#structures-and-unions在 ctypes 文档中),创建一个至少包含 3 个结构的数组并将该数组传递给NvAPI_GPU_GetDynamicPstatesInfoEx函数,您必须先从动态链接库中使用 id 查询该函数0x60DED2ED.

顺便说一句,这就是初始化期间查询的两个函数发挥作用的地方 - 这是一种锁定机制。虽然不是绝对必要的(即您可以在通话期间省略此操作),但我们鼓励您致电他们,即

Enter()
NvAPI_GPU_GetDynamicPstatesInfoEx(array_of_structs)
Exit()

您应该能够通过查看 NVAPI_GPU_UTILIZATION_DOMAIN_GPU 宏(或常量)来找到 GPU 使用信息存储在数组中的哪个位置,不幸的是,SDK 的头文件中似乎没有包含声明。不过,您可以通过将代码结果与显示 GPU 使用信息的 NVIDIA 系统工具进行比较来轻松验证这一点。

希望有帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用python ctypes与nvapi交互(后续附演示代码) 的相关文章

随机推荐

  • cuda 3D纹理插值

    我正在尝试使用纹理内存和下面的代码通过 cuda 插入 3D 数组 我已将输入 f x y z 绘制为固定的 z 值 然后为 x 和 y 插入数组并再次绘制 i 它们看起来完全不同 我还在一维中尝试过这个 使用不同的代码 并且它在那里工作
  • 如何处理 UsernameNotFoundException spring security

    如何处理UsernameNotFoundException 在 Spring Security 中 当用户名未找到时UserDetailsService实现抛出一个UsernameNotFoundException 例如这样 Overrid
  • 将 UIDatePicker 从 12 小时制更改为 24 小时制并返回

    很抱歉 我的第一个问题有点简单 我花了一天时间阅读 NSLocale 和 NSCalendar 类描述 但我不知道这是否可能 我有一个 UIDatePicker 处于 UIDatePickerModeDateAndTime 模式 当前它根据
  • Java 正则表达式中的 POSIX 字符等效项

    我想在Java中使用这样的正则表达式 a e i 但是Java不支持POSIX类 a e etc 我怎样才能做到这一点 更准确地说 有没有办法不使用 US ASCII Java确实支持posix 字符类 http download orac
  • 使用 micronaut-data-hibernate-jpa 库连接到 jpa 时出现错误

    我想将 JPA 用于 micronaut 为此我正在使用io micronaut data micronaut data hibernate jpa 1 0 0 M1图书馆 每当我运行应用程序并点击端点来获取数据时 我都会收到以下错误 me
  • Keycloak / SpringBoot - OpenID 配置中提供的颁发者 与请求的颁发者 不匹配

    我对我刚刚加入的项目有疑问 技术栈 Jhipster 与 Angular 和 SpringBoot Keycloak 我将正确的网址替换为 example com 和 bar com 应用程序 yaml https i stack imgu
  • Html.Action - 获取与发布

    我经常这样做 div Html Action Create Product div 这很方便 因为我可以将产品创建表单的绘制委托给另一个控制器操作以嵌入到某个位置 但是 我遇到的问题是 该方法有时 我还没有弄清楚在什么条件下 会调用我的控制
  • 我如何知道鼠标指针是否位于 HTML 元素上?

    我有一个定时事件 我想根据鼠标指针所在的 HTML 元素采取不同的行为 假设我有 HTML 元素 有没有办法知道鼠标指针当前是否位于其顶部 我很了解 onmouseover onmouseout 事件以及如何使用它们 我正在使用 JQuer
  • 多个外键?

    我有一张表 用于跟踪将产品从一个供应商运送到另一个供应商的天数和成本 我们 非常出色 p 将运输供应商 FedEx UPS 和产品处理供应商 Think Dunder Mifflin 存储在 VENDOR 表中 因此 我的 SHIPPING
  • 使用硬浮点时使用 gcc 交叉编译简单示例时出现问题

    当我尝试编译一个简单的例子时test c int main return 0 对于具有硬浮点 ABI 的 cortex m7 目标 使用以下调用 arm none eabi gcc mcpu cortex m7 mfpu fpv5 d16
  • 类型错误:res.json 不是函数

    我正在尝试发送两个 json 但它不起作用 它打印TypeError res json is not a function但我不明白为什么会发生 有什么想法吗 谢谢 app post danger function response req
  • GWT XML(xml 对象映射)

    在 Java 中 我们可以使用 JAXB 等工具自动为我们进行类对象映射 但是在 GWT 中 由于反射有限 JAXB 不可用 唯一的方法是 Document messageDom XMLParser parse messageXml Nod
  • 为什么在 CLOB 上使用 REPLACE 函数会导致 CACHE_LOBS 增加...?

    我需要在 CLOB 变量上使用内置 REPLACE 函数 作为更大的 PL SQL 流程的一部分 我使用的是 Oracle 11g R2 该函数工作正常 因为它根据需要进行替换 但随着过程运行 大约有 250 万条记录需要处理 它的速度严重
  • Prolog的append有什么问题?

    根据我大学的逻辑课程 对于以下查询 我们可以预期得到与 Prolog 定义不同的结果 append a X 统一为X a 但我不明白他们的目的是什么 考虑到附加应该统一 X 在本例中 的串联 应该期望什么作为有效响应 and a 我认为他们
  • Django 加密 url 中的主键

    我环顾四周 但仍然对如何安全地加密 django 应用程序的 url 中的主 ID 感到不舒服 我的网址如下 http www example com primary1 id primary2 id testing 例如 http www
  • 这是什么:[Ljava.lang.Object;?

    当我打电话时我得到这个toString在我从函数调用收到的对象上 我知道该字符串中编码了对象的类型 但我不知道如何读取它 这种类型的编码叫什么 Ljava lang Object 是的名字Object class the java lang
  • 不声明外键的导航属性

    我的所有模型都至少包含两个关联 在 ef4 中对此进行建模时 我只能通过使用流畅的接口在没有第二个外键属性的情况下做到这一点 foreignKey 似乎是正确使用的属性 除了它需要一个字符串参数这一事实 所以我的问题是 您可以拥有一个导航属
  • 如何检查 jq 中的 null 或空并在 jq 转换中替换空字符串

    如何检查 jq 中的 null 或空并在 jq 转换中替换空字符串 下面的 JSON 示例 这是 JQ JQ amazon items select name contains shoes as item activeItem amazon
  • Eclipse 4 RCP(又名 E4)文档

    除了 Vogella 的教程和他的书之外至少还有什么吗 这完全是基于那些言论 他的存储库中的示例通常要么不完整 未完成 无法运行 这些示例甚至与实际的书不匹配 我想为此至少找到一些javadoc 因为任何一步到了一边 我就完全迷失了如何完成
  • 使用python ctypes与nvapi交互(后续附演示代码)

    这是我之前问题的后续 有关 python ctypes 和 nvapi 的帮助 https stackoverflow com questions 6163770 help with python ctypes and nvapi 我正在发