Vulkan Spec では、サブグループを次のように定義しています。
Note
|
互いのデータを効率的に同期・共有できるシェーダ呼び出しのセット。コンピュートシェーダでは、ローカルワークグループはサブグループのスーパーセットとなる。 |
多くの実装では、サブグループとは、同じ命令を一度に実行する呼び出しのグループのことです。サブグループを使うことで、シェーダを書く際に単一のワークグループよりも細かい粒度で作業することができます。
サブグループの詳細については、Khronos のブログ記事や Vulkan Developer Day 2018のプレゼンテーション(スライドとビデオ)をご覧ください。GLSL のサポートについては、GL_KHR_shader_subgroup 拡張機能があります。
サブグループのサイズは、実装によって動的に変化する可能性があることも重要です。実装によっては、サブグループごとに、異なるサブグループサイズでシェーダをディスパッチすることがあります。その結果、大きなサブグループをより小さなサブグループに暗黙的に分割したり、小さなサブグループをより大きなサブグループとして表現したり、起動時にその一部が非アクティブになったりする可能性があります。
Note
|
Vulkan 1.3でコアに昇格 |
この拡張機能は、いくつかの実装が複数のサブグループサイズを持つものの、Vulkan がもともと単一のサブグループサイズしか公開しないという理由で作成されました。
たとえば、ある実装がサイズ 4
と 16
の両方のサブグループをサポートしている場合、以前はどちらか一方のサイズのみを公開する必要がありましたが、現在は両方を公開することができます。これにより、複数のサブグループサイズを公開する実装では、アプリケーションがより細かい粒度でハードウェアを制御できる可能性があります。デバイスがこの拡張をサポートしていない場合は、おそらくサポートされているサブグループサイズが1つだけであることを意味します。
Vulkan 1.1では、サブグループのすべての情報は、VkPhysicalDeviceSubgroupProperties
にあります。
VkPhysicalDeviceSubgroupProperties subgroupProperties;
VkPhysicalDeviceProperties2KHR deviceProperties2;
deviceProperties2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2;
deviceProperties2.pNext = &subgroupProperties;
vkGetPhysicalDeviceProperties2(physicalDevice, &deviceProperties2);
// フラグメントシェーダでサポートされているかどうかを確認する例
if ((subgroupProperties.supportedStages & VK_SHADER_STAGE_FRAGMENT_BIT) != 0) {
// フラグメントシェーダに対応している
}
// バロットがサポートされているかどうかを確認する例
if ((subgroupProperties.supportedOperations & VK_SUBGROUP_FEATURE_BALLOT_BIT) != 0) {
// バロットサブグループの操作をサポートしている
}
サポートされているステージでは、Vulkan Spec が以下の対応を保証しています。
Note
|
supportedStages は、物理デバイスのキューに VK_QUEUE_COMPUTE_BIT がサポートされている場合、VK_SHADER_STAGE_COMPUTE_BIT ビットが設定されます。 |
サポートされている操作については、Vulkan Spec が以下の対応を保証しています。
Note
|
supportedOperations は、物理デバイスのキューのいずれかが VK_QUEUE_GRAPHICS_BIT または VK_QUEUE_COMPUTE_BIT をサポートしている場合、VK_SUBGROUP_FEATURE_BASIC_BIT ビットが設定されます。 |
Note
|
Vulkan 1.2でコアに昇格 |
この拡張機能により、サブグループスコープを持つグループ操作で、8ビット整数、16ビット整数、64ビット整数、16ビット浮動小数点、およびこれらの型のベクターを使用できるようになります。