金属计算着色器线程组和线程执行宽度

Metal compute shaders threadgroup & threadExecutionWidth

谁能用简单的术语解释一下 Metal 计算着色器中线程组的概念以及其他术语,例如 SIMD 组、threadExecutionWidth(波前)?我阅读了文档,但更加困惑。例如,如果我有一张 1024x1024 的图像,我可以有多少个线程组,我如何将线程映射到每个像素,有多少线程可以 运行 并发等等?我找不到描述计算着色器和这些概念的 WWDC 视频。

线程组是一组协同工作以解决某个(子)问题的线程。一个线程组中最多可以有 5121024 个线程(取决于您使用的设备)。

threadExecutionWidth 是使用的 SIMD 组的大小。它通常是 32,这意味着每个 SIMD 组中都有 32 个线程。为了获得最佳性能,线程组中的线程数应该是 threadExecutionWidth 的倍数。 (这确实是别人所说的波前或扭曲。)

如果您有一张 1024x1024 图像并且您希望一个线程处理一个像素,并且最大线程组大小为 512,那么您可以创建一个包含 1024x1024 个线程的网格由 32x64 个大小为 32x16 的线程组组成(即 512)。

但实际上,您可以根据需要划分线程。您还可以有一个 2x1024 个大小为 512x1 或其他大小的线程组的网格。