web-dev-qa-db-ja.com

マルチGPUプログラミングはVulkanでどのように機能しますか?

VulkanでマルチGPUを使用することは、多くのコマンドキューを作成し、それらの間でコマンドバッファーを分割するようなものでしょうか?

2つの問題があります:

  1. OpenGLでは、GLEWを使用して関数を取得します。複数のGPUを使用する場合、各GPUには独自のドライバーがあります。 Vulkanをどのように使用しましたか?
  2. フレームの一部はGPUで生成され、他のGPUはIntel GPUを使用してUIとAMDをレンダリングしたり、Nvidia GPUを使用してラボトップでゲーム画面をレンダリングしたりしますか?または、フレームがGPUで生成され、次のフレームが別のGPUで生成されますか?
19
Egy Prot

Vulkanが存在するようになったため、より最近の情報で更新されました。

マルチGPUセットアップには、複数のGPUがSLIスタイルのセットアップの一部である場合とそうでない場合の2種類があります。 Vulkanは両方をサポートし、同じコンピューターで両方をサポートします。つまり、SLI化された2つのNVIDIA GPUと、Intel組み込みGPUを使用でき、Vulkanはそれらすべてと対話できます。

非SLIセットアップ

Vulkanには、Vulkanインスタンスと呼ばれるものがあります。これは、基本のVulkanシステム自体を表しています。個々のデバイスはインスタンスに登録されます。 Vulkanインスタンスシステムは、基本的にVulkanSDKによって実装されます。

物理デバイスは、GPUへのインターフェイスを実装する特定のハードウェアを表します。 Vulkan実装を公開するハードウェアの各部分は、その物理デバイスをインスタンスシステムに登録することによって公開します。使用可能な物理デバイスと、それらに関するいくつかの基本的なプロパティ(名前、提供されるメモリの量など)を照会できます。

次に、使用する物理デバイス用の論理デバイスを作成します。論理デバイスは、Vulkanで実際に作業を行う方法です。それらにはキュー、コマンドバッファなどがあります。そして、各論理デバイスは別々です...ほとんど。

これで、「インスタンス」全体をバイパスして、デバイスを手動でロードできます。しかし、あなたは本当にすべきではありません。少なくとも、開発が終了していない限り、そうではありません。 Vulkanレイヤーは、日常のデバッグには非常に重要であり、オプトアウトすることはできません。

Vulkan 1.1のコアには、個々のデバイスが一部の情報を他のデバイスと通信できるようにするメカニズムがあります。 1.1では、特定の種類の情報のみを物理デバイス間で共有できます(つまり、フェンスとセマフォ、さらにはLinux上で同期ファイルを介してのみ)。これらのAPIは、2つの物理デバイス間でデータを共有するためのメカニズムを提供できますが、現在、ほとんどの形式のデータ共有に対する制限は、両方の物理デバイスが一致するUUIDを持っている必要があることです(したがって、同じ物理デバイスです)。

SLIセットアップ

SLIの処理は、2つのVulkan1.0拡張機能でカバーされています。KHR_device_groupおよびKHR_device_group_creation。前者はVulkanの「デバイスグループ」を処理するためのものであり、後者はデバイスグループ化されたデバイスを作成するためのインスタンス拡張です。これらは両方ともVulkan1.1のコアです。

これに関する考え方は、SLI集約が単一のVkDeviceとして公開され、それが複数のVkPhysicalDevicesから作成されるというものです。各内部物理デバイスは「サブデバイス」です。サブデバイスとそれらに関するいくつかのプロパティをクエリできます。メモリ割り当ては、特定のサブデバイスに固有です。リソースオブジェクト(バッファとイメージ)はnotサブデバイスに固有ですが、異なるサブデバイス上の異なるメモリ割り当てに関連付けることができます。

コマンドバッファとキューはサブデバイスに固有のものではありません。キューでCBを実行すると、ドライバーはそれが実行されるサブデバイスを特定し、イメージ/バッファーを使用する記述子に、それらのイメージ/バッファーが持つメモリ用の適切なGPUポインターを入力します。それらの特定のサブデバイスにバインドされています。

代替フレームレンダリングとは、あるサブデバイスから生成された画像を1つのフレームに表示し、次に別のサブデバイスからの画像を別のフレームに表示することです。分割フレームレンダリングは、より複雑なメカニズムによって処理されます。このメカニズムでは、デバイス間で分割されるレンダリングコマンドの宛先イメージのメモリを定義します。見栄えのする画像でこれを行うこともできます。

26
Nicol Bolas
  1. Vulkanでは、デバイスを列挙して、操作するデバイスを選択する必要があります。 2つの異なるものを別々に操作しようとすることを妨げるものは何もありません。各vulkan呼び出しには、コンテキストとして少なくとも1つのパラメーターが必要です。その後、ローダーレイヤーは呼び出しを正しいドライバーに転送します。または、ローダーのトランポリンを回避するために、各デバイスの機能を個別にロードすることもできます。

  2. 生成されたフレームは、表示のために画面に接続されているカードに転送する必要があります。したがって、1つのGPUがグラフィックスを担当し、他のGPUが物理学に使用される可能性が高くなります。

    一度に特定のサーフェスに接続できるデバイスは1つだけなので、デバイスはレンダリングされたフレームを取得して、画面にプッシュされるレンダリング可能な画像にコピーする必要があります。

6
ratchet freak