Multithreading [branch]是如何在HLSL中执行的?

Multithreading [branch]是如何在HLSL中执行的?,multithreading,if-statement,gpu,directx,hlsl,Multithreading,If Statement,Gpu,Directx,Hlsl,而不是所有分支并丢弃结果,就像使用[flatten]时一样 我的问题是,当一个分支与一个扭曲/波前分离时,这实际上是如何工作的?据我所知,在这种情况下,所有线程都必须执行warp中任何线程执行的所有分支(如使用[flant]),这是因为它们都在同一个SIMD块中,并且必须执行相同的指令。因为GeForce series 6xx GPU实际上支持分支,虽然形式有限,但性能成本高。[branch]和[flatten]标记只是提示编译器在支持和可能的情况下选择其中一个。它基本上取决于硬件和驱动程序,因

而不是所有分支并丢弃结果,就像使用
[flatten]
时一样


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

因为GeForce series 6xx GPU实际上支持分支,虽然形式有限,但性能成本高。
[branch]
[flatten]
标记只是提示编译器在支持和可能的情况下选择其中一个。它基本上取决于硬件和驱动程序,因此不同的硬件或不同的驱动程序版本最终可能会决定与您使用标记指定的不同的执行


例如,您可以在网上找到更多信息,因为GeForce系列6xx GPU确实支持分支,但形式有限,性能成本高。
[branch]
[flatten]
标记只是提示编译器在支持和可能的情况下选择其中一个。它基本上取决于硬件和驱动程序,因此不同的硬件或不同的驱动程序版本最终可能会决定与您使用标记指定的不同的执行


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

谢谢您的参考。我不知道MIMD和类似的东西。人们仍然说着色器中的分支是致命的,这对我来说似乎有点奇怪,尽管它似乎在8年前的硬件上得到了支持。它得到了支持,但有限制(仅在某些类型的着色器上-仅在某些硬件上-仅在某些驱动程序版本上)和性能成本。因此,如果可能的话,最好还是避免。考虑到如果分支不是太复杂,编译器通常会很好地使分支变平。不过,在某些情况下,分支可能更可取(尤其是在计算着色器上)。那么,比方说,计算着色器中的光线跟踪器呢?它通常涉及很多分支,分支相当复杂。谢谢您的参考。我不知道MIMD和类似的东西。人们仍然说着色器中的分支是致命的,这对我来说似乎有点奇怪,尽管它似乎在8年前的硬件上得到了支持。它得到了支持,但有限制(仅在某些类型的着色器上-仅在某些硬件上-仅在某些驱动程序版本上)和性能成本。因此,如果可能的话,最好还是避免。考虑到如果分支不是太复杂,编译器通常会很好地使分支变平。不过,在某些情况下,分支可能更可取(尤其是在计算着色器上)。那么,比方说,计算着色器中的光线跟踪器呢?它通常涉及很多分支,分支相当复杂。