Metal 中的线程和线程组

Threads and threadgroups in Metal

我对每个线程组的线程和线程组的数量有一些疑问。

  1. 因为我们有maxTotalThreadsPerThreadgroupthreadExecutionWidth,线程组的length * width * height应该等于maxTotalThreadsPerThreadgroup。那么,如果我有 maxTotalThreadsPerThreadgroup = 1024threadExecutionWidth = 32,那么如果我创建一个大小为 (1024 * 1 * 1)32 * 32 * 1 的线程组会有什么区别?总 GPU 执行时间是否有任何额外好处?或者这只是为了更有效的管理?

  2. 如果我想 运行 个线程多于 maxTotalThreadsPerThreadgroup 个,那么我将创建多个线程组。假设 ThreadGroup1 将在 ThreadGroup2 之前执行是否安全?

我不是 Metal 计算的权威来源,很多细节都没有记录,所以请对以下内容持保留态度:

  1. 将线程组组织成 1、2 或 3 维主要是为了方便您作为开发人员。如果您的问题是 three-dimensional,请使用具有 3 个维度的线程组。如果您的问题是 one-dimensional,请使用一维线程组。 Metal 并不真正关心其中一种方式。

  2. 我认为您无法假设线程组中 GPU 线程的调度顺序。

例如,如果您安排 10 个线程组,每个线程组计算一个中间结果(例如求和),那么您可能不应该依赖第 10 个线程组来收集这些结果并将它们组合成一个最终结果(最终金额)。相反,您必须启动一个新的计算内核才能执行此操作。

(我很高兴被证明是错误的,但我没有在任何地方读到 Metal 保证这种事情。)