- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我曾不止一次偶然发现术语“非连贯”和“连贯”内存
tech papers与图形编程有关。我一直在寻找一个简单明了的解释,但发现大多数是this的“硬核”论文。类型。我很高兴收到关于 GPU 架构上实际存在什么相干内存以及如何将其与其他(可能不相干)内存类型进行比较的外行风格的答案。
最佳答案
内存就是内存。但是不同的东西可以访问该内存。 GPU 可以访问内存,CPU 可以访问内存,也许其他硬件位,等等。
如果其他人对该内存所做的更改对读者可见,则该特定事物具有对该内存的“连贯”访问。现在,您可能认为这是愚蠢的。毕竟,如果内存被改变了,怎么可能有人看不到呢?
简单地说,缓存。
事实证明,更换内存是昂贵的。因此,除非绝对必要,否则我们会尽一切可能避免更改内存。当您将 CPU 中的单个字节写入内存中的指针时,CPU 尚未写入该字节。或者至少,不是内存。它将其写入该内存的本地副本,称为“缓存”。
这样做的原因是,一般来说,应用程序不会写入(或读取)单个字节。他们更有可能以小块的形式写入(和读取)大量字节。因此,如果您要执行诸如内存加载或存储之类的昂贵操作,您应该加载或存储一大块内存。因此,您将要对一块内存进行的所有更改存储在缓存中,然后在将来的某个时刻将该缓存块写入实际内存。
但是,如果您有两个单独的设备使用相同的内存,则需要某种方式来确保一个设备所做的写入对其他设备可见。大多数 GPU 无法读取 CPU 缓存。而且大多数 CPU 语言没有语言级别的支持来说“嘿,我写到内存的那些东西?我真的想让你现在把它写到内存中。”所以你通常需要一些东西来确保更改的可见性。
在 Vulkan 中,标记为“HOST_COHERENT”的内存意味着,如果您写入该内存(通过映射指针,因为这是 Vulkan 允许您直接写入内存的唯一方式),您不需要使用特殊功能来使确保 GPU 可以看到这些变化。保证 GPU 对任何更改的可见性。如果该标志在内存中不可用,则必须使用 Vulkan API 来确保要访问的特定数据区域的一致性。
对于相干内存,硬件方面会发生两件事之一。 CPU 对内存的访问没有缓存在任何 CPU 的缓存中,或者 GPU 可以直接访问 CPU 的缓存(可能是因为与 CPU 位于同一个芯片上)。您通常可以看出后者正在发生,因为 Vulkan 的片上 GPU 实现不会费心提供非一致性内存选项。
关于gpgpu - 什么是 GPU 上的相干内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36241009/
我是一名优秀的程序员,十分优秀!