首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用python ctype与nvapi接口(后续演示代码)

使用python ctype与nvapi接口(后续演示代码)
EN

Stack Overflow用户
提问于 2011-05-29 10:32:10
回答 1查看 1.7K关注 0票数 4

这是我上一个问题的后续问题: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

因为我只需要一小部分功能,我并不真的想换成使用另一种语言。我认为ctype应该能够做到这一点。我就是想不出该怎么做。我以前从未真正使用过Python ctypes。

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

代码语言:javascript
复制
from ctypes import *
nvapi = WinDLL("nvapi.dll")
nvapi_QueryInterface = nvapi.nvapi_QueryInterface

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

代码语言:javascript
复制
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;
    }
}

要引用初始化和使用函数,请执行以下操作:

代码语言:javascript
复制
GetDelegate(0x0150E828, out NvAPI_Initialize);
GetDelegate(0x189A1FDF, out NvAPI_GPU_GetUsages);

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

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

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-05-29 11:39:45

为了查询

的使用情况,我首先需要调用NvAPI_Initialize函数。

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

  1. 检查nvapi.dll是否已加载,如果未加载,则加载
  2. 使用GetProcAddress从DLL获取指向nvapi_QueryInterface的指针使用新获得的函数查询Id为0x150E828的接口。这将是从动态库
  3. 调用获得的初始化函数的第二个初始化函数。如果函数成功(由返回值0表示),使用ids 0x33C7358C (让我们称之为ENTER)和0x593E8644 (EXIT),通过nvapi_QueryInterface获得两个新的函数指针。

所以,如果你想保持纯Python,你基本上必须使用ctype来复制这些步骤,这将是非常简单的。完成后,nvapi.dll中有一个清理函数,您可以使用id 0xD22BDD7E查询该函数。如果你已经用完了这个库,记得调用这个函数。

现在来看真正的问题:不幸的是,在2010年12月的NVIDIA SDK中没有NvAPI_GPU_GetUsages函数。但是,NvAPI_GPU_GetDynamicPstatesInfoEx允许您请求填充NV_GPU_DYNAMIC_PSTATES_INFO_EX类型的结构数组,该数组将包含给定域(即图形处理器、帧缓冲器和视频引擎)在最后一秒内的使用率。

基本上,如果您希望检索GPU使用信息,可以将NV_GPU_DYNAMIC_PSTATES_INFO_EX结构传输到Python (请参阅ctypes文档中的Structures and unions ),创建一个至少包含3个结构的数组,并将该数组传递给NvAPI_GPU_GetDynamicPstatesInfoEx函数,您必须首先使用id 0x60DED2ED从动态链接库中查询该函数。

顺便说一句,这两个函数在初始化期间的查询中发挥作用--这是一种锁定机制。虽然不是绝对必要的(例如,您可以在调用过程中省略这一点),但我们鼓励您调用它们,即

代码语言:javascript
复制
Enter()
NvAPI_GPU_GetDynamicPstatesInfoEx(array_of_structs)
Exit()

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

希望这能有所帮助。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6165628

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档