【问题标题】:How to synchronize between threadgroups in Metal如何在 Metal 中的线程组之间同步
【发布时间】:2015-02-28 19:51:51
【问题描述】:

我想在 Metal 内核中的线程组之间同步写入到 MTLBuffer。我尝试使用atomic_uint 类型和atomic_fetch_add_explicit 函数。这应该可行,但我的问题是我不知道如何解释 CPU 端的值。我更喜欢一种锁定机制,我可以使用它来同步从不同线程组对同一缓冲区的写入。是否存在不受原子类型约束的此类机制或其他一些解决方法?

【问题讨论】:

  • 当您说您无法解释 CPU 端的值时,您的意思并不清楚。如果你有一个uints 的缓冲区,那么它只是一个uint32_t 值的缓冲区(如果使用Obj-C++ 或类似的)。我建议您尽可能避免使用锁定机制,因为它们在 GPU 上很棘手,并且可能性能很差。

标签: ios metal


【解决方案1】:

我在 16 位浮点转换中遇到了类似的问题。

您可以尝试通过从缓冲区中提取原始位来解释 CPU 端的值,与 atomic_uint 的内部格式进行比较,然后尝试使用获得的信息重新转换为您需要的数据类型。肯定是一种低级方法,但在没有其他方法的情况下有效。

【讨论】:

    【解决方案2】:

    锁定通常不起作用,因为并非所有线程组都必须同时处于活动状态。例如,如果您尝试实现自旋锁,您可能只是活锁,因为您的数据的生产者可能尚未启动,假设一切都是同一个内核。锁定方案的另一个问题是您不能导致 GPU 阻塞或上下文切换,因此您只会浪费电源旋转,可能永远浪费,等待资源可用。

    对于传统上使用原子操作的操作,更喜欢使用全局原子操作。例如,如果您想编写一个简单的 malloc() 从预分配的 MTLBuffer 进行子分配,您可以使用全局原子将 MTLBuffer 的偏移量增加每个分配的大小。返回旧的 offset+MTLBuffer 基地址作为分配的开始。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-15
      • 1970-01-01
      • 2011-05-05
      • 1970-01-01
      • 2021-09-14
      • 1970-01-01
      相关资源
      最近更新 更多