【问题标题】:How to force GLSL branching?如何强制 GLSL 分支?
【发布时间】:2017-01-19 13:26:23
【问题描述】:

我正在开发片段着色器。它有效,但仍需要一些优化。

据我所知,GLSL 中的大部分 case 分支都是扁平化的,所以两个 case 都被执行了。我已经消除了大多数 if-else 条件,但其中有一些必须保持原样,因为这两个分支的执行成本很高。我知道,在 HLSL 中有一个 [branch] 关键字可以解决这个问题。但是GLSL怎么可能解决呢?

我的代码是这样的(条件不统一,它们的结果取决于着色器中的计算):

if( condition ) {
    expensive calculations...
}

if( condition2 ) {
    expensive calculations...
}

if( condition3 ) {
    expensive calculations...
}

...

一个“昂贵的计算”可以修改一个条件所依赖的变量。可能会执行多个计算。

我知道,有一些旧的或移动的 GPU-s,它们根本不支持分支。那样的话,和这个问题无关

【问题讨论】:

  • 您已经为您的案例排除了大多数简单的优化技术。我认为您必须完全重新考虑,这将很棘手。显示您正在执行哪种昂贵的计算可能会有所帮助。
  • 如果我进行光线追踪或光线行进等操作,我无法避免分支
  • 现代 GPGPU 的工作方式要求它们按顺序执行给定 if 语句的所有分支(可能同时导致一组内核空闲)。因此,不幸的是,这是一个无法消除的限制。正如@codetiger 正确指出的那样,这里可能没有简单的解决方案,但您仍然应该尝试找到一个(或近似值)。
  • 如果我写:if( condition ) { ...some code...; return; } ... other calculations ...,是否也会在return语句执行后进行计算?
  • 这取决于。核心通常按组组织,它们共享执行代码,但将它们的操作应用于不同的数据片段。因此,如果只有一个核心需要执行 else 子句,而所有其他课程都在执行“if”子句,那么所有核心都需要等到一个特定的核心完成。 return 语句也是如此。因此,分支可以让一些核心闲置,等待其他核心完成。因此,您不能期望仅通过插入 return 语句来加速。从这个意义上说,GPU 的工作方式与 CPU 完全不同。

标签: opengl opengl-es glsl hlsl glsles


【解决方案1】:

GLSL 没有强制分支(或强制扁平化分支)的机制。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-09
    • 2015-09-10
    • 2012-02-03
    • 1970-01-01
    • 1970-01-01
    • 2014-12-19
    • 2012-07-12
    • 1970-01-01
    相关资源
    最近更新 更多