如何使用Vulkan查询可能的线程/调用的最大数量?如果超过这个数会怎样?
这取决于你所说的" maximum number "是什么意思。你可能有两种意思。
-
在任何一个调度调用中可以执行的最大调用总数。
调度调用执行一定数量的工作组,其中执行一定数量的工作项(又名:调用)。后者在着色器本身的
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
. -
可以在单个执行核心上同时执行的最大调用数。这将有助于优化工作组大小,并了解有多少调用可以方便地共享数据,而无需过度同步。
该号码技术上无法查询。但是,您可以查询一些可能表示该数字的内容。
Vulkan 1.1增加了可以从物理设备查询的
subgroupSize
属性。一个"subgroup"是一组可以相互通信的调用。这个变量定义了默认的子组大小。它可能与可以同步执行的调用数相同。但它主要用于子组间通信,所以如果GPU不提供此功能,则可能将此设置为1。这是而不是可以在该硬件上同步执行的调用数。因此,使用它的风险自担风险。
maxComputeWorkGroupCount
显示了全局工作组的最大大小。maxComputeWorkGroupSize
表示本地工作组的最大大小。maxComputeWorkGroupInvocations
显示本地工作组调用的最大值。
如果超过这些数字,则为未定义行为。