gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 15:50:33 26 4
gpt4 key购买 nike

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

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

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

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

补充

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

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

我真正想问的是,对于一个工作组的调用,我刚才描述的不一致的内存访问是否会发生在共享、缓冲区或图像变量上?换句话说,对于一个工作组的调用,如果我使用 barrier 来确保读取操作发生在写入操作之后,写入的值是否对读取操作可见?

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

最佳答案

工作组大小限制通常比实际执行单元的波前/扭曲大小大很多倍。将调用收集到工作组中的目的是能够让它们共享信息并在它们之间设置执行障碍。

如果一个工作组大于一个调用子组(或者如果由于发散条件执行而导致执行发散),共享内存仍然需要工作。如果波前大小为 32,但您的工作组大小为 128,当调用编号 97 位于不同的波前时,它们如何读取调用 2 写入的数据?

一个实现可以在同一个计算单元上顺序执行它们。执行前 32 次调用,然后执行下一次,依此类推。这会将所有共享内存保存在本地存储中,但是您如何读取另一个调用写入的数据?您需要一个执行屏障,以便实现知道停止执行当前 32 并移动到工作组中的下一个波前。内存访问是不连贯的,因为在没有显式屏障的情况下,您甚至无法知道哪些调用执行了写入。

此类工作组的任何串行执行方式都意味着共享内存必须在不同的计算单元之间共享。这意味着缓存。

关于opengl - 为什么写入计算着色器的共享变量不一致的内存访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72610891/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com