Vulkan WaW 危险和内存屏障

5

Vulkan规范说明:

只需要执行依赖性即可解决写后读危险,但读后写和写后写危险需要在它们之间包括适当的内存依赖关系。

我认为只需要执行障碍就可以解决写后写危险。

如果我们不打算读取数据,为什么需要内存屏障来解决写后写危险?

1个回答

9

执行依赖关系确保操作的顺序。内存依赖关系确保内存操作的可见性。这两者并不相同。

为了使写后写操作能够正确运行,第二次写入必须在第一次写入之后发生,但您还必须确保第一次写入对执行第二次写入的操作可见。否则,即使第二次写入发生在第一次之后,第二次写入也可能被第一次覆盖。

如果您想要更基于硬件的解释,请考虑以下情况:如果第一次写入使用一个缓存,而第二次写入使用与第一次不同的缓存(GPU有很多缓存),则执行依赖关系不会影响缓存。因此,第二个写入的缓存可以在第一个写入的缓存之前写入其数据,这意味着第一个写入最终会覆盖第二个写入。

内存依赖关系强制将数据从缓存中清除,从而确保第二次写入时没有数据停留在某个缓存中。


1
除了内存副作用之外,还有什么构成执行顺序?换句话说,在不需要具有内存依赖性的情况下,有什么时候重要的是具有特定的执行顺序?或者仅具有内存依赖性是不够的? - listerreg
1
例如,如果您有两个操作,一个读取后跟一个写入。如果先进行读取,则两者之间不需要内存依赖关系;没有任何东西需要对写入操作可见。您需要做的就是确保读取在写入之前发生。问题中规范的引用指定了这一点。 - Nicol Bolas
@listerreg:“或者仅仅有内存依赖关系是不够的?”我不知道你的意思。你不能有一个与执行依赖关系分离的内存依赖关系。可见性需要排序。 - Nicol Bolas
什么是 WaW 操作的具体示例?如果使用相同深度缓冲区的图形管道进行两个连续的绘制调用,这将不会被归类为 WaW 危险性,而是相对于深度缓冲区作为 RaW 危险性正确吗? - j00hi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接