Vulkan计算着色器的最大线程数



如何使用Vulkan查询可能的线程/调用的最大数量?如果超过这个数会怎样?

这取决于你所说的" maximum number "是什么意思。你可能有两种意思。

  1. 在任何一个调度调用中可以执行的最大调用总数。

    调度调用执行一定数量的工作组,其中执行一定数量的工作项(又名:调用)。后者在着色器本身的local_size_x/y/z声明中定义。这些都受到maxComputeWorkGroupInvocations的限制。即local_size_x/y/z的乘积必须小于等于该值。

    然而,每个这些x/y/z维度本身都受到maxComputeWorkGroupSize定义的限制。这是一个包含3个值的数组,分别限制x/y/z。也就是说,每个维度都不能超过该限制所定义的限制。

    也就是说,这些限制的乘积将大于maxComputeWorkGroupInvocations,所以这是您应该注意的限制。

    给定的调度调用调度一定数量的工作组,这些工作组本身具有x/y/z索引。每个维度上的最大数量由maxComputeWorkGroupCount数组定义。没有单数限制,所以每个数组元素的乘积定义了您可以分派的最大组数。

    因此,调度调用可以执行的调用总数为:(maxComputeWorkGroupCount[0] * maxComputeWorkGroupCount[1] * maxComputeWorkGroupCount[2]) * maxComputeWorkGroupInvocations.

  2. 可以在单个执行核心上同时执行的最大调用数。这将有助于优化工作组大小,并了解有多少调用可以方便地共享数据,而无需过度同步。

    该号码技术上无法查询。但是,您可以查询一些可能表示该数字的内容。

    Vulkan 1.1增加了可以从物理设备查询的subgroupSize属性。一个"subgroup"是一组可以相互通信的调用。这个变量定义了默认的子组大小。

    可能与可以同步执行的调用数相同。但它主要用于子组间通信,所以如果GPU不提供此功能,则可能将此设置为1。这是而不是可以在该硬件上同步执行的调用数。因此,使用它的风险自担风险。

maxComputeWorkGroupCount显示了全局工作组的最大大小。maxComputeWorkGroupSize表示本地工作组的最大大小。maxComputeWorkGroupInvocations显示本地工作组调用的最大值。

如果超过这些数字,则为未定义行为。

最新更新