小编wan*_*gsy的帖子

为什么写入计算着色器的共享变量会导致内存访问不一致?

我搜索并阅读了一些关于不连贯内存访问的wiki ,例如https://en.wikipedia.org/wiki/Memory_coherence、https://www.khronos.org/opengl/wiki/Memory_Model

据我所知,内存访问不一致的主要原因是同一内存地址的多个本地缓存。在高速缓存架构中,处理器通常不直接访问内存,而是访问高速缓存。对于多处理器系统,每个处理器都有自己的缓存,但共享一个内存,这可能会导致同一内存地址的多个副本。因此,即使在另一个进程写入某个内存地址之后,一个处理器也可能会读取该地址的旧数据。

然而,共享变量应该位于缓存中,并且只能由在同一处理器上执行的同一工作组内的调用访问。因此不应存在共享变量的多个版本。即使共享变量的大小超过了缓存的最大大小,部分数据仍会在内存中,共享变量只存在于一个缓存中。为什么对共享变量的访问不一致?

另外,通过工作组内的调用访问一致的图像/缓冲区变量是否不一致?

补充

据我了解,计算着色器中有两种障碍。

  • barrierglsl的函数,用于控制着色器代码的执行,并确保前面的写操作确实发生在后面的读操作之前。
  • 内存屏障用于确保写操作的数据对未来的读操作可见。这些类型的内存屏障是为不连贯的内存访问而设置的。另外,根据我的理解,incoherent memory access这意味着即使读取操作发生在写入操作之后,着色器调用写入的值也不一定对其他调用可见。内存屏障就是用来处理这种情况的。

我真正想问的是,关于一个工作组的调用,incoherent memory access我是否可以描述共享、缓冲区或图像变量发生的情况?换句话说,对于一个工作组的调用,如果我用来barrier确保读操作发生在写操作之后,写入的值对读操作是否可见?

以我的思维方式,在上述情况下,写入的值对于后续的读取操作始终是可见的。因为,一个工作组仅在一个计算单元上执行,因此同一内存地址不存在多个缓存。但我对此并不确定。

opengl graphics glsl

2
推荐指数
1
解决办法
793
查看次数

标签 统计

glsl ×1

graphics ×1

opengl ×1