如何在Metal中的线程组之间进行同步

时间:2015-01-02 13:18:03

标签: ios metal

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

2 个答案:

答案 0 :(得分:2)

我在16位浮点转换中面临类似的问题。

您可以尝试通过从缓冲区中提取原始位来解释CPU侧的值,与atomic_uint的内部格式进行比较,然后尝试使用获取的信息重新设置为您需要的数据类型。确实是一种低级别的方法,但在其他任何事情都不会有效的情况下工作。

答案 1 :(得分:2)

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

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