能否以简单的方式解释Metal计算着色器中的线程组概念以及其他术语,例如SIMD组、threadExecutionWidth(波前)?我已经阅读了文档,但仍感到困惑。例如,如果我有一个1024x1024的图像,我可以有多少个线程组,如何将线程映射到每个像素,可以同时运行多少个线程等等?我找不到描述计算着色器和这些概念的WWDC视频。
能否以简单的方式解释Metal计算着色器中的线程组概念以及其他术语,例如SIMD组、threadExecutionWidth(波前)?我已经阅读了文档,但仍感到困惑。例如,如果我有一个1024x1024的图像,我可以有多少个线程组,如何将线程映射到每个像素,可以同时运行多少个线程等等?我找不到描述计算着色器和这些概念的WWDC视频。
线程组是一组协同工作以解决某个(子)问题的线程。您可以在线程组中拥有最多512
或1024
个线程(取决于您使用的设备)。
threadExecutionWidth
是所使用的SIMD组的大小。它通常为32
,这意味着每个SIMD组中有32
个线程。为了实现最佳性能,您的线程组中的线程数应该是threadExecutionWidth
的倍数。(这确实就是其他人所称的wavefront或warp)。
如果您有一个1024x1024
像素的图像,并且您希望一个线程处理一个像素,而最大线程组大小为512
,那么您可以创建一个由32x64
大小为32x16
(即512
)的线程组组成的1024x1024
线程网格。
但实际上,您可以按任何方式划分线程。您也可以拥有一个由2x1024
大小为512x1
的线程组组成的网格,或其他任何方式。
MTLComputePipelineState.maxTotalThreadsPerThreadgroup
来了解实际最大值。 - whlteXbread