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