片段着色器使用两个原子计数器。它可能会或不会增加第一个,也可能不会增加第二个(但从来都不是)。然而,在修改计数器之前,它们的当前值总是被读取,然后 - 如果计数器稍后被修改 - 那些先前读取用于某些自定义逻辑的值。所有这些都发生在一个(很可能无法展开的)循环中。片段着色器中的GLSL原子计数器(和分支)
设想一个流程大致是这样的:在一些小unrollable环
- ,说0-20(编译时解析常数)...
- 为AC1和AC2 获取计数器值
- 检查某个值:
- 如果x:在指数AC1,增量AC1
- 在其他设置uimage1D_A纹理像素:在uimage1D_B设置在纹素指数(imgwidth-AC2-1),增量AC2
问题:着色器查询当前计数器值 - 它是否始终获得“最新”值?我在这里丢失了片段着色器的大规模并行性(仅针对当前代和未来的GPU和驱动程序)?
至于分支(如果x) - 我在另一个(readonly restrict uniform
)uimage1D
纹素比作(uniform
)uint
。所以一个操作数绝对是一个统一的标量,但另一个操作数是一个imageLoad().x
,尽管图像是统一的 - 这种分支仍然是“完全并行化”的吗?你可以看到两个分支都是两个完全相同的指令。假设一个“完美优化”的GLSL编译器,这种分支可能引入一个失速?
谢谢你的澄清和警告:) – metaleap 2012-03-18 23:11:22