LoginSignup
7
10

More than 5 years have passed since last update.

Optimus搭載機でハイパフォーマンスGPUを自動的に使用するアプリの作り方

Last updated at Posted at 2016-04-12

概要

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搭載機ではない環境で特に困った副作用が発生する事はない。

Reference

7
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
10