同期は、Vulkan を使用する上で最も強力な部分の一つですが、同時に最も複雑な部分でもあります。アプリケーションは、さまざまな Vulkan 同期プリミティブを使用して同期を管理する責任があります。同期の使い方を誤ると、見つけにくいバグが発生したり、GPUが不必要にアイドル状態になってパフォーマンスが低下したりします。
同期の例とVulkan Synchronization の理解というブログ記事が Khronos によって提供されており、同期プリミティブの使用方法が紹介されています。また、Tobias Hector 氏による過去の Vulkan に関する講演のプレゼンテーションもあります。パート1スライド (動画) とパート2スライド (動画)
以下は VkEvent
、VkFence
、VkSemaphore
の違いを示す概要図です。
Khronos Validation Layer は、同期の検証を実装しています。これは、Vulkan SDK に含まれる Vulkan Configurator で簡単に有効にすることができます。同期の検証については、詳細なホワイトペーパーが作成され、Khronos Blog として公開されています。
パイプラインバリアは、コマンドバッファが実行される際に、どのパイプラインステージが前のパイプラインステージを待つ必要があるかを制御します。
パイプラインバリアは、最初は理解しにくいかもしれませんが、Khronos の講演やその他のリソースには、このテーマについてより深く掘り下げたものがたくさんあります。
-
Vulkanised 2018 - Low-level mysteries of pipeline barriers (動画)
-
Vulkanised 2019 - Live Long and Optimise (動画) Pipeline Analysis はスライドの12ページから
VK_KHR_synchronization2
拡張機能は、アプリケーション開発者にとっての複雑さを軽減するために、オリジナルのコア同期 API を見直し、オリジナルの API には無い機能を追加しています。
同期 API の違いや、新しい拡張機能への移行方法については、VK_KHR_synchronization2 の章を参照してください。