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

Maximum number of threads of Vulkan compute shader

如何使用 Vulkan 查询可能的最大数量 threads/invocations。 如果我超过这个数字会怎样?

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

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

这取决于你所说的“最大数量”是什么意思。您可能指的是两件事。

  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 属性。 “子组”是一组可以相互通信的调用。此变量定义默认子组大小。

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