为 .NET 应用启用高性能 GPU

Posted

技术标签:

【中文标题】为 .NET 应用启用高性能 GPU【英文标题】:Enable high-performance GPU for a .NET app 【发布时间】:2017-04-15 00:56:04 【问题描述】:

用户抱怨我的应用(使用 Direct3D 11 为类似 CAD 的功能渲染一些繁重的 3D 内容)在双 GPU 系统上的 Intel GPU 上运行。

发现NvOptimusEnablement / AmdPowerXpressRequestHighPerformance 导出了变量。但是,该应用程序具有 .NET 前端,无法从那里导出内容。虽然there’s some workaround,但重新编译步骤会破坏调试器(不能再设置断点)并使调试符号无效,我需要它们都能可靠地工作。

还有其他想法吗?

是否可以在安装时创建 nVidia 应用程序配置文件?

或者,如何使用 NVApi 来选择高性能 GPU?

【问题讨论】:

【参考方案1】:

我制作了一个带有自定义 WIX 操作的 C++ DLL,它在安装时创建/更新应用程序的配置文件,并在卸载时将其删除。

虽然几乎没有记录,但官方的 nVidia API 具有所需的 NvAPI_DRS_* 函数。

这是一个工作流程:NvAPI_Initialize(如果失败,则表示用户没有 nVidia GPU,这不是错误)、NvAPI_DRS_CreateSessionNvAPI_DRS_LoadSettingsNvAPI_DRS_FindProfileByName

如果没有找到,NvAPI_DRS_CreateProfile,以及对NvAPI_DRS_SetSetting 的三个调用,设置三个 DWORD 属性:

    SHIM_MCCOMPAT_ID = SHIM_MCCOMPAT_ENABLE SHIM_RENDERING_MODE_ID = SHIM_RENDERING_MODE_ENABLE SHIM_RENDERING_OPTIONS_ID = SHIM_RENDERING_OPTIONS_DEFAULT_RENDERING_MODE

然后,调用NvAPI_DRS_GetProfileInfo获取应用数量,再调用NvAPI_DRS_EnumApplications,搜索EXE路径。

卸载时,我通过调用NvAPI_DRS_FindProfileByName 然后NvAPI_DRS_DeleteProfile 删除完整的配置文件。

在重新安装和升级时,我都会先删除然后添加。

最后不要忘记NvAPI_DRS_SaveSettings

附:最出乎意料的是,nVidia “规范化”了存储在 NVDRS_APPLICATION::appName 字段中的路径,它们将它们转换为小写,并将 '\' 替换为 '/'。由于这种“规范化”,没有标准的字符串比较函数适用于它们。

【讨论】:

以上是关于为 .NET 应用启用高性能 GPU的主要内容,如果未能解决你的问题,请参考以下文章

android性能优化之GPU呈现模式分析

我正在使用 systrace 对其 GPU 的 android 应用程序进行性能调查。 systrace 中的“GPU 完成”线程是啥意思

嵌入式图形解决方案升级!RT-Thread Smart成功支持ARM Mali GPU

嵌入式图形解决方案升级!RT-Thread Smart成功支持ARM Mali GPU

同时使用 2 个 GPU 调用 cudaMalloc 时性能不佳

Mali GPU OpenGL ES 应用性能优化--基本方法