なぜ2 GPUなのか?
2つのGPUを搭載したラップトップは、かなり前に登場しました。 このテクノロジーを搭載した最初のMacBook Proは、2008年にリリースされました。
2つのGPUの利点は柔軟性です。 ビデオシステムのフルパワーを必要としないときは、プロセッサに組み込まれたビデオを使用し、バッテリー寿命を長くします。 ただし、楽しみたい場合は、強力なディスクリートGPUが利用できます。 はい、彼はバッテリーを食べてファンと騒ぎますが、ゲームでは良いFPSを与えます。 1つのアプリケーションでGPUを切り替えるにはどうすればよいですか?
理論的には、ビデオカードの負荷が変化すると、自動的に切り替えが行われます。 ただし、実際には、すべてがそれほど単純ではありません。
Windowsでは、ビデオカードのドライバーが切り替えを担当します。 彼らは好みの設定でたくさんのゲームとアプリケーションを綴りました。 また、ユーザーは、強力なディスクリートGPUをいつ使用するか、そしていつ静かに作業したいかを選択できます。
OS Xでは、切り替えはすべて追加です。 そもそも、OS XのドライバーはApple自身によって作成されています。
ところで、これは非常に古いバージョンのOpenGLのようなインシデントにつながります。 そして、この状況を是正するための請願はありません。

gfxCardStatus
OS Xでは、どのGPUが現在動作しているかを把握することさえできません。 賑やかなファンなら。
幸い、優れたユーティリティgfxCardStatusがあり 、どのビデオカードがアクティブであるかを示し、それらを切り替えることもできます。
ディスクリートGPUがオンになると、ユーティリティはどのアプリケーションが切り替えを引き起こしたかを示します。
問題とホワイトペーパーを切り替える
OS Xでは、切り替えは自動的に行われることが理解されています。
たとえば、Safariは通常、組み込みのGPUを使用します。 ただし、WebGLを使用してサイトにアクセスすると、ディスクリートGPUに切り替わります。
ただし、自分で操作モードを選択できるアプリケーションを作成したい場合は、不愉快な驚きがあります。
そもそも、 公式のドキュメントでは、正しく切り替える方法の質問には答えていません。 この場合、非常に奇妙なことが書かれています。 ただし、ドキュメントには、情報を検索するための一連のキーワードが用意されています。
クロム溶液
この問題を解決できた優れたオープンソースのクロムプロジェクトがあります。 OpenGLコンテキストを初期化するときに、kCGLPFAAllowOfflineRenderersフラグを使用してCGLPixelFormatObjを作成する必要があります。 この場合、現在の(組み込みの)GPUが使用されます。
個別のGPUに切り替えたい場合は、フラグなしでCGLPixelFormatObjを作成するだけです。 OpenGLコンテキストでさえ必要ありません。 組み込みGPUに戻るには、単にこのCGLPixelFormatObjを削除します。
CGLContextObj ctx; CGLPixelFormatObj pix; GLint npix; std::vector<CGLPixelFormatAttribute> attribs; // Use current GPU attribs.push_back(kCGLPFAAllowOfflineRenderers); // comment this line for discrete GPU attribs.push_back((CGLPixelFormatAttribute) 0); CGLError err = CGLChoosePixelFormat(&attribs.front(), &pix, &npix); CGLCreateContext(pix, NULL, &ctx); CGLSetCurrentContext(ctx); ....
しおり
ほとんど機能するテストアプリケーションを作成しました。 なぜほとんど? CGLPixelFormatObjを削除しても、組み込みGPUに切り替えられなかったためです! また、クロムがやった。
Windows用のNvidiaドライバーにはクロムの特別な設定があり、exeの名前でクロムを定義することがわかっているので、ここで似たようなものを期待しました。
OS Xでは、アプリケーションを定義するより信頼性の高い方法、バンドルIDがあります。 そして、アプリケーションのバンドルIDをorg.chromium.Chromiumに変更すると、見よ、すべてが正常に機能します。
最も厄介なのは、正しいバンドルIDがないと、組み込みGPUに戻すことができないことです。 そして、これは単なるセットアップではなく、良いプログラムを書くための深刻な問題です。
バンドルID:com.apple.Safariも機能します。 彼らは自分の世話をしました。
ただし、com.operasoftware.Operaは機能しません。 その結果、Operaでも同じ動作が観察されます。キャプチャすると、貪欲なタブを閉じても個別のGPUがリリースされることはありません。 統合GPUに戻る唯一の方法は、アプリケーションを閉じることです。
テストアプリケーションとビデオ
異なるバンドルIDを持つプログラムの動作の違いを確認できるテストアプリケーションは、 ここからダウンロードできます 。
問題を再現したビデオも撮影しました。
解決策
問題を解決する方法は? システムごとにアクティブなGPUが1つあるため、ディスクリートGPUが必要な場合は別個のプロセスを作成できます。 統合GPUに戻る必要がある場合は、このプロセスを完了します。