Вопрос по c++, nvidia – Принудительное использование графического процессора NVIDIA в ноутбуках Optimus

24

Я программирую игру DirectX, и когда я запускаю ее на ноутбуке Optimus, используется графический процессор Intel, что приводит к ужасной производительности. Если я заставлю графический процессор NVIDIA с помощью контекстного меню или переименую свой исполняемый файл в bf3.exe или в другое известное имя исполняемого файла игры, производительность будет такой, как и ожидалось.
Очевидно, что и то, и другое не является приемлемым решением, когда мне приходится распространять свою игру, так есть ли способ программно заставить ноутбук использовать графический процессор NVIDIA?

Я уже пытался использовать DirectX для перечисления адаптеров (IDirect3D9 :: GetAdapterCount, IDirect3D9 :: GetAdapterIdentifier), и он не работает: сообщается только об одном GPU (используемом).

Ваш Ответ

2   ответа
34

В соответствии сhttp://developer.download.nvidia.com/devzone/devcenter/gamegraphics/files/OptimusRenderingPolicies.pdf начиная с 302 драйверов, достаточно статически связать одну из следующих библиотек:vcamp110.dll, vcamp110d.dll, nvapi.dll, nvapi64.dll, opencl.dll, nvcuda.dll, cudart*.*или экспортировать переменную NvOptimusEnablement в вашу программу:

extern "C" {
    _declspec(dllexport) DWORD NvOptimusEnablement = 0x00000001;
}
Это больше не работает (GTX 960M - драйвер v385.41)
+1 для переменной включения (и соответствующей ссылки); Примечание: не работал для моего 310-драйвера, но работал после обновления до 320
Следует отметить, что в настройках предпочитаемого графического процессора на панели управления NVIDIA должно быть установлено «Автоматический выбор». чтобы это работало.
5

Оптимус в Белой книге наhttp://www.nvidia.com/object/LO_optimus_whitepapers.html неясно, что именно нужно сделать, чтобы переключиться на GPU. В официальном документе говорится, что вызовы DX, DXVA и CUDA обнаружены и приведут к включению графического процессора. Но кроме того, решение основано на профилях, поддерживаемых NVIDIA, и, конечно же, для вашей игры еще нет.

Одна вещь, которую можно попробовать, это сделать вызов CUDA, например,cuInit(0);, В отличие от DX и DXVA, интегрированная графика Intel не может справиться с этим, поэтому она должна принудительно переключиться на графический процессор.

У кого-нибудь был реальный успех с этим методом? Я просто пытался позвонитьcuInit перед созданием моего контекста OpenGL, и я получаю контекст Intel, а не NVidia.
Я использую Win7 home x64 SP1 + драйверы NVidia 296.16. Я совершенно не знаю, как поступить:NVIDIA CUDA Developer Guide for NVIDIA Optimus Platforms В документе упоминается, что привязка контекста OpenGL к CUDA не работает на платформах Optimus, в нем говорится, что для этого вам требуется «профиль приложения». в панели управления NVidia ... Возможно, NVAPI позволяет программно создавать такой профиль, но веб-сайт разработчика NVidia отключен от банкомата.
@rotoglup: Пожалуйста, дайте нам знать, какую ОС вы используете, и, если вы найдете решение, добавьте его в качестве ответа на этот вопрос.

Похожие вопросы