首页 > 解决方案 > 如果一个 GPU 分支需要遍历两个 if 条件分支,是否总是效率低下?

问题描述

我的问题可能会更冗长,但我会尝试通过示例来提问。

在片段着色器中,我的理解是:

...
if(condition)
{
    /* loads of expensive work */
}
else
{
    /* loads of expensive work */
}
...

如果条件对所有片段进行统一评估,它将按照人们可能天真的预期的速度运行。但是,它不会在所有其他场景中表现良好,因为条件的两种情况需要按顺序运行(因为 SIMD 单元内的共享程序计数器?)。

但是,这是否意味着类似:

...
if(condition)
{
    return;
}
else
{
    /* loads of expensive work */
}
...

在最坏的情况下可能只会花费某种上下文切换的代价并且几乎不会影响性能?

我想我问是因为我听说人们倾向于尝试避免使用非均匀条件进行分支以节省性能,但是从性能的角度来看,在第二种情况下它是否完全可以接受(也许还有其他一些“一个分支中的“轻”负载)?

标签: graphicsfragmentgpuglslshader

解决方案


简单的说,

您的视频卡将安排您的着色器在一堆内核上运行。所有这些着色器都必须同步运行。因此,如果其中一个条件为假,它将停止所有核心。


推荐阅读