如何在 Vulkan 中适当设置工作组计数

How to set work group count appropriately in Vulkan

以前有一个参数叫CL_DEVICE_MAX_COMPUTE_UNITS,可以在OpenCL中调用clGetDeviceInfo查询,它表示OpenCL设备上并行计算单元的数量,作为一个单一的工作组在单个计算单元上执行。

但是,似乎没有办法在 Vulkan 中查询该参数。

还是我遗漏了一些东西,因为它实际上可以查询?或者我们通常在输入大小不确定的情况下任意选择一个默认值(比如256)?

Vulkan 没有办法问那个问题。这可能是最好的。

首先,即使在 OpenCL 中,"compute unit" 的概念也没有得到很好的定义。所以这个值到底是什么意思不太好理解。

其次,如果你真正想问的问题是"how many work groups can execute in parallel at any one time",那么答案可能取决于着色器。例如,如果一个硬件可以在单个计算单元上执行 32 个工作项,它可能能够从 distinct 个工作组中填充这 32 个工作项。也就是说,您认为 "a single work-group executes on a single compute unit" 不一定正确。

如果着色器的工作组大小为 16,则 运行 它们同时存在几乎不会丢失。当然,不同的屏障使用 可能 导致它们分开,但也可能不会。与其假设它不会起作用,不如抓住它会起作用的机会。

第三...您打算如何处理这些信息?如果您有 X 个工作组要执行,在 CL_DEVICE_MAX_COMPUTE_UNITS 组中发出多个调度命令不会使这个过程进行得更快。并且由于必须重置管道或其他状态,尝试从不同的计算任务中交错工作组将会变慢。最好在 GPU 上完成整个工作,让其调度程序整理出如何将工作项应用到工作组。