【发布时间】: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