Metal 中的线程和线程组
Threads and threadgroups in Metal
我对每个线程组的线程和线程组的数量有一些疑问。
因为我们有maxTotalThreadsPerThreadgroup
和threadExecutionWidth
,线程组的length * width * height
应该等于maxTotalThreadsPerThreadgroup
。那么,如果我有 maxTotalThreadsPerThreadgroup = 1024
和 threadExecutionWidth = 32
,那么如果我创建一个大小为 (1024 * 1 * 1)
或 32 * 32 * 1
的线程组会有什么区别?总 GPU 执行时间是否有任何额外好处?或者这只是为了更有效的管理?
如果我想 运行 个线程多于 maxTotalThreadsPerThreadgroup
个,那么我将创建多个线程组。假设 ThreadGroup1
将在 ThreadGroup2
之前执行是否安全?
我不是 Metal 计算的权威来源,很多细节都没有记录,所以请对以下内容持保留态度:
将线程组组织成 1、2 或 3 维主要是为了方便您作为开发人员。如果您的问题是 three-dimensional,请使用具有 3 个维度的线程组。如果您的问题是 one-dimensional,请使用一维线程组。 Metal 并不真正关心其中一种方式。
我认为您无法假设线程组中 GPU 线程的调度顺序。
例如,如果您安排 10 个线程组,每个线程组计算一个中间结果(例如求和),那么您可能不应该依赖第 10 个线程组来收集这些结果并将它们组合成一个最终结果(最终金额)。相反,您必须启动一个新的计算内核才能执行此操作。
(我很高兴被证明是错误的,但我没有在任何地方读到 Metal 保证这种事情。)
我对每个线程组的线程和线程组的数量有一些疑问。
因为我们有
maxTotalThreadsPerThreadgroup
和threadExecutionWidth
,线程组的length * width * height
应该等于maxTotalThreadsPerThreadgroup
。那么,如果我有maxTotalThreadsPerThreadgroup = 1024
和threadExecutionWidth = 32
,那么如果我创建一个大小为(1024 * 1 * 1)
或32 * 32 * 1
的线程组会有什么区别?总 GPU 执行时间是否有任何额外好处?或者这只是为了更有效的管理?如果我想 运行 个线程多于
maxTotalThreadsPerThreadgroup
个,那么我将创建多个线程组。假设ThreadGroup1
将在ThreadGroup2
之前执行是否安全?
我不是 Metal 计算的权威来源,很多细节都没有记录,所以请对以下内容持保留态度:
将线程组组织成 1、2 或 3 维主要是为了方便您作为开发人员。如果您的问题是 three-dimensional,请使用具有 3 个维度的线程组。如果您的问题是 one-dimensional,请使用一维线程组。 Metal 并不真正关心其中一种方式。
我认为您无法假设线程组中 GPU 线程的调度顺序。
例如,如果您安排 10 个线程组,每个线程组计算一个中间结果(例如求和),那么您可能不应该依赖第 10 个线程组来收集这些结果并将它们组合成一个最终结果(最终金额)。相反,您必须启动一个新的计算内核才能执行此操作。
(我很高兴被证明是错误的,但我没有在任何地方读到 Metal 保证这种事情。)