vulkan 子组中的非活动调用
inactive invocation in subgroups in vulkan
我正在阅读 vulkan subgroup tutorial,它提到如果本地工作组大小小于子组大小,那么我们将始终有不活动的调用。
post 阐明 SubgroupLocalInvocationId
和 LocalInvocationId
之间没有直接关系。如果子组和本地工作组 ID 之间没有关系,那么小的本地工作组如何保证非活动调用?
我的猜测如下
我认为工作组中的调用(线程)在 GPU 上执行之前被分成子组。每个子组都将与 GPU 上的基本执行单元完全匹配(NVIDIA GPU 的扭曲)。这意味着如果工作组大小小于子组大小,那么系统会以某种方式尝试构建一个可以在 GPU 上执行的最小子组。这将需要使用一些“inactive/dead”调用来满足导致上述保证的非活动调用的最小子组大小标准。这种理解是否正确? (为简单起见,我故意尝试使用基本词,如果有任何术语不正确,请告诉我)
谢谢
计算调度使用其参数定义全局工作组。全局工作组有 x×y×z 次调用。
这些调用中的每一个都被分成局部组(由着色器定义)。本地工作组还有另一组 x×y×z 调用。
本地工作组被划分为子组。它的调用被重新排列成子组。一个子组具有(一维)SubgroupSize
次调用,无需为所有调用分配本地工作组调用。并且一个子组不得跨越多个本地工作组;它只能使用来自单个本地工作组的调用。
否则这个分区是如何完成的似乎在很大程度上是未指定的,除了在非常特定的条件下你保证 完整的子组 ,这意味着子组中的调用 none SubgroupSize
的将保持空缺。如果不满足这些条件,则驱动程序可能会在其认为合适的情况下使子组中的某些调用处于非活动状态。
如果本地工作组的调用总数少于 SubgroupSize
,那么子组的一些调用确实需要保持不活动状态,因为可用的本地工作组调用不足以填充一个子组。
我正在阅读 vulkan subgroup tutorial,它提到如果本地工作组大小小于子组大小,那么我们将始终有不活动的调用。
SubgroupLocalInvocationId
和 LocalInvocationId
之间没有直接关系。如果子组和本地工作组 ID 之间没有关系,那么小的本地工作组如何保证非活动调用?
我的猜测如下
我认为工作组中的调用(线程)在 GPU 上执行之前被分成子组。每个子组都将与 GPU 上的基本执行单元完全匹配(NVIDIA GPU 的扭曲)。这意味着如果工作组大小小于子组大小,那么系统会以某种方式尝试构建一个可以在 GPU 上执行的最小子组。这将需要使用一些“inactive/dead”调用来满足导致上述保证的非活动调用的最小子组大小标准。这种理解是否正确? (为简单起见,我故意尝试使用基本词,如果有任何术语不正确,请告诉我)
谢谢
计算调度使用其参数定义全局工作组。全局工作组有 x×y×z 次调用。
这些调用中的每一个都被分成局部组(由着色器定义)。本地工作组还有另一组 x×y×z 调用。
本地工作组被划分为子组。它的调用被重新排列成子组。一个子组具有(一维)SubgroupSize
次调用,无需为所有调用分配本地工作组调用。并且一个子组不得跨越多个本地工作组;它只能使用来自单个本地工作组的调用。
否则这个分区是如何完成的似乎在很大程度上是未指定的,除了在非常特定的条件下你保证 完整的子组 ,这意味着子组中的调用 none SubgroupSize
的将保持空缺。如果不满足这些条件,则驱动程序可能会在其认为合适的情况下使子组中的某些调用处于非活动状态。
如果本地工作组的调用总数少于 SubgroupSize
,那么子组的一些调用确实需要保持不活动状态,因为可用的本地工作组调用不足以填充一个子组。