- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
这是对我之前问题的跟进: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
因为我只需要一小部分功能,所以我真的不想换成使用另一种语言。我认为 ctypes 应该能够做到这一点......我只是不知道该怎么做。我以前从未真正使用过 Python ctypes。
为了查询 gpu 使用情况,我首先需要调用 NvAPI_Initialize 函数。还必须使用查询接口(interface)来引用函数:
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;
}
}
引用初始化和使用函数:
GetDelegate(0x0150E828, out NvAPI_Initialize);
GetDelegate(0x189A1FDF, out NvAPI_GPU_GetUsages);
我对此的理解可能仍然是错误的,但我花了很多时间试图解决这个问题,所以我希望有人能帮助我朝着正确的方向前进,因为我对如何进行有点迷茫.
有人可以帮助我理解如何让这一小部分代码直接在 python 中运行吗?我只需要能够在一天结束时调用 NvAPI_GPU_GetUsages 函数。
谢谢。
最佳答案
In order to query for the gpu usage I first need to call the NvAPI_Initialize function.
实际上涉及到两个初始化函数:第一个来自静态库nvapi.lib,试图动态加载nvapi.dll,定位一些函数,调用第二个来自动态链接库的初始化函数。从static库中调用NvApi_Initialize涉及的步骤大致如下:
检查nvapi.dll是否已经存在加载,如果没有,加载它
使用 GetProcAddress 获取指向的指针来自 DLL 的 nvapi_QueryInterface
使用新获得的函数来查询带有 Id 的接口(interface)0x150E828。这将是第二个初始化函数来自动态库
调用获得的初始化函数。如果功能成功(指示通过返回值0),得到两个新函数指针通过nvapi_QueryInterface
,使用IDs 0x33C7358C(我们称之为 ENTER)和 0x593E8644(EXIT)。
因此,如果您想保持纯 Python,您基本上必须使用 ctypes 复制这些步骤,这将非常简单。完成后在nvapi.dll中有一个cleanup函数,可以通过id0xD22BDD7E查询。如果您使用完该库,请记住调用此函数。
现在谈谈真正的问题:不幸的是,2010 年 12 月的 NVIDIA SDK 中没有函数 NvAPI_GPU_GetUsages
。但是,NvAPI_GPU_GetDynamicPstatesInfoEx
允许您请求填充类型为 NV_GPU_DYNAMIC_PSTATES_INFO_EX
的结构数组,这反过来又会包含在给定域(即 GPU、帧缓冲区和视频引擎)的最后一秒。
基本上,如果您想检索 GPU 使用信息,您将 NV_GPU_DYNAMIC_PSTATES_INFO_EX
结构传输到 Python(请参阅 ctypes 文档中的 Structures and unions),创建一个至少包含 3 个结构的数组并将其传递数组到 NvAPI_GPU_GetDynamicPstatesInfoEx
函数,您必须先使用 ID 0x60DED2ED 从动态链接库中查询它。
顺便说一句,这是您在初始化期间查询的两个函数发挥作用的地方 - 这是一种锁定机制。虽然不是绝对必要的(即您可以在调用期间省略它),但我们鼓励您调用它们,即
Enter()
NvAPI_GPU_GetDynamicPstatesInfoEx(array_of_structs)
Exit()
您应该能够通过查看 NVAPI_GPU_UTILIZATION_DOMAIN_GPU 宏(或常量)找到 GPU 使用信息存储在数组中的哪个位置,不幸的是,头文件中似乎没有包含声明开发工具包。不过,您可以通过将代码结果与显示 GPU 使用信息的 NVIDIA 系统工具进行比较来轻松验证这一点。
希望对您有所帮助。
关于python - 使用 python ctypes 与 nvapi 接口(interface)(跟进演示代码),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6165628/
ASP.NET 团队和社区在 .NET 8 继续全力投入 Blazor,为它带来了非常多的新特性,特别是在服务端渲染(SSR)方面,一定程度解决之前 WASM 加载慢,Server 性能不理想等局限
我正在尝试执行一个小程序,但无法真正完全理解它。在某些地方,我认为它的作用是错误的,但我知道 where =[] 如果有人能指出我正确的方向,我将不胜感激。 import java.util.*; p
感谢您对我上一篇文章的帮助,@AndyE,您的解决方案效果很好。 现在我的后续行动,相同的想法,不同的功能...我尝试实现您之前的解决方案,但无法让它正常工作...: $(document).keyp
我有一个看起来像这样的列表: ('string ', 'time', 'SPY', 0, 0, 131.63, 100), ('sting ', 'time', 'SPY', 0, 0, 131.63
多年来,我们一直在使用 BoundsChecker for Visual C++ 6(我认为它也是 BoundsChecker 5 或 6)。我们已经升级到 VS2008(终于!),现在需要跟进过时的
这是这个问题的后续:Why does a division result differ based on the cast type? 快速总结: byte b1 = (byte)(64 / 0.8f
再次免责声明:我是 Clojure 新手。感谢您的帮助。 我之前的问题 ( Clojure's defrecord - how to use it? ) 产生了一个有效的数据结构和方法:https:/
这是 MySQL count / track streaks or consecutive dates 的后续问题 马特为我之前的问题提供的解决方案效果很好,但现在我遇到了一个问题,因为我正在处理 1
关于问题Multiple delegates per one object?其中一个答案提出了有趣的解决方案(至少对于我天真的眼睛来说):创建一个“委托(delegate)拆分器”,允许一个对象(在本
首先,请阅读我认为我修复了它的旧帖子。 (没时间可以跳过) Firefox interacts with my timers somehow ?!?! This is crazy ^^ 对于那些不想阅
您好,提前谢谢您。这是来自以下线程的跟进问题(不确定我是否应该在那里发布或开始一个新线程......: CSRF token missing or incorrect even though I ha
我之前问过一个问题,根据用户点击这篇文章的哪个链接来填充页面,可以在这里找到: How to populate 1 php page differently depending on link cli
跟进 https://stackoverflow.com/a/3448189 ,实际显示密码屏幕的最佳方式是什么? 我的第一次尝试是使用 LockActivity 启动 SubActivity: //
这是对 How to interpret ggplot2::stat_density2d 的直接跟进. bins已作为参数重新添加 see this thread和 corresponding git
这是 Why is my OpenMP implementation slower than a single threaded implementation? 的后续内容. 我坚持提供的答案,并使用
跟进我之前的问题。 谁能解释为什么下面的代码编译没有任何错误: typedef array MethodArray; typedef array ParameterArray; ParameterAr
按照@AlexWein 在this question 中的建议看着 ProGuard Troubleshooting ,我在 SherlockFragment 中有以下内容: Class c = Cl
这是我之前问过的一个关于计算直手的问题的后续问题......不完全一样......这是读牌的方法 - 它有效 - 但有没有更好的方法 - 做这在 C 中使用控制台输入 ... void read_ca
这是 Previous Question 的跟进 它变得非常复杂,所以我开始一个新线程来使我的观点更清楚。(不想删除以前的线程,因为其他提供有值(value)反馈的人不会失去他们获得的声望点数) 更新
这是对 my previous question 的跟进. 假设我使用以下原型(prototype)编写了一个函数: int a_function(Foo val); 其中 foo 被认为是一个类型定
我是一名优秀的程序员,十分优秀!