このページは本編の5章9節(ステージングバッファ)の内容の補足です。一応3章あたりまでの知識でも理解はできると思います。
デバイスメモリの実体
Vulkanにおいて登場するデバイスメモリというものの正体はいったい何なのか、という話をします。
その前に、そもそもVulkanとは何かというのを改めて説明します。
Vulkanとは、GPUのようなグラフィックスおよび計算に特化した外部機器を制御するためのAPIです。このときの制御する外部機器のことをVulkanの用語でデバイスと呼んでいます。
では次にデバイスメモリとは何かというと、5章のはじめに書いたのですが、これはデバイスからアクセスできるメモリ一般を表します。そしてその実体としては、必ずしもグラボに載っている所謂「VRAM」とは限らないし、メインメモリの場合もあります。「デバイスからアクセス可能である」という特性をもってデバイスメモリなのです。
5章9節を読んだ方で勘の良い人はなんとなく察しているのではないでしょうか。
ホスト可視なデバイスメモリはだいたいメインメモリです。
デバイスローカルなデバイスメモリはだいたいビデオメモリ(VRAM)です。
ステージングバッファの節でやったことは要するに、「データをメインメモリからVRAMに移す」というだけの話だったのです。
これでホスト可視とデバイスローカルの謎が解けました。
VulkanはAPIである
では、なぜVulkanは「メインメモリ」「ビデオメモリ」といった直接的な言葉を使わずに「ホスト可視」「デバイスローカル」などという迂遠な概念を定義してこねくり回しているのでしょうか。
それは、VulkanはあくまでAPIだからです。
API(Application Programming Interface)、アプリケーションプログラムから機能を触るためのインターフェース。インターフェースでしかないということは、実際に内部で何が起きるかは関知しないということです。
だからVulkanは「CPU」「GPU」ではなく「ホスト」「デバイス」という抽象概念を用いるし、「メインメモリ」ではなく「ホストからアクセスできるメモリ=ホスト可視」、「ビデオメモリ」ではなく「デバイスからのアクセスに最適なメモリ=デバイスローカル」として、その実体ではなく特性をもって概念を定義しているのです。
ご理解いただけましたでしょうか。
余談: CPU内蔵型のGPUについて
外付けGPUを付けていないPCであるとか、あるいは大きなGPUを付けられないノートパソコンなどの場合、だいたい画面出力のためにCPU内蔵のGPUが動いています。自作PCをする人なんかは割と知っている知識かもしれません。
こうしたタイプのGPUの場合、内部的にはメインメモリをそのままビデオメモリとして使っています。ということは、どのデバイスメモリに置いても変わりません。全部デバイスローカルです。
そういうわけなので、ノートパソコンなどでVulkanの開発をしている人はもしかしたらステージングバッファを使っても使わなくても性能が特に変わらないかもしれません。