c# - 为 .NET 应用启用高性能 GPU

标签 c# c++ windows nvidia

用户提示我的应用程序(使用 Direct3D 11 渲染一些重型 3D 内容以获得类似 CAD 的功能)在双 GPU 系统上的 Intel GPU 上运行。

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

还有其他想法吗?

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

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

最佳答案

我制作了一个带有自定义 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 属性:

  1. SHIM_MCCOMPAT_ID = SHIM_MCCOMPAT_ENABLE
  2. SHIM_RENDERING_MODE_ID = SHIM_RENDERING_MODE_ENABLE
  3. 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 字段中的路径“规范化”,将它们转换为小写,并将 '\' 替换为 '/'。由于这种“规范化”,没有标准的字符串比较函数适用于它们。

关于c# - 为 .NET 应用启用高性能 GPU,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40892815/

相关文章:

c++ - 在 Objective C++ 代码中在 objc 整数和 C++ 枚举之间转换

c++ - 在 C++ 中将多个数字读入单个有符号字符

c++ - Win32 C/C++ 检查同一程序的两个实例是否使用相同的参数

c# - 创建本地用户帐户

c# - 在 T4 模板中使用类

c# - 注册动态类型的简单注入(inject)器

c++ - 为什么我不能在 mac 上使用 g++ 运行这个简单的 c++ 代码?

c - 如果从另一个文件夹调用程序将无法工作

c# - 在部分限制器/短语之间获取文本

c# - 将视频从 pi 相机流式传输到 unity 项目