【问题标题】:How does [branch] get executed in HLSL?[branch] 如何在 HLSL 中执行?
【发布时间】:2020-07-22 00:59:19
【问题描述】:

[branch] attribute can mark an if statement in HLSL to make it execute only one branch 代替所有分支并丢弃结果,就像使用 [flatten] 时一样。

我的问题是,当分支与经线/波前发散时,这实际上如何工作?据我所知,在这种情况下,所有线程都必须执行 warp 中的任何线程所采用的所有分支(例如使用 [flatten] 时),这是事实的结果,它们都在同一个 SIMD 块中并且必须执行相同的指令。

【问题讨论】:

    标签: multithreading if-statement gpu directx hlsl


    【解决方案1】:

    由于 GeForce 系列 6xx GPU 确实支持分支,但形式有限且性能成本高。 [branch][flatten] 标签只是提示编译器选择一个或另一个如果支持和可能。它基本上取决于硬件和驱动程序,因此不同的硬件或不同的驱动程序版本最终可能会确定与您使用标签指定的不同的执行。

    您可以在网上找到更多信息,例如check this link

    【讨论】:

    • 感谢您的参考。我不知道 MIMD 和类似的东西。我也觉得有点奇怪,人们仍然说着色器中的分支是致命的,尽管它似乎在 8 年前的硬件上得到支持。
    • 它受支持但有限制(仅在某种着色器上 - 仅在某些硬件上 - 仅在某些驱动程序版本上)并且具有性能成本。因此,如果可能的话,最好还是避免它。考虑一下,如果分支不是太复杂,通常编译器在扁平化分支方面做得很好。尽管如此,在某些情况下分支可能更可取(尤其是在计算着色器上)。
    • 比如说,计算着色器中的光线追踪器怎么样?它通常涉及大量具有相当复杂分支的分支。
    猜你喜欢
    • 2020-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多