记忆就是记忆。但是不同的事物可以访问该内存。GPU可以访问内存,CPU可以访问内存,也许还有其他硬件位。
如果其他人对该存储器所做的更改对读者来说是可见的,则特定的事物具有对存储器的“连贯”访问。现在,您可能会认为这是愚蠢的。毕竟,如果内存已经改变了,怎么会有人可能无法看到它?
简而言之,缓存。
事实证明,更改内存非常昂贵。因此,除非绝对必要,否则我们将尽一切可能避免更改内存。当您将一个字节从CPU写入内存中的指针时,CPU尚未将该字节写入。或者至少,不是为了记忆。它将其写入该内存的本地副本,称为“缓存”。
原因是,通常来说,应用程序不写入(或读取)单个字节。它们更有可能以小块形式写入(和读取)大量字节。因此,如果您要执行昂贵的操作,例如加载或存储内存,则应加载或存储大量内存。因此,您将要对内存块进行的所有更改都存储在高速缓存中,然后在将来某个时候将已缓存的块单次写入实际内存中。
但是,如果您有两个使用相同内存的独立设备,则需要某种方式来确保写入一个设备使其他设备可见。大多数GPU无法读取CPU缓存。而且大多数CPU语言都没有语言级别的支持来表示“嘿,我写到内存的东西了吗?我真的是想让您现在将其写到内存中。” 因此,您通常需要一些东西来确保更改的可见性。
在Vulkan中,标记为“ HOST_COHERENT”的内存意味着,如果您通过映射指针写入该内存(因为这是Vulkan允许您直接写入内存的唯一方法),则无需使用特殊功能即可确保GPU可以看到这些更改。保证了GPU对任何更改的可见性。如果该标志在内存上不可用,则必须使用Vulkan API来确保要访问的特定数据区域的一致性。
有了一致的内存,就硬件而言,正在发生两件事之一。CPU对内存的访问未缓存在任何CPU的高速缓存中,或者GPU可以直接访问CPU的高速缓存(可能是由于与CPU处于相同的管芯)。您通常可以说后者正在发生,因为Vulkan的裸机GPU实现不必费心提供非一致性内存选项。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句