先日のマルチGPUの話の続きみたいな話になりますが,MicrosoftのDirectX blogで”Rise of the Tomb Raider”のマルチGPUの事例が紹介されていました.

Rise of the Tomb Raider, Explicit DirectX 12 MultiGPU, and a peek into the future
https://blogs.msdn.microsoft.com/directx/2016/07/08/rise-of-the-tomb-raider-explicit-directx-12-multigpu-and-a-peek-into-the-future/

“Rise of the Tomb Raider”ではマルチGPU向けの実装をしているようで,Direct3D11との比較などが記事では紹介されていますが,実装的にはその次の記事にあるような技術をつかったようです.

Explicit DirectX 12 MultiGPU, the Affinity Layer helper library, and your game
https://blogs.msdn.microsoft.com/directx/2016/07/13/explicit-directx-12-multigpu-the-affinity-layer-helper-library-and-your-game/

Microsoftではこの仕組みをAffinity Layerと呼ぶとのことで,そのライブラリをGitHubで公開しています.

The D3D12 MultiGPU Starter Library
https://github.com/Microsoft/DirectX-Graphics-Samples/tree/master/Libraries/D3DX12AffinityLayer

このライブラリでは,Alternate Frame Rendering (AFR)を簡単に実装できるもののようです.AFR自体は用語的にはSLIが登場したぐらいからあった用語で,複数のGPUでGPUごとにレンダリングするフレームを分担することでフレームレートを出す手法です.日本語でいうと「交互フレームレンダリング」みたいな感じでしょうか?

この技術では,1つ目のGPUがレンダリングを開始して50%ぐらいのところに来たら次のフレームのレンダリングを次のGPUで行うというような実装のようです(奇数フレームはGPU0,偶数フレームはGPU1みたいな感じで).

この技術はSLI/Crossfireなどで専用のブリッジケーブルを通じて、複数のGPUのVRAM上にゲームのVRAMを高速にミラーリングすることで実現します.従来は,こうした技術の使用にはGPUベンダーのSDKを組み込んで実装していましたが,Direct3D12ではAPI標準機能で実装できるようになったようですね.

マルチGPUの活用方法はあるとは思いますが,AFRはあまり実装者にとって手間が少ないので商業アプリケーションではマルチGPU対応としては工数がつくなくて好まれる手法とは思います.

一方,VulkanやOpenGLはどうするの?というと情報として把握できていないのですが,OpenGL RegistryにNVIDIAがちょうどタイムリーな拡張を公開していました.これはGPUベンダーの実装した手法ではありますが,ベンダー拡張からARB拡張などへ昇格していくと標準的に使えるテクニックになるかもしれませんね.

NV_gpu_multicast
https://www.opengl.org/registry/specs/NV/gpu_multicast.txt