首页 > 解决方案 > Metal中的线程和线程组

问题描述

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

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

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

标签: macosgpumetal

解决方案


我不是 Metal 计算的权威来源,并且没有记录很多诸如此类的细节,因此请谨慎对待以下内容:

  1. 将线程组组织成 1、2 或 3 维对作为开发人员的您来说主要是一种方便。如果您的问题是三维的,请使用具有 3 维的线程组。如果您的问题是一维的,请使用一维的线程组。金属并不真正关心一种或另一种方式。

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

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

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


推荐阅读