【发布时间】:2021-08-04 14:56:44
【问题描述】:
如何使用 Vulkan 查询可能的线程/调用的最大数量。 如果我超过了这个数字会怎样?
【问题讨论】:
标签: gpu vulkan compute-shader
如何使用 Vulkan 查询可能的线程/调用的最大数量。 如果我超过了这个数字会怎样?
【问题讨论】:
标签: gpu vulkan compute-shader
这取决于您所说的“最大数量”。您可能意味着两件事。
在任何一个调度调用中可以执行的最大调用总数。
调度调用执行一些工作组,在这些工作组中执行一些工作项(又名:调用)。后者使用 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 属性。 “子组”是一组可以相互通信的调用。此变量定义默认子组大小。
可能与可以同步执行的调用次数相同。但它主要用于子组间通信,因此如果 GPU 不提供该功能,这可能会设置为 1。不是可以执行的调用数锁定该硬件。所以使用它需要您自担风险。
【讨论】:
maxComputeWorkGroupCount 显示最大全局工作组大小。 maxComputeWorkGroupSize 显示最大本地工作组大小。 maxComputeWorkGroupInvocations 显示最大本地工作组调用次数。
如果超过这些数字,则为未定义行为。
【讨论】: