小编Zhi*_*hen的帖子

使用imageAtomicCompSwap的GLSL每像素自旋锁

OpenGL红皮书版本9(OpenGL 4.5)示例11.13是Simple Per-Pixel Mutex。它imageAtomicCompSwapdo {} while()循环中使用每个像素的锁定,以防止同时访问对应于同一像素坐标的像素着色器调用之间的共享资源。

layout (binding = 0, r32ui) uniform volatile coherent uimage2D lock_image;

void main(void)
{
    ivec2 pos = ivec2(gl_FragCoord.xy);

    // spinlock - acquire
    uint lock_available;
    do {
        lock_available = imageAtomicCompSwap(lock_image, pos, 0, 1);
    } while (lock_available != 0);

    // do some operations protected by the lock
    do_something();

    // spinlock - release
    imageStore(lock_image, pos, uvec4(0));
}
Run Code Online (Sandbox Code Playgroud)

此示例在Nvidia和AMD GPU上均产生APPCRASH。我知道在这两个平台上PS的​​职业无法彼此独立地进行-线程的子组以锁步的方式执行,共享控制流(Nvidia术语中的32个线程的“扭曲”)。因此可能导致死锁。

但是,OpenGL规范在任何地方都没有提到“以锁步执行的线程”。它仅提及“未定义相同着色器类型的调用的相对顺序”。。如本例所示,为什么我们不能使用原子操作imageAtomicCompSwap来确保不同PS调用之间的互斥访问?这是否意味着Nvidia和AMD GPU不符合OpenGL规范?

opengl mutex glsl spinlock

4
推荐指数
2
解决办法
249
查看次数

在32位保护模式/ MSVC内联asm中获取FS:[0]的线性地址

我在Visual C++内联汇编中使用了这个指令

lea eax, FS:[0]
Run Code Online (Sandbox Code Playgroud)

为什么eax得到零?

我如何获得线性地址FS:[0]

x86 assembly inline-assembly visual-c++

3
推荐指数
1
解决办法
338
查看次数

标签 统计

assembly ×1

glsl ×1

inline-assembly ×1

mutex ×1

opengl ×1

spinlock ×1

visual-c++ ×1

x86 ×1