概要
Optimus 搭載機ではユーザーが NVIDIA コントロールパネルから手作業でアプリのカスタム動作を追加定義しなければ一般的なグローバル設定から統合型グラフィックス(intel HD Graphics)でアプリが実行される。
Optimus 搭載機でハイパフォーマンスGPU(NVIDIA GeForce)をデフォールトで使用したいアプリではどうすればよいか日本語の情報を掲載する。
ハイパフォーマンスGPUを強制する方法
エントリーポイント(≈ main
関数)を含む実行ファイルのソースに次のようなソースを1つ追加する。
- optimus.cxx
# ifdef _WIN32
#include <windows.h>
# endif
# include <cstdint>
extern "C"
{
# ifdef _WIN32
__declspec( dllexport )
DWORD
# else
std::uint32_t
# endif
NvOptimusEnablement = 0x00000001;
}
なお、_WIN32
以外の環境向けのコードはプログラム内での定義の互換性のために記してあるだけなので、明らかに Windows でしか使わないソースの場合は #ifdef
などは特にコードする必要はない。
シンボルの確認
TDM-GCC(mingw) 処理系でビルドしたアプリの nm
を確認するとグローバルに NvOptimusEnablement
データシンボルを確認できる。
$ nm bin/my_app.exe | grep NvOp
00000000007f2210 D NvOptimusEnablement
これを Optimus 搭載機で実行すると、NVIDIA コントロールパネルで手作業の設定追加が行われいない状態でもグローバル設定により統合型グラフィックスが使われる事なくハイパフォーマンスGPUが使われるようになる。
もちろん、単なるグローバルなデータシンボルのエントリーが実行ファイルに追加されるだけなので、Optimus搭載機ではない環境で特に困った副作用が発生する事はない。