我正在尝试在DirectX和OpenGL中整理内存屏障功能。我的最终目标是在GLSL中实现HLSL内存屏障功能。我发现DX和GL的文档都相当模糊。 HLSL中有6个同步例程:
GroupMemoryBarrier()
GroupMemoryBarrierWithGroupSync()
DeviceMemoryBarrier()
DeviceMemoryBarrierWithGroupSync()
AllMemoryBarrier()
AllMemoryBarrierWithGroupSync()
似乎我只是真正理解WithGroupSync
结尾,这意味着"阻止组中所有线程的执行,直到所有线程都已到达此调用"。我几乎100%确定这是GLSL中的barrier()
函数。
我不确定的是设备内存,组内存和所有内存的含义。我目前的想法是
我真正不了解的是它如何映射到GLSL同步功能:
groupMemoryBarrier()
。文档说:" groupMemoryBarrier等待完成对计算着色器调用所执行的所有内存访问,相对于在同一工作组中执行其他调用的相同访问,然后返回时没有其他任何影响"。主要问题是:
memoryBarrier()
。文档说:" memoryBarrier等待使用 image 变量或原子计数器导致的所有访问完成,然后返回而没有其他效果。问题是:
memoryBarrierBuffer
和memoryBarrierShared
表示还有其他类型的内存同步)groupMemoryBarrier()
和memoryBarrier()
之间的区别是什么?我只能想象后者会等待所有线程中的所有事务的完成,这会产生巨大的性能影响,因此在HLSL中是不允许的。memoryBarrierBuffer
,memoryBarrierImage
和memoryBarrierAtomicCounter
。文档说:" memoryBarrier *等待由于使用缓冲区/图像/原子计数器而导致的所有访问完成,然后返回而没有其他效果。"问题:
以下是我理解HLSL函数到GLSL的映射:
GroupMemoryBarrier()
= groupMemoryBarrier()
+ memoryBarrierShared()
GroupMemoryBarrierWithGroupSync()
= GroupMemoryBarrier()
+ barrier()
DeviceMemoryBarrier()
= memoryBarrierBuffer()
+ memoryBarrierImage()
+ memoryBarrierAtomicCounter()
DeviceMemoryBarrierWithGroupSync()
= DeviceMemoryBarrier()
+ barrier()
AllMemoryBarrier()
=所有屏障功能AllMemoryBarrierWithGroupSync()
= AllMemoryBarrier()
+ barrier()
我非常感谢帮助解决这个问题。